/* USERCODE.C: A Nice Idea Killed By A Stupid CP/M MisFeature..... Idea: Extend the filename syntax for user with ALL file I/O to allow a user area prefix of the form "n/" on all filenames. Written by Leor Zolman, 12/81 **************************************************************** ** FOR CP/M 2.x SYSTEMS ONLY!!! ** **************************************************************** Generalized replacements for "open", "creat" and "unlink" library functions, allowing a user area prefix to be attached to all filenames (except those used as arguments to the "rename" function). The new filename syntax becomes: [whitespace][nn/][d:][filename.ext] E.g, to reference file "foo.bar" on the currently logged disk in user area 7, you'd use: 7/foo.bar To reference foo.bar in user area 9 on disk b:, you'd say: 9/b:foo.bar and so on. The user area prefix must always come first if both it and a disk designator need to be specified. NOTE: THIS WHOLE THING DOESN'T REALLY WORK FOR WRITING FILES INTO USER AREAS DIFFERENT FROM THE CURRENTLY ACTIVE USER AREA, BECAUSE GODDAMN CP/M DOESN'T LET YOU CLOSE A FILE THAT WAS OPENED IN A USER AREA DIFFERENT FROM THE CURRENTLY ACTIVE ONE. DAMN!!!!!!!!!!!!!!!!!!! To install this library, follow these steps: 1) compile this file (USERCODE.C) 2) invoke CLIB and give it the following commands: *o 0 usercode *o 1 deff2 *e 1 open *a 0 open_old *e 1 creat *a 0 creat_old *e 1 unlink *a 0 unlink_old *c 0 *q 3) Link the programs you wish to have recognize the user code on filenames by including "-f usercode" on the CLINK command line. */ int open_old(); int creat_old(); int unlink_old(); open(filename, mode) { return usercode(&open_old,filename,mode); } creat(filename) { return usercode(&creat_old,filename); } unlink(filename) { return usercode(&unlink_old,filename); } int usercode(funcptr, filename, extra_arg) int (*funcptr)(); char *filename; int extra_arg; { int i, cur_user, new_user; char *savnam; while (isspace(*filename)) filename++; /* skip over whitespace */ savnam = filename; /* save in case of false start */ if (!isdigit(*filename)) return (*funcptr)(filename,extra_arg); cur_user = bdos(32, 0xff); /* save current user number */ new_user = atoi(filename); /* get new user number */ while (isdigit(*++filename)) /* skip over user number text */ ; if (*filename != '/' || new_user > 31) return (*funcptr)(savnam,extra_arg); bdos(32,new_user); i = (*funcptr)(filename + 1,extra_arg); bdos(32,cur_user); return i; }  .