BDS C Standard Library Summary v1.46 Edition -- March, 1982 Leor Zolman BD Software 33 Lothrop st. Brighton, Massachussetts 02135 This document contains an alphabetic summary of ALL general-purpose utiliy functions included in the BDS C package spread among several different source files. Note that there are quite a few more functions listed here than than apppear in the BDS C User's Guide; some functions were intentionally omitted from the User's Guide for portability reasons, and many others have come into existence since the last revision of the User's Guide. The summary is organized by columns. The first column shows the type of the result returned by the function. The second column shows the calling syntax and parameter types (if not int). The next column shows a code naming the source file in which the function may be found; the codes are as follows: C1 for STDLIB1.C C2 for STDLIB2.C D2 for DEFF2.CSM D2A for DEFF2A.CSM FLT for FLOAT.C DIO for DIO.C The next column tells the page number in the BDS C User's Guide where the function is documented, if the function appears in the User's Guide at all. For any function that isn't documented in the User's Guide, there is probably documentation available in the source listing for that function (the source location is given in the preceding column.) The final column contains references to a set of footnotes following the function list. If a function has an entry in the NOTE column, the corresponding footnote (or notes) should be examined for additional information about the function. TYPE FUNCTION FILE PG NOTES ---- -------- ---- -- ----- int abs(a,b) int a,b; C1 32 char * alloc(nbytes) unsigned nbytes; C1 37 14 char * atof(op1,s) char op1[5], *s; FLT 1 int atoi(str) char *str; C1 44 int bdos(c,de) D2 30 2 char bios(n,c) D2 30 int call(addr,a,h,b,d) unsigned addr; D2 32 char calla(addr,a,h,b,d) unsigned addr; D2 32 int close(fd) D2 46 clrplot() D2A 54 char * codend() D2 36 int creat(filename) char *filename; D2 46 char csw() D2 30 dioflush() DIO dioinit(&argc,argv) int *argc; char **argv; DIO BDS C Library Summary, v1.46 1 char * endext() D2 36 int exec(filename) char *filename; D2 34 3 int execl(filename,arg1, arg2, ..., NULL) char *filename; D2 35 3 int execv(filename,argvector) char *filename, **argvector; D2 35 3,16 exit(n) D2 30 char * externs() D2 36 fabort(fd) D2 47 17 char * fcbaddr(fd) D2 53 int fclose(iobuf) FILE *iobuf; C1 51 int fcreat(filename, iobuf) char *filename; FILE *iobuf; C1 50 int fflush(iobuf) FILE *iobuf; C1 51 7 int fgets(str,iobuf) char *str; FILE *iobuf; C2 52 6,11 int fopen(filename,iobuf) char *filename; FILE *iobuf; C1 48 char * fpadd(res,op1,op2) char res[5], op1[5], op2[5]; FLT 1 int fpcomp(op1, op2) char op1[5], op2[5]; FLT char * fpdiv(res,op1,op2) char res[5],op1[5],op2[5]; FLT 1 char * fpmult(res,op1,op2) char res[5],op1[5],op2[5]; FLT 1 int fprintf(format, arg1, arg2, ...) char *format; C2 51 4,9 char * fpsub(res,op1,op2) char res[5],op1[5],op2[5]; FLT 1 int fputs(str,iobuf) char *str; FILE *iobuf; C2 53 6,12 free(allocptr) unsigned allocptr; C1 37 14 int fscanf(iob,fmt,&arg1,&arg2,...) FILE *iob; char *fmt; C2 52 4,10 char * ftoa(s1,op1) char *s1; char op1[5]; FLT int getc(iobuf) FILE *iobuf; C1 49 8 int getchar() D2 38 20 int getline(str,maxlen) char *str; D2A 18 char * gets(str) char *str; D2 40 5 int getval(strptr) char **strptr; C1 45 int getw(iobuf) FILE *iobuf; C1 50 int index(str,substr) char *str, *substr; D2A 18 initb(array,string) char array[], *string; C1 44 initw(array,string) int array[]; char *string; C1 44 char inp(port) D2 31 int isalpha(c) char c; C1 41 int isdigit(c) char c; C1 42 int islower(c) char c; C1 42 int isspace(c) char c; C1 42 int isupper(c) char c; C1 41 char * itoa(str, n) char *str; FLT char * itof(op1, n) char op1[5]; FLT 1 int kbhit() D2 39 line(c,x1,y1,x2,y2) char c; D2A 54 int longjmp(jbuf) char jbuf[JBUFSIZE]; D2A int max(n1,n2) C1 32 int min(n1,n2) C1 32 movmem(source,dest,count) char *source, *dest; D2 34 int nrand(n [,prompt] or [,n1,n2,n3]) char * prompt; D2 33 int open(filename,mode) char *filename; int mode; D2 46 outp(port,val) char port, val; D2 31 pause() D2 31 char peek(port) char port; D2 31 plot(x,y,c) char c; D2A 54 char poke(addr, val) unsigned addr; char val; D2 31 printf(format, arg1, arg2, ...) char *format; C2 40 4,9 int putc(c,iobuf) char c; FILE *iobuf; C1 50 putch(c) char c; D2 39 putchar(c) char c; D2 39 20 puts(str) char *str; C2 40 putw(w,iobuf) int w; FILE *iobuf; C1 51 qsort(base,nel,width,cmp) char *base; int (*cmp)(); C1 34 int rand() D2 33 BDS C Library Summary, v1.46 2 unsigned rcfsiz(fd) D2A int read(fd, buffer, nsecs) char *buffer; D2 47 int rename(oldname, newname) char *oldname, *newname; D2 46 int rread(fd, buffer, nsecs) char *buffer; D2A 15 int rseek(fd, offset, origin) D2A 15 int rsrec(fd) D2A 15 rsvstk(n) D2 38 int rtell(fd) D2A 15 int rwrite(fd, buffer, nsecs) char *buffer; D2A 15 char * sbrk(nbytes) D2 37 int scanf(format, &arg1, &arg2, ...) char *format; C2 42 4,10 int seek(fd, offset, origin) D2 setfcb(fcbaddr, filename) char *filename; D2 53 int setjmp(jbuf) char jbuf[JBUFSIZE]; D2A setmem(addr, count, byte) char *addr; char byte; D2 33 setplot(base,xsize,ysize) D2A 53 sleep(ntenths) D2 31 sprintf(str,format,arg1,arg2,...) char *str, *format; C2 42 4,9 srand(n) D2 32 srand1(str) char *str; D2 32 int sscanf(str,format,&arg1,&arg2,...) char *str, *format; C2 42 10 strcat(s1, s2) char *s1, *s2; C1 43 int strcmp(s1, s2) char *s1, *s2; C1 43 strcpy(s1, s2) char *s1, *s2; C1 43 int strlen(str) char *str; C1 44 swapin(filename,addr) char *filename; unsigned addr; C2 36 int tell(fd) D2 48 char tolower(c) char c; C1 42 char * topofmem() D2 36 19 char toupper(c) char c; C1 42 txtplot(string,x,y,ropt) char *string; D2A 54 ungetc(c,iobuf) char c; FILE *iobuf; C1 50 ungetch(c) char c; D2 39 unlink(filename) char *filename; D2 46 int write(fd, buffer, nsects) char *buffer; D2 47 NOTES: 1. This floating point function returns a pointer to a 5-byte floating point object, represented in a character array of length 5. 2. The "bdos" function returns HL equal to the value left there by the BDOS itself. Under standard CP/M, 8-bit values are returned in L with H cleared, and 16-bit values are returned in HL. Other "CP/M-like" systems do not always follow this convention, though, and the "bdos" function may take rewriting in order to work with certain system calls under systems such as "SDOS". 3. Unless an error occurs, this function should never return at all. 4. Note that all the upper-level formatted I/O functions ("printf", "fprintf", "scanf", and "fscanf") now use "_spr" and "_scn" for doing conversions. While this leads to very modularized source code, it also means that calls to "scanf" and "fscanf" must process ALL the information on a line of text if the information is not to be lost; if the format string runs out and there is still text left in the line being processed, the text will be lost (i.e., the NEXT scanf or fscanf call will NOT find it.) BDS C Library Summary, v1.46 3 An alternate version of "_spr" (the low-level output formatting function) is given in the file FLOAT.C for use with floating point numbers; see FLOAT.C for details. Since "_spr" is used by "printf", this really amounts to an alternate version of "printf." Also note that temporary work space is declared within each of the high-level functions as a one-dimensional character array. The length limit on this array is presently set to 132 by the define MAXLINE statement in BDSCIO.H; if you intend to create longer lines through printf, fprintf, scanf, or fscanf calls, be SURE to raise this limit by changing the define statement. 5. Note that the "gets" function (which simply buffers up a line of console input at a given buffer location) terminates the line with a null byte ('\0') WITHOUT any CR or LF. 6. The conventional CP/M text format calls for each line in a file to be terminated by a carriage-return/linefeed combination. In the world of C programming, though, we like to just use a single linefeed (known as a "newline") to terminate lines. AND SO, the functions which deal with reading and writing text lines from disk files to memory and vice-versa ("fgets", "fputs") take special pains to convert CR-LF combinations into single '\n' characters when reading from disk ("fgets"), and convert '\n' characters to CR-LF combinations when writing TO disk ("fputs"). This allows the C programmer to do things in style, dealing only with a single line terminator while the text is in memory, while maintaining compat- ibility with the CP/M text format for disk files (so that, for example, a text file can be "type"d under the CCP.) 7. Remember to put out a CPMEOF (control-Z or 0x1a) byte at the end of TEXT files being written out to disk. 8. Watch out when reading in text files using "getc". While a text file is USUALLY terminated with a control-Z, it MAY NOT BE if the file ends on an even sector boundary (although respectable editors will now usually make sure the control-Z is always there.) This means that there are two possible return values from "getc" which can signal an End-of file: CPMEOF (0x1a) or ERROR (-1, or 255 if you assign it to a char variable) should the CPMEOF be missing. 9. Since the "_spr" function is used to form the output string, and then "puts" is used to actually print it out, care must be taken to avoid generating null (zero) bytes in the output, since such a byte will terminate printing of the string by puts. Thus, a statment such as: printf("%c foo",'\0'); would not actually print anything at all. 10. The "%s" termination character has been changed from "any white space" to the character following the "%s" specification in the format string. That is, the call sscanf(string, "%s:", &str); would ignore leading white space (as is the case with all format conversions), and then read in ALL subsequent text (including newlines) into the buffer "str" until a COLON or null byte is encountered. 11. fgets is a little tricky due to the CP/M convention of having a carriage-return AND a linefeed character at the end of every text line. In BDS C Library Summary, v1.46 4 order to make text easier to deal with from C programs, this function (fgets) automatically strips off the CR from any CR-LF combinations that come in from the file. Any CR characters not immediately followed by a LF are left intact. The LF is included as part of the string, and is followed by a null byte. There is no limit to how long a line can be here; care should be taken to make sure the string pointer passed to fgets points to an area large enough to accept the largest expected line length (a line must be terminated by a newline (LF) character before it is considered terminated). The value NULL, NOT EOF, is returned on end-of-file, whether it be a physical end-of-file (attempting to read past last sector of the file) OR a logical end-of-file (encountered a control-Z.) 12. The "fputs" function writes a string out to a buffered output file. The '\n' character is expanded into a CR-LF combination, in keeping with the CP/M convention. If a null ('\0') byte is encountered before a newline is encountered, then there will be NO automatic termination character appended to the line, thus allowing partial lines to be written. 13. When managing overlays, the "swapin" function may be used by the root segment to swap in overlay code segments from disk. The provided version does NOT check to make sure that the code yanked in doesn't overlap some data areas that may lie above the swapping area in memory. 14. The storage allocation routines were taken from chapter 8 of K&R, but simplified to ignore the storage allignment problem and not bother with the "morecore" hack (a call to "sbrk" under CP/M is a relatively CHEAP operation, and can be done on every call to "alloc" without degrading efficiency.) Note that compilation of "alloc" and "free" is disabled until the " define ALLOC_ON 1" statement is un-commented in the header file ("BDSCIO.H"). This is done so that the external storage required by alloc and free isn't declared unless the user actually needs the alloc and free functions. 15. The random-record file I/O functions are a direct interface to the random-record BDOS functions provided by CP/M versions 2.0 and above, but not available for pre-2.0 CP/M systems. Because of the non-portability of these functions, they have not been heavily advertised in the BDS C User's Guide (i.e., they are not mentioned at all). The "rread", "rwrite", "rseek" and "rtell" functions work just like the functions "read", "write", "seek" and "tell", respectively, except that they do things via the random-record fields of the file's FCB. The "rsrec" and "rcfsiz" function simply take a file descriptor of an open file and perform their namesake BDOS operation on the given file, but in addition they also return the value computed. Thus, "rcfsiz" may be used to quickly compute the size of a file under CP/M 2.x. 16. The "execv" function no longer prints out "Broken Pipe" upon error; instead, it has the more conventional behavior of returning -1 (ERROR) and letting the user perform diagnostics. 17. "fabort" should not be used under systems like MPM-II in which all files MUST be closed, whether they are open for input or output, in order not to run out of file descriptors and hang the system. 18. New for v1.46 (see the v1.46 documentation addenda sheet for details.) 19. Modified for v1.46 to detect when "NOBOOT" has been invoked on the currently executing program, and return an adjusted value for the end of available user-memory. BDS C Library Summary, v1.46 5 20. When the DIO package is linked in to a program, alternate versions of "getchar" and "putchar", whose sources are in DIO.C, get used. BDS C Library Summary, v1.46 6