home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
cpm
/
bdsc
/
bdsc-3
/
usercode.cq
/
USERCODE.C
Wrap
Text File
|
1985-02-09
|
3KB
|
100 lines
/*
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;
}