|
DataMuseum.dkPresents historical artifacts from the history of: CP/M |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about CP/M Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - download
Length: 19968 (0x4e00) Types: TextFile Names: »STDLIB.C«
└─⟦4dd5d59b6⟧ Bits:30003303 Mix C version 2.1 og debugger til RC703 └─ ⟦this⟧ »STDLIB.C« └─⟦b6190e06c⟧ Bits:30003304 Mix C version 2.1 til RC703 └─⟦b6190e06c⟧ Bits:30005327 Mix C version 2.1 til RC703 └─ ⟦this⟧ »STDLIB.C«
#include "stdio" #include "stdlib.h" #define MAXARGS 20 #define FALSE 0 #define TRUE 1 _initio(stdfiles) int stdfiles; /*stdfiles = 1 says open standard files*/ æ extern char *_flagptr; extern char *_procptr; extern int _seed; char indeviceÆÅ = "CON:"; char outdeviceÆÅ = "CON:"; char errdeviceÆÅ = "CON:"; char *STDIN, *STDOUT, *STDERR; char cmdbufferÆ128Å; char *cmdline; char *argvÆMAXARGSÅ; /*pointers to command line arguments*/ char nullchar = NULL; char modeÆÅ = "w"; int argc; /*number of command line arguments*/ int i; int count; int fopen(); int main(); int exit(); int movmem(); int filetrap(); int heaptrap(); int mathtrap(); char *_getflag(); char *_getproc(); _flagptr = _getflag(); _procptr = _getproc(); _seed = 13849; heaptrap(0); filetrap(0); mathtrap(0); STDIN = indevice; STDOUT = outdevice; STDERR = errdevice; for (i=0; i < MAXFILES; i++) _iobÆiÅ = NULL; movmem(0x80, cmdbuffer, 128); count = cmdbufferÆ0Å; cmdline = &cmdbufferÆ1Å; argvÆ0Å = &nullchar; argc = 1; while (count > 0 && argc < MAXARGS) æ while (*cmdline == ' ' && count) æ count--; cmdline++; å if (count) æ if (*cmdline == '<') æ STDIN = ++cmdline; count--; å else if (*cmdline == '>') æ cmdline++; count--; if (*cmdline == '>') æ cmdline++; count--; modeÆ0Å = 'a'; å STDOUT = cmdline; å else æ argvÆargcÅ = cmdline; argc++; å while (*cmdline != ' ' && count) æ cmdline++; count--; å *cmdline++ = 'Ø0'; count--; å å if (stdfiles == 1) æ fopen(STDIN,"r"); fopen(STDOUT,mode); fopen(STDERR,"w"); å main(argc,argv); exit(0); å abs(i) int i; æ if (i < 0) return -i; else return i; å atoi(s) /* decode an integer */ char *s; /* pointer to integer string */ æ int sflag = 1, value = 0; while (*s == ' ' øø *s == 'Øt' øø *s == 'Øn') ++s; if (*s == '+' øø *s == '-') if (*s++ == '-') sflag = -1; while (*s > 47 && *s < 58) value = 10 * value + (*s++ - 48); return value * sflag; å long atol(s) /* decode a long integer */ char *s; /* pointer to integer string */ æ int sflag = 1; long value = 0, base = 10; while (*s == 32 øø *s == 9 øø *s == 13) ++s; if (*s == '+' øø *s == '-') if (*s++ == '-') sflag = -1; while (*s > 47 && *s < 58) value = base * value + (*s++ - 48); return value * sflag; å itoa(n, s) int n; char *s; æ char bufferÆ7Å, flag = 'Ø0', *ptr; bufferÆ6Å = 'Ø0'; ptr = &bufferÆ5Å; if (n < 0) æ if (n == -32768) æ strcpy(s, "-32768"); return; å ++flag; n = -n; å do æ *(ptr--) = n % 10 + 48; å while ((n /= 10) > 0); if (flag) *ptr = '-'; else ptr++; strcpy(s, ptr); return; å ltoa(n, s) long n; char *s; æ char bufferÆ12Å, flag, *ptr; flag = 'Ø0'; bufferÆ11Å = 'Ø0'; ptr = &bufferÆ10Å; if (n < 0) æ if (n == -2147483648) æ strcpy(s, "-2147483648"); return; å ++flag; n = -n; å do æ *(ptr--) = n % 10 + 48; å while ((n /= 10) > 0); if (flag) *ptr = '-'; else ptr++; strcpy(s, ptr); return; å _atoi(ptr) /* decode an integer */ char **ptr; /* pointer to addr of 1st digit */ æ int n = 0; while (*(*ptr) > 47 && *(*ptr) < 58) n = 10 * n + *(*ptr)++ - 48; return n; å rand() æ extern long _seed; _seed = _seed * 15790321; return (int) (_seed & 0x7FFF); å ungetc(c,fp) int c; FILE *fp; æ if (c != EOF) æ --fp->fileÆ12Å; *((char *)(*(int *)&fp->fileÆ10Å)+fp->fileÆ12Å) = c; å å execl(filename, args) char *filename, *args; æ return _execlv(filename, &args, -1); å execv(filename, args) char *filename, **args; æ return _execlv(filename, args, 1); å chain(filename) char filenameÆÅ; æ char cmdlinÆ129Å; char *argÆ65Å; int i = 0, c = 0; strncpy(cmdlin, filename, 128); cmdlinÆ128Å = 0; while (cmdlinÆiÅ) æ while (cmdlinÆiÅ == ' ') i++; if (cmdlinÆiÅ) argÆc++Å = &cmdlinÆiÅ; while (cmdlinÆiÅ != ' ' && cmdlinÆiÅ != 0) i++; if (cmdlinÆiÅ) cmdlinÆi++Å = 0; å argÆcÅ = NULL; return _execlv(argÆ0Å, arg, 1); å _execlv(filename, argptr, increment) char *filename, **argptr; int increment; æ char *sptr; char c, nameÆ64Å; char cmdlinÆ128Å; FILE *fp, *fopen(); int n = 0, extension = 0; while ((c = *filename++) && n < 63) æ nameÆn++Å = c; if (c == '.') ++extension; å if (!extension && n < 61) strcpy(&nameÆnÅ, ".COM"); else nameÆnÅ = 'Ø0'; fp = fopen(name, "r"); if (fp != NULL) æ cmdlinÆ0Å = 'Ø0'; n = 1; if (*(argptr)) argptr = argptr + increment; while (sptr = *(argptr)) æ argptr = argptr + increment; while ((c = *sptr++) && n < 126) cmdlinÆn++Å = c; cmdlinÆ0Å = n - 1; cmdlinÆn++Å = ' '; å cmdlinÆnÅ = 'Ør'; _chain(fp, cmdlin); å else return -1; å FILE *fdopen(fd, type) int fd; char *type; æ FILE *fp; int c; fp = _iobÆfdÅ; if (fp != NULL) æ c = tolower(*type); if ((c == 'w') øø (c == 'a')) æ if (fp->fileÆ16Å) return fp; else return NULL; å if ((c == 'r') && (!fp->fileÆ16Å)) return fp; else return NULL; å else return NULL; å FILE *freopen(filename, type, old_fp) char *filename, *type; FILE *old_fp; æ FILE *fopen(); if (fclose(old_fp)) return NULL; else return fopen(filename, type); å FILE *fopen(name,modes) char *name, *modes; æ int fd, mode = 0; void _creat(), _openr(), _opena(), (*funcptr)(); FILE *fp; if (*modes == 'W' øø *modes == 'w') funcptr = _creat; else if (*modes == 'A' øø *modes == 'a') funcptr = _opena; else funcptr = _openr; if (*(++modes) == 'b' øø *modes == 'B') mode = 0x8000; if ((fd = _open(name, funcptr, mode)) == -1) return NULL; else return _iobÆfdÅ; å creat(name, mode) char *name; int mode; æ int _creat(); return _open(name, _creat, mode); å open(name, mode) char *name; int mode; æ void _openr(), _openw(), _openrw(), (*funcptr)(); int modemask; modemask = mode & 0x7FFF; if (modemask == 0) funcptr = _openr; else if (modemask == 1) funcptr = _openw; else funcptr = _openrw; return _open(name, funcptr, mode); å _open(name, funcptr, mode) char nameÆÅ; void (*funcptr)(); int mode; æ extern int errno; int fd; int len; char c,idÆ8Å; FILE *fp; void _setname(); fd = 0; while (fd < MAXFILES && _iobÆfdÅ != NULL) fd++; if (fd < MAXFILES) æ idÆ0Å = 'F'; for (len=0; (c = nameÆlenÅ) != 'Ø0'; len++) if (len < 7) idÆlen+1Å = c; _iobÆfdÅ = fp = calloc(1, sizeof(FILE)); if (fp) æ fp->fd = fd; _setname(fp, name, len, id); if (!(fp->fileÆ18Å)) æ (*funcptr)(mode, fp, id); if (fp->fileÆ17Å != 'Ø0') æ if (mode < 0) fp->fileÆ23Å = 'Ø2'; return fd; å else æ _iobÆfdÅ = NULL; free(fp); return -1; å å else æ errno = fp->fileÆ18Å; return -1; å å else return -1; å else return -1; å close(fd) int fd; æ return fclose(_iobÆfdÅ); å fclose(fp) FILE *fp; æ void _close(); _close(fp); if (fp->fileÆ17Å) return -1; else æ _iobÆfp->fdÅ = NULL; free(fp); return 0; å å exit(status) int status; æ int i; int _exit(); void _close(); i = 0; while (i < MAXFILES) æ if (_iobÆiÅ != NULL) _close(_iobÆiÅ->file); i++; å _exit(status); å isalpha(c) /* returns c is alphabetic */ int c; /* else returns 0 */ æ if (c >= 'a' && c <= 'z' øø c >= 'A' && c <= 'Z') return 1; else return 0; å isdigit(c) int c; æ if (c >= '0' && c <= '9') return 1; else return 0; å isspace(c) int c; æ if (c == ' ' øø c == 'Øt' øø c == 'Øn') return 1; else return 0; å islower(c) int c; æ if (c >= 'a' && c <= 'z') return 1; else return 0; å isupper(c) int c; æ if (c >= 'A' && c <= 'Z') return 1; else return 0; å isalnum(c) int c; æ if ((c >= 48 && c <= 57) øø (c >= 65 && c <= 90) øø (c >= 97 && c <= 122)) return 1; else return 0; å isascii(c) int c; æ if (c < 128) return 1; else return 0; å iscntrl(c) int c; æ if ((c < 32) øø (c == 127)) return 1; else return 0; å isprint(c) int c; æ if ((c > 31) && (c < 127)) return 1; else return 0; å ispunct(c) int c; æ if ((c > 31 && c < 48) øø (c > 57 && c < 65) øø (c > 90 && c < 97) øø (c >122 && c < 127)) return 1; else return 0; å toupper(c) int c; æ if (c >= 'a' && c <= 'z') c -= 32; return c; å tolower(c) int c; æ if (c >= 'A' && c <= 'Z') c += 32; return c; å char *index(s, c) char *s; int c; æ while (*s != c && *s != 0) s++; if (*s) return s; else return NULL; å char *rindex(s, c) char *s; int c; æ int len; len = strlen(s); if (len) æ s = s + len - 1; while (*s != c && len) æ s--; len--; å if (len) return s; å return NULL; å char *strsave(s) char *s; æ char *ptr; char *calloc(); int len; if (ptr = malloc(len = strlen(s)+1)) movmem(s, ptr, len); return(ptr); å strcpy(dest, source) char *dest; char *source; æ movmem(source, dest, strlen(source)+1); å strcmp(first, second) char *first; char *second; æ while (*first == *second) æ if (*first) æ first++; second++; å else return 0; å return *first - *second; å strcat(first, second) char *first; char *second; æ movmem(second, first + strlen(first), strlen(second)+1); å strncpy(dest, source, n) char *dest; char *source; int n; æ int len; movmem(source, dest, (len = strlen(source)+1) < n ? len : n); å strncmp(first, second, n) char *first; char *second; int n; æ while ((n--) && (*first == *second)) æ if (*first) æ if (n) æ first++; second++; å å else return 0; å return *first - *second; å strncat(first, second, n) char *first; char *second; int n; æ int len; movmem(second, first + strlen(first), ((len = strlen(second)+1) < n ? len : n)); å perror(s) char *s; æ extern int errno; extern int sys_nerr; extern char *sys_errlistÆÅ; extern char *int_errlistÆÅ; fputs(s, stderr); putc(':', stderr); if (errno <= sys_nerr) fputs(sys_errlistÆerrnoÅ, stderr); else if (errno > 0x80 && errno < 0x97) fputs(int_errlistÆerrno - 0x81Å, stderr); else fputs("Error Cause Unknown", stderr); putc('Øn', stderr); å char *gets(s) /* reads one line from stdin */ char *s; /* into string s */ /* newline replaced by 'Ø0' */ æ int _fgets(); char c; if (_fgets(stdin, s, &c, 'Øn', 32767) > 0 øø c == 'Øn') return s; else return NULL; å char *fgets(s, n, fp) /* read a line from fp */ char *s; /* into s */ int n; /* maximum characters */ FILE *fp; /* is n-1 */ æ int _fgets(); int count; char c; if (n > 1) æ count = _fgets(fp, s, &c, 'Øn', n); if (c == 'Øn') æ *(s+count++) = c; *(s+count) = NULL; å else if (count < 1) return NULL; å else *s = NULL; return s; å char *puts(s) /* write s to stdout */ char *s; æ int _write(); int strlen(); _write(stdout, s, strlen(s)); if (putc('Øn', stdout) != EOF) return s; else return EOF; å char *fputs(s, fp) /* write s to fp */ char *s; FILE *fp; æ int _write(); int strlen(); if (_write(fp, s, strlen(s)) < 0) return EOF; else return s; å STRING *stods(s) /* convert string to dynamic string */ char *s; /* s is a normal C string */ æ int length; STRING *ptr; STRING *calloc(); int strlen(); /* get length of string */ length = strlen(s); ptr = malloc(sizeof(int) + length); if (ptr != NULL) æ ptr->length = length; movmem(s, ptr->string, length); å return ptr; å dstos(ptr,s) /* convert dynamic string into normal C string */ STRING *ptr; /* pointer to dynamic string */ char *s; /* normal string */ æ movmem(ptr->string, s, ptr->length); *(s + ptr->length) = 'Ø0'; å clearerr(fp) FILE *fp; æ fp->fileÆ18Å = 'Ø0'; å ferror(fp) FILE *fp; æ return fp->fileÆ18Å; å fflush(fp) FILE *fp; æ long fseek(); if (fseek(fp, 0L, 1) == -1) return -1; else return 0; å fileno(fp) FILE *fp; æ return fp->fd; å double hypot(x, y) double x,y; æ double sqrt(); return (sqrt(x*x + y*y)); å double log10(x) double x; æ double log(); return log(x) / 2.302585093; å char *realloc(oldptr, newsize) char *oldptr; int newsize; æ char *newptr, *malloc(); if (newptr = malloc(newsize)) æ movmem(oldptr, newptr, newsize); free(oldptr); return newptr; å else return NULL; å rewind(fp) FILE *fp; æ return fseek(fp, 0L, 0); å ungetch(c) int c; æ extern char _ungetch; return _ungetch ? EOF : (_ungetch = c); å setbufsiz(size) int size; æ extern char *_flagptr; int blocks, *sizeptr; blocks = (size/128) <= 0 ? 1 : (size/128); *(_flagptr + 8) = blocks; sizeptr = _flagptr + 9; *sizeptr = blocks * 128; å setbuf(fp, bufptr) FILE *fp; char *bufptr; æ char **oldbufptr, **oldbuforg; if (fp) æ if (bufptr) æ oldbuforg = &(fp->fileÆ21Å); oldbufptr = &(fp->fileÆ10Å); free(*oldbuforg); *oldbuforg = *oldbufptr = bufptr; å else fp->fileÆ14Å = 'Ø100'; å å conbuf(flag) int flag; æ return _setflag(flag, 42); å mathtrap(flag) int flag; æ return _setflag(flag, 43); å exitmsg() æ _setflag(0, 3); å _setflag(flag, offset) int flag, offset; æ extern char *_flagptr; char oldvalue; oldvalue = *(_flagptr + offset); *(_flagptr + offset) = flag; return oldvalue; å filetrap(flag) int flag; æ return _settrap(flag, 62); å heaptrap(flag) int flag; æ return _settrap(flag, 63); å _settrap(flag, offset) int flag, offset; æ extern char *_procptr; char oldflag; oldflag = *(_procptr + offset); *(_procptr + offset) = flag; return oldflag; å iofilter(linefeed, ctrlz) int linefeed, ctrlz; æ extern char *_flagptr; *(_flagptr + 4) = linefeed; *(_flagptr + 5) = ctrlz; å /******************* CPM Functions ********************/ getch() æ extern char _ungetch; char ch; if (ch = _ungetch) æ _ungetch = 'Ø0'; return ch; å else æ while (!(ch = bdos(0x06, 0xFF))); return ch; å å putch(c) int c; æ bdos(0x06, c); å getkey() æ int a; if (a = bdos(0x06, 0xFF)) return a; else return EOF; å keypress() æ return bdos(0x0B, 0); å chmod(name, mode) char *name; int mode; æ char fcbÆ36Å; getfcb(fcb, name); if (mode & 0x01) fcbÆ9Å = fcbÆ9Å ø 0x80; else fcbÆ9Å = fcbÆ9Å & 0x7F; if (mode & 0x04) fcbÆ10Å = fcbÆ10Å ø 0x80; else fcbÆ10Å = fcbÆ10Å & 0x7F; return bdos(0x1E, fcb); å unlink(name) char *name; æ char fcbÆ36Å; getfcb(fcb, name); if (bdos(0x13, fcb) != 0xFF) return 0; else return -1; å rename(oldname, newname) char *oldname, *newname; æ char dma_bufÆ128Å, fcbÆ42Å; bdos(0x1A, dma_buf); getfcb(fcb, oldname); getfcb(&fcbÆ16Å, newname); if ((bdos(0x11, &fcbÆ16Å) == 0xFF) && (bdos(0x17, fcb) != 0xFF)) return 0; else return EOF; å /******************* External Variables ********************/ FILE *_iobÆMAXFILESÅ; char _ungetch = 'Ø0'; char *_flagptr; char *_procptr; long _seed; int sys_nerr = 6; char *sys_errlistÆÅ = æ"No Errors", "Read Unallocated Record", "Disk Full", "Can't Find FCB", "Read Unallocated Extent", "Directory Full", "Address too Large" å; char *int_errlistÆÅ = æ"Out of Stack", "Out of Heap", "Damaged Stack or Heap", "Damaged Stack or Heap", "Divide by Zero", "Invalid Instruction", "Damaged Stack or Heap", "Damaged Stack or Heap", "I/O Error", "Error Cause Unknown", "Attempt to Write Input", "File Not Open", "Attempt to Read Output", "No Memory for File Buffer", "Error Cause Unknown", "Damaged Stack or Heap", "Bad Digit in Number", "Damaged Stack or Heap", "Arithmetic Overflow", "Error Cause Unknown", "Arithmetic Underflow", "Log of Negative Number", "Sqrt of Negative Number" å; «eof»