home *** CD-ROM | disk | FTP | other *** search
/ Computer Club Elmshorn Atari PD / CCE_PD.iso / mac / 1000 / CCE_1024.ZIP / CCE_1024 / SOZLIB07.LZH / SOZDISTR / DOC / XDLIBS.TXT < prev    next >
Text File  |  1994-07-27  |  90KB  |  2,262 lines

  1. if there are conflicts between this dicument and soz_libs.hyp the last one
  2. shoulde be right. This problem will vanish when the documentation is 
  3. completely written in Texinfo.
  4.         -jerry
  5.  
  6. Xdlibs.a and extended.lib are the two files of standard library of SOZOBON C
  7. 2.00X. There are some libraries like float.a aesfast.a, etc.  with own docs. 
  8.  
  9. XDLIBS
  10. standard library for SOZOBON C, based on dlibs by Dale Schumacher.
  11.  
  12. Some special multitasking related functions will be implemented next
  13. months according to MiNT docs. A checking for MiNT's presence will be
  14. done there.
  15.  
  16. contents:
  17.  
  18. 1. HEADER FILES
  19. 2. STDLIB
  20.     2.1 PROCESS CONTROL
  21.     2.2 MEMORY MANAGEMENT
  22.     2.3 TYPE CONVERSION
  23.     2.4 MISCELLANEOUS FUNCTIONS
  24.     2.5 STANDARD INTERNALS
  25. 3. STDIO
  26.     3.1 FILE TO STREAM OPERATIONS
  27.     3.2 PROCESS COMMUNICATION
  28.     3.3 FORMATTED I/O
  29.     3.4 FORMATTING I/O
  30.     3.5 STREAM I/O
  31.     3.6 POSITIONING in STREAMS
  32.     3.7 STD I/O ERROR HANDLING
  33.     3.8 UTILITIES
  34.     3.9 EXTENSIONS AND INTERNALS
  35. 4. CHARACTER TYPE FUNCTIONS
  36. 5. STRING FUNCTIONS
  37.     5.1 STRING LIB
  38.     5.2 FORMATTING/TYPE CONVERSION
  39. 6. ASSERT AND ERRORHANDLING
  40. 7. VARIABLE ARGUMENT LISTS
  41. 8. GLOBAL JUMPS
  42. 9. DATE/TIME FUNCTIONS
  43. 10. UNISTD, STAT AND FCNTL
  44.     10.1 FILE HANDLING
  45.     10.2 INPUT/OUTPUT FUNCTIONS
  46.     10.3 PROCESS CONTROL
  47.     10.4 CREATE CHILD PROCESSES
  48. 11. MISCELLANEOUS FUNCTIONS
  49.     11.1 MALLOC
  50.     11.2 SEARCHING AND SORTING
  51. 12. TOS
  52.     12.1 TIMER
  53.     12.2 PROCESS CONTROL
  54. 13. DEVICE I/O
  55. -----------------
  56.  
  57. 1. HEADER FILES
  58.  
  59. The first two files are included by stdlib.h and stdio.h. Thy contain 
  60. basic typedefs and macros.
  61.  
  62. stddef.h
  63.     This is the root header file which should be included in all
  64.     programs.  It defines FALSE, TRUE, NULL, size_t, ptrdiff_t and the
  65.     offsetof() macro.
  66.     The expected version number of the XDLIBS library is defined in
  67.     macro _XDLIBS. To test write a program containing something like:
  68.         assert( _xdlibs < _XDLIBS)
  69.  
  70. types.h
  71.     This file contains typedefs for many special and/or non-standard
  72.     type names.  Many of the typedefs in this file define type names
  73.     which are ANSI and/or System V standard.  This file is included
  74.     by several other header files, and includes <stddef.h>.
  75.  
  76. The next ones are standard header files, to find in every standard C-system.
  77.  
  78. stdlib.h
  79.     This file is defines the dynamic memory managment functions,
  80.     malloc(), et. al., string to number functions, environment access
  81.     and basic process control functions. It should be present in every
  82.     source code you write. It includes types.h.
  83.     
  84. stdio.h
  85.     This header file should be present in nearly all C programs.
  86.     It contains defines the FILE struct, EOF and contains extern
  87.     declarations for standard i/o and other commonly used functions.
  88.     For convenience, the constants TRUE, FALSE and ERROR are also
  89.     defined in this file, although this is somewhat non-standard.
  90.  
  91. string.h
  92.     This file defines aliases for string function names (since some
  93.     string functions have various names on different systems) and
  94.     extern declarations for all string functions.
  95.     The number to string functions are there to find, too.
  96.  
  97. ctype.h
  98.     The isxxxx() macros and toxxxx() macros are define in this file.
  99.  
  100. errno.h
  101.     This file defines the error code constants, the errno variable
  102.     and related error handling functions.
  103.  
  104. limits.h
  105.     Various maximum and minimum values are defined by this file.
  106.     Among these are PATHSIZE and MAXINT.
  107.  
  108. time.h
  109.     This file defines time related constants and structures, and
  110.     extern declarations for the time functions.
  111.  
  112. assert.h
  113.     This header defines the assert() run-time condition checking macro.
  114.  
  115. stdarg.h
  116.     This header defines the type and macros needed for variable
  117.     argument list processing.
  118.  
  119. setjmp.h
  120.     This file defines the buffer needed to save your context when
  121.     using setjmp()/longjmp() or catch()/throw().
  122.  
  123. Now follow some non standard header files. They are provided for
  124. compatibility and easy ports.
  125.  
  126. macros.h
  127.     This file contains a few useful macros including min(), max(),
  128.     swap() and other.
  129.  
  130. unistd.h
  131.     The standard operating system calls in C are the POSIX system calls.
  132.     This file contains function declarations and macros for
  133.     translating this standardized functions to Atari TOS functions.
  134.  
  135. fcntl.h
  136.     This file defines the O_xxxx constants used by open().
  137.  
  138. stat.h
  139.     The struct stat and the file mode flag constants are defined
  140.     in this file.
  141.  
  142. Some extensions to standard libraries and direct TOS access is to find
  143. in next files:
  144.  
  145. malloc.h
  146.     Some functions dealing with memory block of malloc(), alloca()
  147.     for allocating memory from stack, ... .
  148.  
  149. atari.h
  150.     For direct TOS access include this file. It will include the
  151.     following ones and errno.h. Some OS structures are declarated here.
  152.     
  153. osbind.h
  154.     Mnemonics for bios(), xbios() and gemdos() calls are defined
  155.     in this file.
  156.     
  157. basepage.h
  158.     The BASEPAGE struct and the _base variable, which is initialized
  159.     to point to the current process basepage, are defined in this file.
  160.  
  161. osheader.h
  162.     The TOS header struct is in here.
  163.  
  164.  
  165. 2. STDLIB
  166.  
  167. The standard library. Include stdlib.h for access to these functions.
  168.  
  169. int _xdlibs;
  170.     This is the version number of your library 'xdlibs.a'.
  171.     Highbyte is version, lowbyte is revision.
  172.  
  173. 2.1 PROCESS CONTROL:
  174.  
  175. global variables: generally no write access at runtime!
  176. some are from startup codes, others are to find in the libraries
  177. ATARI specific:
  178. int _app
  179.     is TRUE if its an application, and FALSE for accessories
  180.  
  181. int _mint
  182.     If it is 0 MiNT is not running. If -1 you will have to test this,
  183.     any other value is the active's MiNT version number.
  184.     Using a '*_s' startup code will always include a MiNT test, it is
  185.     done in _main() function.
  186.     With other startup codes either test with 'void GetMiNT()'
  187.         if (__mint == -1)
  188.             GetMiNT();
  189.     or like this
  190.         if (__mint == -1) {
  191.             long    val;
  192.             if (Getcookie('MiNT', &val))
  193.                 __mint = (int)val;
  194.             else
  195.                 __mint = 0;
  196.         }
  197.     Now you can use the flag.
  198.     if (__mint) {
  199.     }
  200.     void GetMiNT() is a dummy function with the standard stdio startup
  201.     codes ('*_s.o'), and never called, in the above example.
  202.  
  203. BASEPAGE *_base
  204.     pointer to process' basepage
  205.  
  206. char *_envp
  207.     pointer to begin of current environment; it may be changed by
  208.     putenv() 
  209.  
  210. int errno
  211.     holds the error number of last error occured in a library function
  212.     (from stdlib.h, stdio.h unidstd.h)
  213.  
  214. char *etext;
  215. char *edata;
  216. char *end;
  217.     These variables point to the first byte beyond the end of the
  218.     text, data and BSS segments respectively.  They are provided
  219.     for compatibility.
  220.  
  221. long _STKSIZ = 4096L;
  222.     This variable defines the amount of run-time stack space to be
  223.     reserved.  The default value is 4K, which is more than enough
  224.     for most applications.  Since dynamic memory is NOT allocated
  225.     from the stack, this value need only be large enough to handle
  226.     local variables and deep recursion.
  227.     If you will need a larger stack put it in your source; if not,
  228.     forget about it.
  229.  
  230. int main(int argc, char *argv[])
  231. or:
  232. int main(int argc, char *argv[], char *envp)
  233.     This function is not actually in the standard libraries, but
  234.     must be present somewhere in the user's code.  The parameters
  235.     passed to it by _main() are the number of arguments in the
  236.     command line, a pointer to a list of pointers to arguments, and
  237.     a pointer to the initial environment string.  The return value
  238.     from main() is passed, by _main(), to exit().  Therefore, you
  239.     should always return() from main(). You may call exit() directly
  240.     in any function, too.
  241.     A return value of 0 means okay, a positiv value up to 127 means
  242.     something happened. Negative values are reserved for OS errors
  243.     and signals.
  244.  
  245. void exit(int status)
  246.     Normal program termination. Calls all atexit functions (first
  247.     the last stored), flushes and closes all open streams.  
  248.     Returns <status> value to the operating system.
  249.     A return value of 0 means okay, a positiv value up to 127 means
  250.     something happened. Negative values are reserved for OS errors
  251.     and signals.
  252.  
  253. void abort()
  254.     Prints the message "Abnormal program termination" to stderr and
  255.     calls _exit() with a status code of 3.
  256.  
  257. int atexit( void (*fnc)() )
  258.     Stores fnc() so that this function is called by exit or if
  259.     main() returns. If it returns not 0 the function couldn't be
  260.     stored (there is space for 32 function pointers reserved).
  261.  
  262. char *getenv(char *var)
  263.     Search for <var> in the environment.  If <var> is found, a pointer
  264.     to it's value is returned.  NULL is returned if <var> is not found.
  265.     WARNING:  The returned pointer points into the environment and
  266.     must not be modified! The returned string maybe empty!
  267.  
  268. int putenv(char *entry)
  269.     Add <entry> to the environment.  <entry> can be any of the following
  270.     forms:
  271.         <VARIABLE>
  272.         <VARIABLE>=
  273.         <VARIABLE>=<value>
  274.     The first form removes <VARIABLE> from the environment.  getenv()
  275.     will return NULL if looking for this variable.  The second form adds
  276.     <VARIABLE> to the environment, with a null value.  getenv() will
  277.     return a pointer to a '\0' character if looking for this variable.
  278.     Many environment handlers don't support such "tag variables", so
  279.     their use is not recommended.  The final form is the most common.
  280.     <VARIABLE> is installed (or replaced) with the value <value>.
  281.     It should be noted that the putenv() function itself
  282.     is not supported in many systems and therefore may not be portable.
  283.     This function uses malloc() if there is not enough space in the
  284.     last allocated environment block.
  285.     It returns TRUE for success or FALSE for failure. Failure maybe
  286.     ENSMEM or you tried to remove a nonexisting variable.
  287.  
  288. int system(char *command) 
  289.  
  290.     If <command> is NULL, this function returns TRUE if a shell is 
  291.     available and FALSE if not.  
  292.  
  293.     If <command> has a value, this function attempts to pass <command>
  294.     to the shell.  The return value will be that from the shell.
  295.  
  296.     If MiNT is not present, and "_shell_p" is valid, the program pointed
  297.     to by the system variable "_shell_p" is used.  If a valid shell
  298.     cannot be found in the _shell_p variable, the "SHELL" environment
  299.     variable is searched for, too If it exists, and is not empty, it will
  300.     be the name of the shell program to execute the given command. 
  301.  
  302.     If a new process with a new shell is created, there is an argument
  303.     added:  the shell flags, cause most shells won't execute a
  304.     commandline if they are not called with option '-c'. To control this,
  305.     there exists a variable char *__SHELL_FLAGS__, which gets used if it
  306.     is not NULL. By default the string "-c" is passed as first argument. 
  307.     The <command> string will be the second argument. 
  308.  
  309.     If system() returns with ERROR, and errno is still zero, the shell
  310.     couldn't be executed.  In this case you can try to execute the
  311.     commandline directly, e.g.  using spawn...() functions.  If some
  312.     people need a function like system() but working without a shell, I
  313.     can implement it.  The only question is the functionality:  i/o
  314.     redirection, wildcard expansion pipes, variable substitution, even
  315.     more?  I think the better solution is using a fulll featured shell
  316.     via system().
  317.  
  318.     Of course, this function uses the ARGV argument passing scheme, 
  319.     which is ATARI's standard convention for calling programs.
  320.  
  321.  
  322. 2.2 MEMORY MANAGEMENT:
  323.  
  324. long _BLKSIZ = 65536;
  325.     This variable controls the granularity of system memory allocation
  326.     used by malloc(), et. al.  This is the amount of memory that is
  327.     requested from the system each time a new "heap" is needed to fill
  328.     dynamic memory requests.  To help avoid a GEMDOS bug, only 32
  329.     heaps can be active at a time.  Therefore, (32 * _BLKSIZ) defines
  330.     the maximum amount of memory which can be managed by these routines
  331.     under normal circumstances.  The exception is if any single request
  332.     for memory exceeds _BLKSIZ.  In this case, a heap will be allocated
  333.     larger than _BLKSIZ. (This will change next time.)
  334.     Note that _BLKSIZ should not be too small (8K is the minimum
  335.     if Memory Protection with the 030's PMMU is active under MiNT),
  336.     to avoid too many blocks, and not too large, cause this process
  337.     will waste memory, which is not available for other processes.
  338.  
  339. void *malloc(size_t size)
  340.     Allocate at least <size> bytes of memory.  A pointer to the
  341.     requested block is returned, or NULL if there is not enough
  342.     free memory available.
  343.  
  344. void  *calloc(unsigned int n, size_t size)
  345.     Allocate space for an array of <n> element of <size> bytes each.
  346.     If the storage can be allocated, it is initialized to all zero.
  347.     NULL is returned is there is not enough free memory.
  348.  
  349. void *lalloc(long size)
  350.     Allocate at least <size> bytes of memory.  A pointer to the
  351.     requested block is returned, or NULL if there is not enough
  352.     free memory available.
  353.  
  354. void *realloc(char *addr, size_t size)
  355.     Attempt to change the memory block at <addr> to the new <size>.
  356.     Making a block smaller will always work, but making it larger
  357.     may fail if there is not enough free memory.  If there is not
  358.     enough memory, NULL is returned and the block will still reside
  359.     at <addr>.  If realloc() succeeds, a pointer to the (possibly
  360.     completely moved!!) new block will be returned.  If <addr> is
  361.     NULL, realloc() will simply act like malloc().  If <size> is 0,
  362.     and <addr> is not NULL, realloc() will work like free().
  363.     
  364. void *lrealloc(char *addr, long size)
  365.     The same as realloc(), but the block size argument is a long value.
  366.  
  367. void free(void *addr)
  368.     Release the memory block at <addr> back into the free memory pool.
  369.     WARNING: Unlike some implementations, you may not realloc() a block
  370.     which has been free()ed.
  371.  
  372. 2.3 TYPE CONVERSION:
  373.  
  374. long atol(char *number)
  375.     Convert the string <number> to a long value.  Leading whitespace
  376.     is ignored, a leading +/- is optional.  Characters are processed
  377.     until a non-digit is reached.  Return value is undefined in an
  378.     overflow situation.
  379.  
  380. int atoi(char *number)
  381.     Convert the string <number> to an int value.  Leading whitespace
  382.     is ignored, a leading +/- is optional.  Characters are processed
  383.     until a non-digit is reached.  Return value is undefined in an
  384.     overflow situation.
  385.  
  386. long strtol(char *number, char **nptr, int base) 
  387.     Convert the string <number> to a long value of base <base>.  Bases
  388.     from 0 to 36 are allowed.  Leading whitespace is ignored, and a
  389.     leading +/- is optional.  If the <base> is 0, a leading '0'
  390.     indicates base 8 and a leading "0x" or "0X" indicates base 16.
  391.     Characters are processed until a character is found which is not in
  392.     the specified base.  If <nptr> is non-NULL, it will be set to point
  393.     to the character which terminated the translation in <number>.
  394.     Return value is undefined in an overflow situation.
  395.  
  396. unsigned long strtoul(char *number, char **nptr, int base)
  397.     Convert the string <number> to an unsigned long value of base
  398.     <base>.  Bases from 0 to 36 are allowed.  Leading whitespace is
  399.     ignored.  If the <base> is 0, a leading '0' indicates base 8 and a
  400.     leading "0x" or "0X" indicates base 16.  Characters are processed
  401.     until a character is found which is not in the specified base.  If
  402.     <nptr> is non-NULL, it will be set to point to the character which
  403.     terminated the translation in <number>.  Return value is undefined
  404.     in an overflow situation.
  405.  
  406. 2.4 MISCELLANEOUS FUNCTIONS:
  407.  
  408. int rand()
  409.     Return a pseudo random number in the range 0..32767.  This
  410.     function uses the system random number generator, but grabs
  411.     it's value out of the middle to avoid the exactly 50%
  412.     behavior of the lowest order bit.  Source code is also provided,
  413.     though commented out, showing how to generate your own
  414.     random number sequence if the system random numbers aren't
  415.     sufficient or for porting these routines to another machine.
  416.  
  417. void srand(unsigned int seed)
  418.     Seed the random number generator.  This function is #defined as
  419.     a comment, since no seeding is possible for this implementation
  420.     of rand().
  421.  
  422. MACRO abs(x)
  423.     Return the absolute value of <x>.  This macro evalutes it's
  424.     argument twice.    ((x)<0?(-(x)):(x))
  425.  
  426. MACRO labs(x)
  427.     see abs();
  428.  
  429. void *bsearch(char *key, char *base, int num, int size, int (*cmp)())
  430.     Perform a binary search for <key> on the sorted data at <base>.
  431.     <num>, <size> and <cmp> are like the corresponding parameters
  432.     to qsort().  A pointer to the matching element is returned for
  433.     success, or NULL for failure.  The global variable "_bsearch"
  434.     will contain the index of either the matching element, or the
  435.     index of the element that the <key> value should be inserted
  436.     after.  The use of "_bsearch" is not supported by most
  437.     implementations of bsearch().
  438.  
  439. void qsort(char *base, int num, int size, int (*cmp)())
  440.     Perform a recursive quick-sort on an array starting at <base>
  441.     containing <num> elements of <size> bytes each.  The function
  442.     pointed to by <cmp> is used to compare elements.  Pointers to
  443.     two items in the array are passed to the function, which must
  444.     return a number representing their relationship as follows:
  445.         negative    item1 < item2
  446.         0        item1 == item2
  447.         positive    item1 > item2
  448.     This routine is optimized to avoid N*N sort times for ordered data.
  449.     In fact, performance on sorted or reverse-sorted data is actually
  450.     "best case" with this algorithm, rather than "worst case" as with
  451.     most qsort() implementations.
  452.  
  453.  
  454. Almost standard is this function, still not tested - jerry -.
  455. declarated in unistd.h
  456.  
  457. int getopt(int argc, char **argv, char *optstring)
  458.     This function eases the processing of the command line.  Each call
  459.     returns a character from <optstring>, with optarg set to a parameter
  460.     if one is required; or a '?' indicating that an invalid option was
  461.     found; or EOF indicating that all options have been processed.  The
  462.     <argc> and <argv> parameters are (of course) the argc and argv values
  463.     passed to main().  The <opstring> is a string of option characters.
  464.     If an option takes a parameter, it is followed by a ':' in <optstring>,
  465.     and the char *optarg variable (global) will be set to point to the
  466.     parameter string from the command line.  For example, "bno:v" defines
  467.     the valid option characters as 'b', 'n', 'o' and 'v', and 'o' takes
  468.     a parameter.  All options must be preceeded (in the command line) by
  469.     a '-' character.  A single '-' character is taken to indicate stdin
  470.     as a file, and terminates the argument processing.  A "--" string
  471.     indicated the end of options, and is skipped over.  When option
  472.     processing is successfully completed, the global variable optind will
  473.     contain the index into argv[] of the next argument to be processed.
  474.     Subsequent arguments should be processed with a loop like this:
  475.         while(optind < argc)
  476.             process(argv[optind++]);
  477.     If an error occurs during argument process, an error message is
  478.     written to stderr and '?' is returned by getopt().  Your program
  479.     should then give a usage message and abort.  If the global variable
  480.     opterr is set to zero, no error message will be given, but '?' will
  481.     still be returned.  Note that command lines accepted by getopt() are
  482.     quite flexible.  The command lines "-b -v -o filename -- - file",
  483.     "-vbofilename - file",  and "-ofilename -bv - file" all will return
  484.     the 'b', 'v', and 'o' options with the parameter to 'o' set to
  485.     "filename" and leave the arguments "-" and "file2" for further
  486.     processing.  Please examine the sample program "echo.c" for an
  487.     example of getopt() usage.
  488.  
  489. 2.5 STANDARD INTERNALS
  490. Here follows the documentation of some internal xdlibs functions. You
  491. shouldn't use them at all in you programs!! They are called and linked
  492. automatically.
  493.  
  494. void _initargs(char *cmdline, int cmdlen)
  495.     Process the command arguments, either parsing the command line
  496.     or retrieving the ARGV environment strings.
  497.     It understands the new ARGV scheme of ATARI including empty
  498.     arguments and quoted arguments.
  499.     Never call this function. It manipulates heap/stack area.
  500.     This function is called from the startup module very early on.
  501.     Values to be passed to the user's main() function are stored in
  502.     the global variables "_argc" and "_argv".  The startup module
  503.     initializes these variables to indicate that no arguments are
  504.     available, and sets "_envp" from the value in the basepage.  If
  505.     a program doesn't use arguments, use the 'min_s.o' startup code.
  506.     to make the program smaller.
  507.  
  508. int _main()
  509.     This function defines the standard streams, check to see which
  510.     of them are devices, and calls the user's main() function.  It sets
  511.     up some other values, like _mint flag and _starttime (for clock()).
  512.     The startup module calls this function to start the C program.  The
  513.     following standard streams are initialized by _main():
  514.         stdin        Standard input, may be redirected
  515.         stdout        Standard output, may be redirected
  516.         stderr        Usually the system console's device
  517.                 (environment STDERR is checked, so it
  518.                 maybe file handle 2)
  519.     Atari special:
  520.         stdprn        The standard printer (output only)
  521.                 (device file prn:)
  522.         stdaux        The communication port (input/output)
  523.                 (device file aux:)
  524.     The global variables "_argc", "_argv" and "_envp" are used to
  525.     store the values to be passed to the user's main().  If main()
  526.     returns, exit() is called, with the return value as status.  If a
  527.     program doesn't use ANY standard I/O, you can use an other startup
  528.     code, which doesn't call _main() function. But you won't get
  529.     arguments, if you do so! If you want to get arguments passed, use
  530.     the _main() function from 'minimum.h'. If you don't need argv[0]
  531.     and expect only less arguments you can use the getcmdln() function
  532.     from minimum.h.
  533.  
  534. void _exit(int status)
  535.     Exits the program immediately, returning <status> to the OS.
  536.  
  537. 3. STDIO
  538.  
  539. Standard input/ouput library. Include stdio.h to use this functions.
  540. Portability is guranteed for this functions.
  541. We try to keep them as closest to standard  as possible.
  542.  
  543. There are two flags to control the in and output functions, aside of
  544. opening mode of single streams.
  545.  
  546. short  __FRW_BIN__ = 0;
  547.     When non-zero, i/o functions will not do CR processing
  548.     even for text mode files (ie: ignore file mode) at all.
  549.  
  550. short  __FWRT_BIN__ = 0;
  551.     When non-zero, fwrite will not do CR processing
  552.     even for text mode files, but fread will do if __FRW_BIN__
  553.     is zero and the file is opened in text-mode.
  554.     You can write files with lines ending only with '\n',
  555.     but read those with '\r''\n' translated to '\n', too.
  556.  
  557.  
  558. 3.1 FILE to STREAM OPERATIONS
  559.  
  560. FILE *fopen(char *filename, char *mode)
  561.     Open <filename> as a stream file.  This is the normal open way
  562.     to open a file.  The <mode> is a string specifying the mode(s)
  563.     that are relevent to the file open.  Valid <mode> characters are:
  564.         r        read mode
  565.         w        write mode
  566.         a        append mode
  567.         b        binary mode
  568.         t        text (translated) mode
  569.     At least one of "r", "w" or "a" must be specified.  "t" is assumed
  570.     and indicates that <nl> is translated to <cr><lf> on output and
  571.     vica-versa on input.  If the stream is a character device, the
  572.     translation is slightly different.  The output translation is the
  573.     same, but on input <cr> and <lf> both become <nl> in all cases.
  574.     The "b", for binary mode, overides "t" and indicated that characters
  575.     are not translated during i/o operations.  "a" represents append
  576.     mode and means that the file pointer will initially be placed at
  577.     the end of the file.  "w" mode will create a file if it doesn't
  578.     exists, or zero an existing file.  If "r" is the only mode specified,
  579.     the file must already exist.  A (FILE *) is returned if the open
  580.     succeeds, or NULL if it fails.
  581.  
  582. FILE *freopen(char *filename, char *mode, FILE *fp)
  583.     Closes the file associated with <fp> and opens the new file as with
  584.     fopen(), except that a new FILE structure is not created.  The
  585.     existing FILE structure pointed to by <fp> is re-initialized with
  586.     the new file information.  This is typically used to redirect i/o
  587.     to standard streams stdin, stdout, stderr, stdprn, stdaux.  <fp>
  588.     is returned for success, or NULL for failure.
  589.  
  590. int fflush(FILE *fp)
  591.     Flush the file i/o buffer of the stream <fp>.  The buffer is
  592.     automatically flushed when it is full, the stream is closed,
  593.     or the program terminates through exit(). Call this function
  594.     before switching between reading and writing on a stream which
  595.     is opened for both.
  596.  
  597. int fclose(FILE *fp)
  598.     Close the stream <fp>, flushing the buffer.  Returns 0 on success.
  599.  
  600. int remove(char *filename)
  601.     Delete <filename>, if it exists.  Return 0 for success, or a
  602.     negative error code.
  603.  
  604. int rename(char *oldname, char *newname)
  605.     Change the name of file <oldname> to <newname>.  You may use this
  606.     function to move files from one directory (pathname) to another,
  607.     but not from one drive to another.  Return 0 for success, or a
  608.     negative error code.
  609.  
  610. FILE *tmpfile()
  611.     sorry - missing function available soon.
  612.  
  613. char *tmpnam(char *s)
  614.     Generate a unique filename to be used for a temporary file.
  615.     The filename will have the form "TEMP$nnn.TMP" where "nnn" is a
  616.     sequence of numeric digits.  The name will unique in the current
  617.     working directory.  If <s> is NULL, space will be obtained from
  618.     malloc() to store the filename and thus must be free()'d by the
  619.     caller.  If <s> is not NULL, the filename will be copied into the
  620.     buffer provided.  This function returns NULL for failure, or a
  621.     pointer to the filename for success.
  622.  
  623. void setvbuf(FILE *fp, char *buf, int bmode, size_t size)
  624.     If <bmode> is _IONBF, make <fp> unbuffered.
  625.  
  626.     If <buf> is NULL a buffer of <size> bytes gets used, if <size> is
  627.     NULL, too, <BUFSIZE> is used.  Otherwise <buf> points to a buffer of
  628.     <size> characters to be used as the stream buffer for <fp>.
  629.     The <bmode> variable indicates the type of buffering desired, as
  630.     follows: 
  631.         _IONBF        No buffering
  632.         _IOFBF        Full buffering (normal)
  633.         _IOLBF        Line buffering (this speeds up output)
  634.  
  635. void setbuf(FILE *fp, char *buf)
  636.     If <buf> is NULL, make <fp> unbuffered; else <buf> points to a buffer
  637.     of BUFSIZ characters to be used as the stream buffer for <fp>.
  638.     Full buffering is performed on this stream (_IOFBF) now.
  639.  
  640.  
  641. 3.2 PROCESS COMMUNICATION
  642.  
  643. Not provided as standard but it is some kind of standard on multitasking
  644. systems. So I will implement this soon (MiNT).
  645.  
  646. FILE *popen(char *command, char *type, FILE *fp)
  647.     still missing
  648.  
  649. int pclose(FILE *fp)
  650.     still missing
  651.  
  652.  
  653.  
  654. 3.3 FORMATTED I/O
  655.  
  656.  
  657. int fprintf(FILE *fp, char *fmt[, arg1, ..., argN])
  658.     Formatted output to the stream <fp>.  See the _printf() function
  659.     for a description of the <fmt> formatting string.
  660.  
  661. int printf(char *fmt[, arg1, ..., argN])
  662.     Formatted output to the stdout stream.  See the _printf() function
  663.     for a description of the <fmt> formatting string.
  664.  
  665. int sprintf(char *buf, char *fmt[, arg1, ..., argN])
  666.     Formatted output to the string <buf>.  See the _printf() function
  667.     for a description of the <fmt> formatting string.
  668.  
  669. int vfprintf(FILE *fp, char *fmt, va_list ap)
  670.     Formatted output to the stream <fp> with a variable argument list.
  671.     See _printf() for formatting and va_start() for stdarg explaination.
  672.  
  673. int vprintf(FILE *fp, va_list ap)
  674.     Formatted output to the stdout stream with a variable argument list.
  675.     See _printf() for formatting and va_start() for stdarg explaination.
  676.  
  677. int vsprintf(char *buf, char *fmt, va_list ap)
  678.     Formatted outout to the string <buf> with a variable argument list.
  679.     See _printf() for formatting and va_start() for stdarg explaination.
  680.  
  681. int fscanf(FILE *fp, char *fmt[, arg1, ..., argN])
  682.     Formatted input from the stream <fp>.  See the _scanf() function
  683.     for a description of the <fmt> formatting string.
  684.  
  685. int scanf(char *fmt[, arg1, ..., argN])
  686.     Formatted input from the stdin stream.  See the _scanf() function
  687.     for a description of the <fmt> formatting string.
  688.  
  689. int sscanf(char *buf, char *fmt[, arg1, ..., argN])
  690.     Formatted input from the string <s>.  See the _scanf() function
  691.     for a description of the <fmt> formatting string.
  692.  
  693. 3.4 FORMATTING I/O:
  694.  
  695. These functions are internal to XDLIBS. They document the formatting
  696. strings.
  697.  
  698. int _printf(char *op, int (*put)(), char *fmt, int *args)
  699.     This function does all the work for printf(), et al.  Many systems
  700.     don't provide direct access to this function (or it's equivalent),
  701.     but it is useful for writing your own printf()-like functions.
  702.     Since this is a non-standard interface, and v[sf]print() is now
  703.     available, you should probably use the stdarg functions instead.
  704.     <fmt> points to a format control string.  <args> pointers to a
  705.     list of arguments.  The format string is used to create and output
  706.     stream with the arguments.  The <put> function is used to output
  707.     each character.  The <op> parameter is given to the <put> function
  708.     to specify the output stream.  Calls to <put> are of the form:
  709.     "(*put)(c, op);" where <c> is the character to output.  The format
  710.     string is composed of characters and format specifications.  The
  711.     '%' character introduces a format specifier.  The general form of
  712.     a format specifier is:
  713.       %[-][ |+][0][<width>|*][.[<precision>|*]][l]{d|i|u|o|x|p|b|c|s}
  714.     The '-' specifies left justification.  The ' ' or '+' specifies
  715.     the character which preceeds positive numeric values.  The '0'
  716.     specifies that numeric fields will be padded with '0' rather than
  717.     ' '.  The <width> field is a numeric value specifying a minimum
  718.     field width.  The <precision> field is a numeric value specifying
  719.     the maximum number of data characters to display.  If '*' is
  720.     specified for the width or the precision, an "int" value is taken
  721.     from the argument list and used for that value.  If no width is
  722.     specified, the field width varies according to the data width.  If
  723.     no precision is specified, all data characters are included in the
  724.     data width.  If the data width exceeds the field width, the field
  725.     width will expand to allow all data characters to be printed.
  726.     Including the 'l' or capitalizing the trailing character specifies
  727.     that the associated value is a "long" type.  The trailing character
  728.     specifies the format type, as follows:
  729.         d    Signed decimal integer
  730.         i    same as 'd'
  731.         u    Unsigned decimal integer
  732.         o    Unsigned octal integer
  733.         x    Unsigned hexadecimal integer
  734.         b    Unsigned binary integer
  735.         p    Pointer (displayed in %06.8lX format)
  736.         c    Character
  737.         s    String
  738.     If the character following the '%' is not recognized, it is
  739.     simply passed along to the output stream, thus "%%" is used to
  740.     print a single '%' character.
  741.  
  742. int _scanf(char *ip, int (*get)(), int (*unget)(), char *fmt, char **args)
  743.     This function does all the work for scanf(), et al.  Many systems
  744.     don't provide direct access to this function (or it's equivalent),
  745.     but it is useful for writing your own scanf()-like functions.
  746.     <fmt> points to a format control string.  <args> pointers to a
  747.     list of arguments, each of which is the address of a variable in
  748.     which input data may be stored.  The format string is used to
  749.     control reading of characters from the <get> function.  As each
  750.     character is needed <get> is called in the form "c = (*get)(ip);"
  751.     where <c> is the character read (negative for errors) and <ip> is
  752.     the auxiliary pointer specified by the <ip> parameter.  If a
  753.     character needs to be un-gotten, a call to <unget> of the form
  754.     "(*unget)(c, ip);" is made.  The format string is composed of
  755.     characters and format specifications.  Any characters in <fmt>,
  756.     except whitespace characters, which are not part of a format
  757.     specifier are expected to be matched one-to-one by characters in
  758.     the input stream.  Scanning terminates if a mismatch occurs or if
  759.     any call to <get> results in an error.  Whitespace characters
  760.     match 0 or more whitespace characters in the input stream.  The
  761.     '%' character introduces a format specifier.  The general form of
  762.     a format specifier is:
  763.          %[*][<width>][l|h]{d|u|o|x|b|i|c|s}
  764.     The '*' specifies that a field is to be scanned by not stored.
  765.     No variable pointer should be provided for non-stored format
  766.     specs.  The <width> field specifies that maximum number of
  767.     characters to be process to fill the given format type.  Less
  768.     than <width> characters will be processed if the field ends
  769.     before <width> characters have been processed.  A field ends when
  770.     either a whitespace character, or a character which does not fit
  771.     the specified format, is read.  The preceding 'l' (or
  772.     capitalizing the conversion character) specifies that the
  773.     associated variable is a "long" type.  The trailing character
  774.     specifies the format type, as follows:
  775.         d Signed decimal integer
  776.         u Unsigned decimal integer
  777.         o Unsigned octal integer
  778.         x Unsigned hexadecimal integer
  779.         b Unsigned binary integer
  780.         i Unsigned decimal/octal/hexadecimal/binary integer
  781.         c Character
  782.         s String
  783.     If a <width> is specified with the 'c' format, exactly <width>
  784.     characters (including whitespace) are read from the input stream,
  785.     and written to a string.  No '\0' character is added If the
  786.     character following the '%' is not recognized, it is expected to
  787.     match the input stream as a non-format character, thus "%%" is
  788.     used to match a single '%' character.
  789.     One additional conversion is the brace-format.  Shown as "%[...]",
  790.     the '...' represent a list of characters.  If the first character
  791.     in the list is a '^', the field contains any characters -not- in
  792.     the list (starting with the 1st character after the '^').  If the
  793.     first character of the list is not a '^', then the field will
  794.     only contain those characters found in the list.  A right brace 
  795.     character (']') can be included as one of the list of characters
  796.     by placing it as the first character in the list.  If the '^'
  797.     negation character is the first character, the included brace
  798.     should be the next character after the '^'.  For maximum
  799.     portability, a range should be explicitly given (a good example
  800.     would be "%[0123456789]"), but to allow for porting from
  801.     systems with smarter scanf functions, this version of scanf
  802.     also supports ranges represented using a <first>-<last>
  803.     form (eg: "%[0-9]").  To use the first-last form, the
  804.     character <first> must be lexically less than or equal to
  805.     the character <last>.  If this rule is violated, or if the
  806.     hyphen is the first or last character of the list, the
  807.     hyphen will be assumed to be just another character in the
  808.     list and no range expansion will be done.  The resulting
  809.     string containing the characters in (or not in) the list
  810.     will be null terminated.  It should be noted that, unlike
  811.     most of the other formats, this conversion does allow the
  812.     programmer to specify that whitespace characters will be
  813.     included in the resulting string.
  814.  
  815.  
  816. 3.5 STREAM I/O
  817.  
  818. 3.5.1 CHARACTER INPUT
  819.  
  820. int fgetc(FILE *fp)
  821.     Get a character from <fp>.  Returns the character or EOF.
  822.     The function _tttty() is called if <fp> is a device.
  823.  
  824. char *fgets(char *data, int limit, FILE *fp)
  825.     Get data from <fp> and puts it in the <data> buffer.  At most,
  826.     <limit>-1 characters will be read.  Input will also be terminated
  827.     when a newline is read.  <data> will be '\0' terminated and the
  828.     newline, if read, will be included.  A pointer to the start of
  829.     <data> is returned, or NULL for EOF.
  830.     The function _tttty() is called if <fp> is a device.
  831.  
  832. int getc(FILE *fp)
  833.     Same as fgetc() but implemented as a macro.
  834.  
  835. int getchar()
  836.     Same as "fgetc(stdin)".
  837.  
  838. char *gets(char *data)
  839.     Get data from stdin and puts it in the <data> buffer.  Input is
  840.     terminated when a newline is read.  The    newline will be replaced
  841.     by a '\0' to terminate the string.  A backspace character will
  842.     remove the preceeding character from the buffer, but will not
  843.     backspace past the start of the buffer.  A pointer to the start
  844.     of <data> is returned, or NULL for EOF.
  845.     The function _tttty() is called if <fp> is a device.
  846.  
  847. 3.5.1 CHARACTER OUTPUT
  848.  
  849. int fputc(char c, FILE *fp)
  850.     Put the character <c> to the stream <fp>.
  851.  
  852. void fputs(char *data, FILE *fp)
  853.     Write the characters in <data> to the stream <fp>.  A newline
  854.     is added if there is no one at end of string.
  855.  
  856. int putc(char c, FILE *fp)
  857.     Same as fputc() but implemented as a macro.
  858.  
  859. int putchar(char c)
  860.     Same as "fputc(c, stdin)".
  861.  
  862. void puts(char *data)
  863.     Write the characters in <data> to stdout.  A newline WILL be
  864.     written after the data.
  865.  
  866. int fungetc(char c, FILE *fp)
  867.     Push the character <c> back to be gotten by the next fgetc()
  868.     call on <fp>.  Only 1 character may be ungotten at a time on
  869.     each stream.  Subsequent calls to fungetc() will write over
  870.     the currently saved character.
  871.  
  872. int ungetc(char c, FILE *fp)
  873.     Same as fungetc() but implemented as a macro.
  874.  
  875. 3.5.2 I/O of non char OBJECTS
  876.  
  877. int fread(char *data, int size, int count, FILE *fp)
  878.     Read <count> items of <size> characters each from stream <fp>.
  879.     Data is stored in the buffer pointed to by <data>.  The number of
  880.     full items actually read is returned, or a negative error code.
  881.  
  882. int fwrite(char *data, size_t size, size_t count, FILE *fp)
  883.     Write <count> items of <size> characters each to stream <fp>.
  884.     Data is read from the buffer pointed to by <data>.  The number of
  885.     full items actually written is returned, or a negative error code.
  886.  
  887. int _tttty(FILE *fp)
  888.     "Teeny Tiny TTY" driver function.  This function is internal to
  889.     XdLibs, but it's name is documented to allow you to replace it with a
  890.     tty driver of your own.  In brief, this function is supposed to read
  891.     from <fp>, up to a newline character, putting the character in the
  892.     FILE buffer, and return the number of characters read (similar to
  893.     _fillbuf() in some systems). If the stream is in binary mode, a full
  894.     buffer is to be read, with no translation. 
  895.     It outputs every char collected in the buffer to stdout.
  896.     It is never used when Mint is active any more, cause Mint has a
  897.     working tty driver.  It emulates a default tty as far as possible,
  898.     so the following characters will cause some action: 
  899.         ^U,^@    kill line
  900.         ^V    quote next char
  901.         ^D    end of file
  902.         ^C    break (kill process)
  903.         ^H, ^?    erase last character
  904.         ^W    erase last word
  905.         ^J, ^M    newline
  906.     non std:
  907.         ^[    send to stdout but don't keep this in buffer,
  908.             nor the next character
  909.     
  910.  
  911. 3.6 POSITIONING in STREAMS
  912.  
  913. int fseek(FILE *fp, long offset, int origin)
  914.     Operates like lseek(), except it works on streams.  Note that
  915.     stream file positions may be misleading due to translation of
  916.     <nl> characters during i/o.  ftell() may be used reliably with
  917.     fseek() to reposition a file to a prior location.  WARNING:
  918.     fseek() returns 0 for success, non-zero for failure, according
  919.     to the ANSI standard.  Some implementations use 0 for failure.
  920.     This function is maintained for compatibility with old programs.
  921.     fsetpos() should be used in new code.  (cf: fsetpos)
  922.  
  923. long ftell(FILE *fp)
  924.     Operates like tell(), except it works on streams.  Note that
  925.     stream file positions may be misleading due to translation of
  926.     <nl> characters during i/o.  This function is maintained for
  927.     compatibility with old programs.  fsetpos() should be used in
  928.     new code.  (cf: fsetpos)
  929.  
  930. void rewind(FILE *fp)
  931.     Operates like fseek(fp, 0L, SEEK_SET), except it also clears the
  932.     end-of-file and error flags for <fp>.  There is no return value.
  933.  
  934. int fgetpos(FILE *fp, fpos_t *pos)
  935.     Get the position of the stream <fp> and store it at the location
  936.     pointed to be <pos>.  This is the new X3J11 function to replace
  937.     ftell().  Returns 0 for success and ERROR for failure.
  938.  
  939. int fsetpos(FILE *fp, fpos_t *pos)
  940.     Set the position of the stream <fp> to the valued stored at the
  941.     location pointed to be <pos>.  Note that this function is only
  942.     required to work properly for a <pos> value which was previously
  943.     obtained by fgetpos() on the same stream.  This is the new X3J11
  944.     function to replace fseek().  Returns 0 for success and ERROR for
  945.     failure.
  946.  
  947.  
  948. 3.7 I/O ERROR HANDLING
  949.  
  950. void clearerr(FILE *fp)
  951.     Clear the error flag on <fp>.
  952.  
  953. int feof(FILE *fp)
  954.     Return non-zero if <fp>    is at end of file.
  955.  
  956. int ferror(FILE *fp)
  957.     Return non-zero if and error has occurred on <fp>.
  958.  
  959. void perror(char *msg)
  960.     Write, to stream stderr, <msg> (if non-null and non-empty),
  961.     followed by ": " and a system error messaged derived from the
  962.     value of errno. 
  963.  
  964.  
  965. 3.8 UTILITY functions dealing with PATHS and FILES.
  966. Not guaranteed but almost standard. I didn't test them explicitly,
  967. until now. -jerry-
  968.  
  969. char *tempnam(char *dir, *pfx)
  970.     This function is similar to tmpnam(), but is somewhat more flexible.
  971.     <dir> specifies the directory part of the filename.  If <dir> is
  972.     NULL, the TMPDIR environment variable will be used.  If TMPDIR is
  973.     not found, the current directory is used.  <pfx> specifies the
  974.     filename prefix (up to 5 characters).  The form of the filename
  975.     will be "dir\pfxnnn.TMP", similar to tmpnam().  The storage for
  976.     the filename is always obtained from malloc(), so the caller must
  977.     free() it after use.  This function returns NULL for failure, or a
  978.     pointer to the fully expanded filename for success.
  979.  
  980. char *fullpath(char *full, *part)
  981.     <part> is a (possibly) ambiguous file/path specification.  A
  982.     non-ambiguous file/path spec is created which includes a drive
  983.     letter and all intermediate sub-directories.  If the partial
  984.     specification is not valid, NULL is returned, otherwise a
  985.     pointer to <full> is returned.  If NULL is specified for <full>,
  986.     an internal buffer is used and a pointer to it is returned.
  987.  
  988.  
  989. char *findfile(char *afn[, *ext])
  990.     Return full file spec for <afn> if found. If <afn> has no extension,
  991.     extensions from <ext> are tried until a match is found, or the list
  992.     ends.  <ext> is a list of extensions separated by '\0' characters
  993.     and ending with an additional '\0', ie. ".ttp\0.tos\0.prg\0" (note
  994.     that the final null is added by the compiler to any string constant.
  995.     If <afn> already has an extension, <ext> is not used.  If no matching
  996.     files are found, NULL is returned.  The pointer returned when a match
  997.     is found points to a buffer which is internal to fullpath().  If you
  998.     want to save the value returned, you must make a copy before the
  999.     buffer is overwritten by subsequent calls.  Note: several dLibs
  1000.     functions call filefind(), so don't make too many assumptions about
  1001.     how long the internal buffer is going to stay valid.
  1002.  
  1003. char *pfindfile(char *path, *afn[, *ext])
  1004.     Like findfile() but search all directories (separated by ',' or ';')
  1005.     in <path>.  If <path> is NULL, the "PATH" environment variable is
  1006.     used instead.  If <afn> specifies a drive or directory, <path> is
  1007.     not used.  The internal buffer for findfile() is used by pfindfile().
  1008.  
  1009.  
  1010. The fowllowing ones are non standard. Taken from Dlibs without test and
  1011. changes.
  1012.  
  1013. char *wildcard(char *pathname)
  1014.     Return matches for a wildcard filename.  If <pathname> is not
  1015.     NULL, the first file which matches <pathname> will be returned.
  1016.     The <pathname> may contain wildcards only in the filename portion,
  1017.     not in any sub-directories.  Subsequent calls to wildcard() with
  1018.     a NULL argument return the next matching filename.  NULL is
  1019.     returned when no more files match.  Note: the pointer returned
  1020.     points to an internal buffer which is overwritten with each
  1021.     call.  It should not be modified, and should be copied into a
  1022.     safe place if you want to save the value.
  1023.  
  1024. char *_splitpath(char *src, *drive, *path, *file, *ext)
  1025.     Parse the <src> filename into component parts. Returns <src>.
  1026.     If any of the component pointers is NULL, that component will
  1027.     be parsed, but not saved.  If a given component does not exists
  1028.     int the <src> string, the component will be empty, (ie.: "").
  1029.     The <drive> component will be a drive letter followed by a colon,
  1030.     (ie.: "a:").  The <path> component will be the subdirectory names
  1031.     leading up to the filename, but will not include a trailing '\'
  1032.     unless the path the simply the root path "\", and there will only
  1033.     be a leading '\' if the path is fully qualified, or "rooted", ie.:
  1034.     "\this\is\a\path\name".  The <file> component is the base filename
  1035.     without any extension, ie.: "filename".  The <ext> component is
  1036.     the file extention with no leading '.', ie.: "txt".  Recommended
  1037.     sizes for the components is Drive[4], Path[128], File[10], Ext[4].
  1038.  
  1039. char *_makepath(char *dst, *drive, *path, *file, *ext)
  1040.     Build the <dst> filename from component parts. Returns <dst>.
  1041.     This function is basically in inverse of _splitpath(), and will
  1042.     accept the components parsed by _splitpath() as input.  It will
  1043.     also allow a little more flexibility in that it will treat any
  1044.     component which is a NULL pointer as an empty field, and the
  1045.     <path> component may optionally have a trailing '\'.
  1046.  
  1047.  
  1048. 3.9 EXTENSIONS AND INTERNALS
  1049.  
  1050. The following functions are non standard but usefull sometimes.
  1051. Some are more internal dLib's functions.
  1052.  
  1053.  
  1054. int fileno(FILE *fp)
  1055.     Return the file handle associated with the stream <fp>.
  1056.  
  1057.  
  1058. int ungetchar(char c)
  1059.     Same as "fungetc(c, stdin)".  Note that this name will conflict
  1060.     with any function beginning "ungetch..." due to having only 7
  1061.     significant characters in external identifiers.
  1062.  
  1063. int getw(FILE *fp)
  1064.     Get a 2-byte value from the stream <fp>.  The high-order byte is
  1065.     read first.  Use feof() to test for end-of-file.
  1066.  
  1067. int putw(int n, FILE *fp)
  1068.     Put the 2-byte value <n> to the stream <fp>.  The high-order byte
  1069.     is written first.
  1070.  
  1071. int getl(FILE *fp)
  1072.     Get a 4-byte value from the stream <fp>.  The high-order byte is
  1073.     read first.  Use feof() to test for end-of-file.
  1074.  
  1075. int putl(long n, FILE *fp)
  1076.     Put the 4-byte value <n> to the stream <fp>.  The high-order byte
  1077.     is written first.
  1078.  
  1079. FILE *fdopen(int h, char *mode)
  1080.     Associates a stream with the already open file <h>.  The <mode>
  1081.     values are the same as for fopen(), but MUST be compatible with
  1082.     the mode in which <h> was open()ed.  This functions allows a file
  1083.     opened with the low level open()/creat() calls to be used as a
  1084.     buffered/translated stream.  A pointer to a FILE struct is returned,
  1085.     or NULL for errors.
  1086.  
  1087. ?????????????????????????????
  1088. FILE *fopenp(char *filename, char *mode)
  1089.     Find <filename> somewhere on the PATH and open it with <mode>.
  1090.     Refer to the fopen() function for valid <mode> values.  If you
  1091.     want to use a search path other than the PATH environment
  1092.     variable, use the pfindfile() function to locate the file, and
  1093.     pass that filename to fopen().  (cf: pfindfile, fopen)
  1094.  
  1095.  
  1096. 4. CHARACTER TYPE FUNCTIONS:
  1097.  
  1098. Standard character type functions. Include ctype.h to use them.
  1099. The macros use a table from the xdlibs.a library
  1100.  
  1101.  
  1102.     To use the functions in this section, you must include <ctype.h>
  1103.     in your source file.  Please note that the isxxxx() functions,
  1104.     except isascii(), only have defined results if isascii() is true.
  1105.     (ie. they only work properly on values 0x00 through 0x7F)
  1106.  
  1107. int toupper(int c)
  1108.     Convert <c> to upper case, if alphabetic.  This is implemeted
  1109.     as a macro and also as a function.  You may force use of the
  1110.     function version rather than the macro (which evaluates its
  1111.     argument twice) by using the "#undef toupper" directive.
  1112.  
  1113. int tolower(int c)
  1114.     Convert <c> to lower case, if alphabetic.  This is implemeted
  1115.     as a macro and also as a function.  You may force use of the
  1116.     function version rather than the macro (which evaluates its
  1117.     argument twice) by using the "#undef tolower" directive.
  1118.  
  1119. MACRO _toupper(int c)
  1120.     This macro should be used only if <c> is known to be lower case.
  1121.     It converts <c> to upper case.  Results are undefined if converting
  1122.     a character which is not lower case.
  1123.  
  1124. MACRO _tolower(int c)
  1125.     This macro should be used only if <c> is known to be upper case.
  1126.     It converts <c> to lower case.  Results are undefined if converting
  1127.     a character which is not upper case.
  1128.  
  1129. MACRO toascii(int c)
  1130.     Convert <c> to 7-bit ascii, putting it into the range 0x00..0x7F.
  1131.  
  1132. MACRO isalnum(int c)
  1133.     Return non-zero if <c> is '0'..'9','A'..'Z','a'..'z'.
  1134.  
  1135. MACRO isalpha(int c)
  1136.     Return non-zero if <c> is 'A'..'Z','a'..'z'.
  1137.  
  1138. MACRO isascii(int c)
  1139.     Return non-zero if <c> is 0x00..0x7F.
  1140.  
  1141. MACRO iscntrl(int c)
  1142.     Return non-zero if <c> is 0x00..0x1F,0x7F.
  1143.  
  1144. MACRO isdigit(int c)
  1145.     Return non-zero if <c> is '0'..'9'.
  1146.  
  1147. MACRO isgraph(int c)
  1148.     Return non-zero if <c> is 0x21..0x7E.
  1149.  
  1150. MACRO islower(int c)
  1151.     Return non-zero if <c> is 'a'..'z'.
  1152.  
  1153. MACRO isprint(int c)
  1154.     Return non-zero if <c> is 0x20..0x7E.
  1155.  
  1156. MACRO ispunct(int c)
  1157.     Return non-zero if <c> is not iscntrl(), isalnum() or isspace().
  1158.  
  1159. MACRO isspace(int c)
  1160.     Return non-zero if <c> is 0x09..0x0D,0x20.
  1161.  
  1162. MACRO isupper(int c)
  1163.     Return non-zero if <c> is 'A'..'Z'.
  1164.  
  1165. MACRO isxdigit(int c)
  1166.     Return non-zero if <c> is '0'..'9','A'..'F','a'..'f'.
  1167.  
  1168. 5.STRING FUNCTIONS:
  1169.  
  1170. String related functions. Some conversion functions are put in here too.
  1171. Include string.h for using them.
  1172.  
  1173. STRING MANIPULATION:
  1174.  
  1175. int strlen(char *string)
  1176.     Returns the number of characters in a string, not including the
  1177.     terminating '\0'.
  1178.  
  1179. char *strcpy(char *dest, char *source)
  1180.     Copies the <source> string to the <dest> including the '\0'.  A
  1181.     pointer to the start of <dest> is returned.
  1182.  
  1183. char *strncpy(char *dest, char *source, int limit)
  1184.     Copies the <source> string to the <dest>.  At most, <limit>
  1185.     characters are copied.  If <source> ends before <limit> characters
  1186.     have been copied, the '\0' is copied, otherwise <dest> is not
  1187.     terminated by the copy.
  1188.  
  1189. char *strpcpy(char *dest, char *start, char *stop)
  1190.     Copies characters from <start> up to <stop> into <dest>.  The
  1191.     character pointed to by <stop> is not copied, and MUST be in the
  1192.     same string as <start>.  The <dest> pointer is returned.
  1193.  
  1194. char *strdup(char *string)
  1195.     Create a copy of <string> and return a pointer to the copy.
  1196.     Storage for the copy is obtained from malloc().
  1197.  
  1198. char *strset(char *string, char c)
  1199.     Fill <string> with <c> up the the terminating '\0' of <string>.
  1200.  
  1201. char *strnset(char *string, char c, int n)
  1202.     Fill at most <n> characters of <string> with <c>, up the the
  1203.     terminating '\0' of <string>.
  1204.  
  1205. char *substr(char *dest, char *source, int start, int end)
  1206.     Copy characters from <source> to <dest> starting with character
  1207.     <start> and ending with <end>.  A pointer to <dest>, which will
  1208.     be '\0' terminated, is returned.
  1209.  
  1210. char *subnstr(char *dest, char *source, int start, int length)
  1211.     Copy <length> characters from <source> to <dest> starting with
  1212.     character <start>.  A pointer to <dest>, which will be '\0'
  1213.     terminated, is returned.
  1214.  
  1215. char *strcat(char *dest, char *source)
  1216.     Concatenate <source> on the end of <dest>.  The terminator of
  1217.     <dest> will be overwritten by the first character of <source>.
  1218.     The termintor from <source> will be copied.  A pointer to
  1219.     the modified <dest> is returned.
  1220.  
  1221. char *strncat(char *dest, char *source, int limit)
  1222.     Concatenate <limit> characters from <source> onto <dest>.  If
  1223.     <source> contains less than <limit> characters, the length of
  1224.     source is used for <limit>.  The terminating '\0' is always
  1225.     added.  A pointer to <dest> is returned.
  1226.  
  1227. char *strupr(char *string)
  1228.     Convert all alphabetic characters in <string> to upper case.
  1229.  
  1230. char *strlwr(char *string)
  1231.     Convert all alphabetic characters in <string> to lower case.
  1232.  
  1233. char *strrev(char *string)
  1234.     Reverse the order of the characters in <string> in place.
  1235.  
  1236. int strcmp(char *str1, char *str2)
  1237.     Lexicographically compare the two strings.  Return a value
  1238.     indicating the relationship between the strings.  Possible
  1239.     return values are:
  1240.         negative    str1 < str2
  1241.         0        str1 == str2
  1242.         positive    str1 > str2
  1243.  
  1244. int strncmp(char *str1, char *str2, int limit)
  1245.     Compare strings as with strcmp(), but limit comparison to the
  1246.     <limit> characters.
  1247.  
  1248. int stricmp(char *str1, char *str2)
  1249.     Compare strings as with strcmp(), but ignore the case of any
  1250.     alphabetic characters.
  1251.  
  1252. int strnicmp(char *str1, char *str2, int limit)
  1253.     Compare strings as with strncmp(), but ignore the case of any
  1254.     alphabetic characters.
  1255.  
  1256. char *strstr(char *string, char *pattern)
  1257.     Return a pointer to the first occurance of <pattern> in <string>.
  1258.     NULL is returned if <pattern> is not found.
  1259.  
  1260. char *stristr(char *string, char *pattern)
  1261.     Same as strstr(), but ignore the case of any alphabetic characters.
  1262.  
  1263. char *strchr(char *string, char symbol)
  1264.     Return a pointer to the first occurance of <symbol> in <string>.
  1265.     NULL is returned if <symbol> is not found.  '\0' is included in
  1266.     the search.
  1267.  
  1268. char *strrchr(char *string, char symbol)
  1269.     Return a pointer to the last occurance of <symbol> in <string>.
  1270.     NULL is returned if <symbol> is not found.  '\0' is included in
  1271.     the search.
  1272.  
  1273. int strpos(char *string, char symbol)
  1274.     Return the index of the first occurance of <symbol> in <string>.
  1275.     -1 is returned if <symbol> is not found.
  1276.  
  1277. int strrpos(char *string, char symbol)
  1278.     Return the index of the last occurance of <symbol> in <string>.
  1279.     -1 is returned if <symbol> is not found.
  1280.  
  1281. int strspn(char *string, char *set)
  1282.     Return the length of the sub-string of <string> that consists
  1283.     entirely of characters found in <set>.  The terminating '\0'
  1284.     in <set> is not considered part of the match set.  If the first
  1285.     character if <string> is not in <set>, 0 is returned.
  1286.  
  1287. int strcspn(char *string, char *set)
  1288.     Return the length of the sub-string of <string> that consists
  1289.     entirely of characters not found in <set>.  The terminating '\0'
  1290.     in <set> is not considered part of the match set.  If the first
  1291.     character if <string> is in <set>, 0 is returned.
  1292.  
  1293. char *strpbrk(char *string, char *set)
  1294.     Return a pointer to the first occurance in <string> of any
  1295.     character in <set>.
  1296.  
  1297. char *strrpbrk(char *string, char *set)
  1298.     Return a pointer to the last occurance in <string> of any
  1299.     character in <set>.
  1300.  
  1301. char *strtok(char *string, char *delim)
  1302.     Return a token from <string>.  If <string> is not NULL, it is
  1303.     the beginning of a string from which tokens are to be extracted.
  1304.     Characters found in <delim> are skipped over to find the start
  1305.     of a token, characters are then accumulated until a character in
  1306.     <delim> is found, or the terminator of <string> is reached.
  1307.     A pointer to the '\0' terminated token is then returned.  Note
  1308.     that this function modifies <string> (by inserting '\0's) in
  1309.     the process.  Subsequent calls to strtok() may specify NULL as
  1310.     the <string> argument, in which case subsequent tokens are
  1311.     returned, or NULL if there are no more tokens.
  1312.  
  1313. char *strtrim(char *string, char *junk)
  1314.     Remove leading and trailing characters found in <junk>
  1315.     from <string>.  Return a pointer to the modified <string>.
  1316.  
  1317. char *stradj(char *string, int dir)
  1318.     Adjust <string> by adding space if <dir> is positive, or removing
  1319.     space if <dir> is negative.  The magnitude of <dir> is the number
  1320.     of character positions to add or remove.  Characters are added or
  1321.     removed at the beginning of <string>.  A pointer to the modified
  1322.     <string> is returned.
  1323.  
  1324. int strrpl(char *string, char *ptrn, char *rpl, int n)
  1325.     Replace at most <n> occurances of <ptrn> in <string> with <rpl>.
  1326.     If <n> is -1, replace all.  Return the number of replacments.
  1327.  
  1328. int strirpl(char *string, char *ptrn, char *rpl, int n)
  1329.     Same as strrpl() except ignore the case of alphabetic characters.
  1330.  
  1331. char *memmove(char *dest, char *source, int len)
  1332.     Copies the <source> block to the <dest>.  <len> bytes are
  1333.     always copied.  No terminator is added to <dest>.  A pointer
  1334.     to <dest> is returned.  Overlap checking IS done.
  1335.  
  1336. char *lmemmove(char *dest, char *source, long len)
  1337.     Same as memmove() except a long value is used for <len>.
  1338.  
  1339. char *memcpy(char *dest, char *source, int len)
  1340.     Copies the <source> block to the <dest>.  <len> bytes are
  1341.     always copied.  No terminator is added to <dest>.  A pointer
  1342.     to <dest> is returned.  Overlap checking IS NOT done.
  1343.  
  1344. char *lmemcpy(char *dest, char *source, long len)
  1345.     Same as memcpy() except a long value is used for <len>.
  1346.  
  1347. char *memset(char *dest, char data, int len)
  1348.         Set <len> bytes of <dest> to <data>.  A pointer to <dest>
  1349.     is returned.
  1350.  
  1351. int memcmp(char *blk1, char *blk2, int len)
  1352.     Lexicographically compare the two blocks.  Return a value
  1353.     indicating the relationship between the blocks.  Possible
  1354.     return values are:
  1355.         negative    blk1 < blk2
  1356.         0        blk1 == blk2
  1357.         positive    blk1 > blk2
  1358.     <len> bytes are always compared.
  1359.  
  1360. int memicmp(char *blk1, char *blk2, int len)
  1361.     Compare blocks as with memcmp(), but ignore the case of any
  1362.     alphabetic characters.
  1363.  
  1364. char *memccpy(char *dst, char *src, char c, int cnt)
  1365.     Copy bytes from <src> to <dst> until either <cnt> bytes have been
  1366.     copied, or the character <c> has been copied.  If <c> is found,
  1367.     a pointer to the character following <c> in <dst> is returned, or
  1368.     NULL is <cnt> reaches 0 before <c> is found.
  1369.  
  1370. char *memchr(char *buf, char c, int cnt)
  1371.     Search the first <cnt> bytes of <buf> for <c>.  Returns a pointer to
  1372.     the matching character, or NULL if not found.
  1373.  
  1374. char *bzero(char *buf, int cnt)
  1375.     Zero <cnt> characters in <buf>.  Returns <buf>.
  1376.  
  1377.  
  1378. FORMATTING /TYPE CONVERSION
  1379.  
  1380. char *ltoa(long n, char *buffer, int radix)
  1381.     Convert the long value <n> to a string in <buf> using <radix>
  1382.     as the number base.  If <n> is negative, '-' will be the first
  1383.     character in <buf>.  A pointer to <buf> is returned.
  1384.  
  1385. char *ultoa(unsigned long n, char *buffer, int radix)
  1386.     Convert the unsigned long value <n> to a string in <buf> using
  1387.     <radix>    as the number base.  A pointer to <buf> is returned.
  1388.  
  1389. char *itoa(int n, char *buffer, int radix)
  1390.     Convert the integer value <n> to a string in <buf> using <radix>
  1391.     as the number base.  If <n> is negative, '-' will be the first
  1392.     character in <buf>.  A pointer to <buf> is returned.
  1393.  
  1394. char *ctlcnv(char *string)
  1395.     Convert \<char> notation in <string> to actual characters.  This
  1396.     is useful for reading strings from a stream when you want to allow
  1397.     insertion of control character or other characters that may have
  1398.     special meaning otherwise, or may not otherwise be allowed.  The
  1399.     following formats are supported:
  1400.         \n        newline or linefeed
  1401.         \r        carriage return
  1402.         \0        null character (value 0)
  1403.         \b        backspace
  1404.         \t        horizontal tab
  1405.         \v        vertical tab
  1406.         \f        form feed
  1407.         \a        alarm (bell)
  1408.         \\        backslash
  1409.         \'        single quote
  1410.         \"        double quote
  1411.         \NNN        octal constant
  1412.         \xNN        hexadecimal constant
  1413.         \<nl>        "folded" line (both characters removed)
  1414.     A pointer to the modified <string> is returned.
  1415.  
  1416.  
  1417. 6. ASSERT AND ERRORHANDLING
  1418.  
  1419. error handling:
  1420. To use the assert macro include assert.h.
  1421.  
  1422. MACRO assert(condition)
  1423.     If <condition> is not true at run-time, this macro causes an
  1424.     assert failure message to be written to stderr, displaying the
  1425.     line number and source file name, and aborts the program.  If
  1426.     the symbol NDEBUG is #defined (usually with a -D option to cc),
  1427.     all assert() calls are disabled.
  1428.  
  1429. long    teststack()
  1430.     Non standard function, but helpful for debugging stack problems.
  1431.     It will return the number of bytes free stack. If the value is
  1432.     negative, the stack growing into the program's code.
  1433.     (extended.lib)
  1434.  
  1435.  
  1436. ERROR HANDLING FUNCTIONS:
  1437.  
  1438. extern int errno;
  1439.     This variable is set to zero when the program is loaded.  It is
  1440.     not zeroed by any library functions, but may be set to a non-zero
  1441.     error number by many of them (particularly the standard i/o and
  1442.     system service functions).  The meaning of this error number may
  1443.     be found in the symbolic #defines in <errno.h>, or by calling the
  1444.     seterror() functions as described below.  (cf: seterror)
  1445.  
  1446. void perror(char *msg)
  1447.     Write, to stderr, <msg> (if non-null and non-empty), followed by
  1448.     ": " and a system error messaged derived from the value of errno.
  1449. (from stdio.h)
  1450.  
  1451. char *strerror(errnum)
  1452.     Return the system error message for error <errnum>.  If <errnum>
  1453.     is outside the range of valid error numbers, NULL is returned.
  1454. (from string.h)
  1455.  
  1456. non standard function:
  1457.  
  1458. void perrorf(char *fmt[, arg1, ..., argN])
  1459.     Write, to stderr, the name of the program, followed by ": ",
  1460.     followed by a message formatted as by printf() from <fmt> and
  1461.     the optional arguments, followed by ": " and a system error
  1462.     message derived from the value of errno.  This is a non-standard
  1463.     extended version of perror().  (cf: printf, perror)
  1464. (from misc.h)
  1465.  
  1466.  
  1467. 7. VARIABLE ARGUMENT LISTS: 
  1468. The macros in this section are defined in the <stdarg.h> header file.
  1469.  
  1470. typedef    ... va_list;
  1471.     This is the type for a variable argument list traversal variable.
  1472.  
  1473. MACRO va_start(list, param)
  1474.     This macro initializes the va_list variable <list> to begin
  1475.     traversing variable argument lists.  <param> is the last parameter
  1476.     in the function call before the variable arguments begin.  This
  1477.     parameter MUST NOT be a register variable.
  1478.  
  1479. MACRO va_arg(list, type)
  1480.     This macro retrieves a variable argument of type <type>, updates
  1481.     the va_list variable <list>, and returns the value of the retrieved
  1482.     argument.  The <type> should not be parenthesised.
  1483.  
  1484. MACRO va_end(list)
  1485.     This macro must be called after all desired variable arguments have
  1486.     been retrieved, to reset the context of the va_list variable <list>.
  1487.  
  1488.  
  1489. 8. GLOBAL JUMPS:
  1490.  
  1491. Some more process control. Include setjmp.h for using this functions.
  1492.  
  1493. int setjmp(jmp_buf context)
  1494.     Save <context> for longjmp(). You MUST include <setjmp.h> to use.
  1495.     Calling this function saves the current program context in the
  1496.     context buffer provided and returns zero.  A later call to the
  1497.     longjmp() function will cause the context to be restored and
  1498.     your program will continue as if it just returned from setjmp(),
  1499.     but this time with the (non-zero) return value specified in the
  1500.     longjmp() call.  THE SAVED CONTEXT WILL NOT BE VALID IF YOU
  1501.     EXIT THE FUNCTION THAT CALLED setjmp().
  1502.  
  1503. void longjmp(jmp_buf context, int rv)
  1504.     Return <rv> to the <context> saved by setjmp(). (cf: setjmp)
  1505.     You MUST include <setjmp.h> to use.
  1506.  
  1507.  
  1508. The following two are non-standard.
  1509.  
  1510. int catch(jmp_buf context, int (*func)())
  1511.     Execute <func> with <context> saved for throw().  You MUST include
  1512.     <setjmp.h> to use.  Return the value returned by <func>.  The main
  1513.     advantage of these functions over catch/throw is the ability to
  1514.     return zero from the function executed, and the logically "cleaner"
  1515.     encapsulation of the non-local jump operation.  These functions
  1516.     are patterned after similar functions in LISP.  (cf: setjmp/longjmp)
  1517.  
  1518. void throw(jump_buf context, int rv)
  1519.     Return <rv> to <context> saved by catch().  You MUST include
  1520.     <setjmp.h> to use.
  1521.  
  1522.  
  1523.  
  1524.  
  1525. 9. DATE/TIME FUNCTIONS:
  1526. To use the functions in this section, you must include <time.h>
  1527. in your source file.
  1528.  
  1529. TYPE time_t, defined in types.h is used for rawtime values.  These are NOT
  1530. seconds since 1970, but a encoded time value with DATE in highword and TIME
  1531. in lowword (for time comparisons) cause on ATARI TOS machines one can't be
  1532. shure to find a TIMEZONE environment variable to do a propper encoding.
  1533.  
  1534.    All time functions, including stat and fstat use this local time time_t
  1535.    format. No function makes any changes to the values, just the encoding
  1536.    is changed!
  1537.    Soon gmtime(), unixtime() and tostime() will be implemented, these 
  1538.    functions will try to calculate the asked values if a
  1539.    TIMEZONE environment variable (TZ=...) is available on runtime.
  1540.    
  1541.    To get a current local time string do this:
  1542.  * time_t now;
  1543.  * char    time_string[26];
  1544.  * time (&now);
  1545.  * strcpy(time_string, ctime(&now));
  1546.    Think of the newline in time_string[25]!
  1547.    
  1548.    The stat structure contains a time_t value, too. To print a file's date
  1549.    after calling stat with mystat_buffer write:
  1550.  * struct stat mystat_buffer;
  1551.  * char    time_string[26];
  1552.  * // if(!stat(filename, &mystat_buffer));
  1553.  * strcpy(time_string, ctime(&mystat_buffer->st_time));
  1554.    
  1555.    If you have a tm structure filled with some values, you can get a 
  1556.    time string from this by:
  1557.  * struct tm mytime;
  1558.  * char    time_string[_TIME_STRING];
  1559.  * strcpy(time_string, asctime(&mytime));
  1560.   
  1561.    If you want to get an encoded time value from a tm structure (e.g
  1562.    for setting a file's time stamp with utime())
  1563.  * struct tm mytime;
  1564.  * // fill in the values
  1565.  * time_t thistime;
  1566.  * thistime = mktime(&mytime);
  1567.   
  1568.    If you want to get a tm structure filled with values according to a 
  1569.    time_t value use localtime() function. 
  1570.  * time_t thistime;
  1571.  * struct tm *time_struct;
  1572.  * // get a value in thistime
  1573.  * time_struct = localtime(&thistime);
  1574.  
  1575. time_t time(time_t *rawtime)
  1576.     Get the current system clock date/time value.  Altough the value
  1577.     of this function is compatible with the ANSI proposed standard,
  1578.     on some systems (notably System V), this function returns the
  1579.     number of seconds elapsed since 00:00:00 GMT on Jan 1, 1970.
  1580.     This implementation returns an encoded date/time value instead.
  1581.     Therefore any programs which depend on this value being a number
  1582.     of seconds will not work properly.  However, other functions in
  1583.     this section which make use of the raw time value returned by
  1584.     time() are implemented to be compatible with this encoding, and
  1585.     will work properly.  In addition to returning the raw time value,
  1586.     if the <rawtime> pointer is not NULL, the value is stored in
  1587.     the time_t variable <rawtime> points to.
  1588.  
  1589. char *ctime(time_t *rawtime)
  1590.     Convert <rawtime> to a string.  A 26 character fixed field string
  1591.     is created from the raw time value.  The following is an example
  1592.     of what this string might look like:
  1593.         "Wed Jul 08 18:43:07 1987\n\0"
  1594.     A 24-hour clock is used, and due to a limitation in the ST system
  1595.     clock value, only a resolution of 2 seconds is possible.  A pointer
  1596.     to the formatted string, which is held in an internal buffer, is
  1597.     returned.
  1598.  
  1599. struct tm *localtime(time_t *rawtime)
  1600.     Convert <rawtime> to fill time structure fields.  A pointer to an
  1601.     internal structure is returned.  Refer to <time.h> for the values
  1602.     of the various structure fields.
  1603.  
  1604. struct tm *gmtime(time_t *rawtime)
  1605.     Since there is not concept of "time zone" on the ST, this function
  1606.     returns NULL, as specified by the proposed ANSI standard.
  1607.     (will work soon)
  1608.  
  1609. char *asctime(struct tm *time)
  1610.     Convert <time> structure value to a string.  The same format, and
  1611.     the same internal buffer, as for ctime() is used for this function.
  1612.  
  1613. time_t mktime(struct tm *time)
  1614.     Convert <time> structure value to raw time format.
  1615.  
  1616. int utime(char *pathname, long *rawtime)
  1617.     Set the modification date of <pathname> to <rawtime>.  Returns zero
  1618.     for success, or a negative error code.
  1619.  
  1620. clock_t clock()
  1621.     Returns the elapsed time since progstart.  The value divded by 
  1622.     CLK_TCK, will give you elapsed seconds.
  1623.     This works only with an '*_s.o' startup code, cause setting
  1624.     _starttime is done in _main().
  1625.     
  1626.  
  1627. 10. UNISTD, STAT AND FCNTL
  1628.  
  1629. Standard OS calls library functions. Using this calls your code will be
  1630. still portable in most cases.
  1631. Include the files in brackets at aeach function, if you make use of one of
  1632. these functions. Some functions return with ERROR if there was one, and
  1633. should set errno, but some still don't do this.
  1634.  
  1635. 10.1 FILE HANDLING:
  1636.  
  1637. int access(char *name, int amode)
  1638.     Returns zero if a file with the given <name> can be accessed
  1639.     in the given <amode>.  Possible <amode> values are:
  1640.         F_OK         file exists
  1641.         X_OK         file is executable
  1642.         W_OK         file can be written
  1643.         R_OK         file can be read (TOS: not hidden)
  1644.         (R_OK|W_OK)    file can be read and written
  1645.     (unistd.h)
  1646.  
  1647. int chdir(char *pathname)
  1648.     Changes the current working directory to <pathname>.  If a
  1649.     device is specified in <pathname>, the current drive is
  1650.     changed too. Returns 0 for success, or ERROR if there was an
  1651.     error. 
  1652.     (unistd.h)
  1653.  
  1654. int chmod(char *filename, int pmode)
  1655.     Change the mode attribute of <filename> to <pmode>.  Values for
  1656.     <pmode> are the same as for the creat() function.  Returns 0 for
  1657.     success, or a negative error code.
  1658.     (stat.h)
  1659.  
  1660. int chown()
  1661.     still missing
  1662.     (unistd.h)
  1663.  
  1664. int close(int handle)
  1665.     Close file referenced by the file handle <h>.  Return 0 for
  1666.     success, or a negative error code.
  1667.     (unistd.h)
  1668.  
  1669. int creat(char *filename, int pmode)
  1670.     Create a new file with the given <filename>.  If a file with
  1671.     the name already exists, it will be truncated to zero bytes.
  1672.     <pmode> specifies the attributes, initially given to the file.
  1673.     If 0 `0644' is assumed other valid <pmode> values are:
  1674.         S_IREAD    readable
  1675.         S_IWRITE    writeable
  1676.         S_IEXEC    executeable
  1677.     If Mint is active the following values make sense:
  1678.         S_IRUSR/S_IRGRP/S_IROTH    read
  1679.         S_IWUSR/S_IWGRP/S_IWOTH    write
  1680.         S_IXOTH/S_IXGRP/S_IXUSR    execute
  1681.     Not all filesystems support these bits, so maybe some are ignored.
  1682.     (fcntl.h, stat.h)
  1683.  
  1684. int dup(int handle)
  1685.     Return a second file handle which refers to the same file as
  1686.     the given <handle>. (cf: dup2)
  1687.     (unistd.h)
  1688.  
  1689. int dup2(int handle1, int handle2)
  1690.     Force <handle2> to refer to the same file as <handle1>.  Return
  1691.     0 for success, or a negative error code.  Both dup() and dup2()
  1692.     are direct calls to Fdup() and Fforce() GEMDOS calls.  Refer to
  1693.     your GEMDOS documentation for further information.
  1694.     will change for MiNT
  1695.     (unistd.h)
  1696.  
  1697. long fsize(char *name)
  1698.     Return the size of the file <name> in bytes.  Note that this
  1699.     is a long value.  Return -1L if the file is not found.
  1700.     NON PORTABLE
  1701.     (unistd.h.h)
  1702.  
  1703. char *getcwd(char *buffer, int size)
  1704.     Get the full pathname of the current working directory.  This
  1705.     value will ALWAYS end with a '\\' character.  <pathbuf> is a
  1706.     pointer to a buffer of <size> bytes that will be used to store
  1707.     the current working directory.  If <buffer> is NULL, a buffer
  1708.     of <size> bytes will be malloc()ed.  The function returns a
  1709.     pointer to the buffer for success, or NULL for failure, either
  1710.     because malloc() failed, or the value is larger than <size>.
  1711.     This function uses fullpath() to get the pathname, therefore
  1712.     the buffer internal to fullpath() is overwritten.
  1713.     (unistd.h.h)
  1714.  
  1715. int isatty(int handle)
  1716.     Return non-zero if <handle> refers to a character device.
  1717.     Negative handles always refer to character devices.
  1718.     (unistd.h.h)
  1719.  
  1720. int link()
  1721.     still missing
  1722.  
  1723. long lseek(int h, long offset, int origin)
  1724.     Move file pointer for file <h> to specified location.  <origin>
  1725.     specifies the starting point for the <offset> distance.  Valid
  1726.     <origin> values are:
  1727.         SEEK_SET    from beginning of file    (0)
  1728.         SEEK_CUR    from current location    (1)
  1729.         SEEK_END    from end of file    (2)
  1730.     The <offset> value is the distance in bytes from the origin.
  1731.     The final file position, or a negative error code, is returned.
  1732.     (unistd.h.h)
  1733.  
  1734. int mkdir(char *pathname)
  1735.     Creates a new directory called <pathname>.  A drive letter may
  1736.     be specified.  Returns 0 for success, or a negative error code.
  1737.     THIS FUNCTION MAYBE NOT PORTABLE.
  1738.     (stat.h)
  1739.  
  1740. int open(char *filename, int iomode[, pmode])
  1741.     Attempt to open <filename> with the given <iomode>.  A file handle
  1742.     is returned if the open succeeds.  A negative error code is returned
  1743.     for errors.  Valid <iomode> values are:
  1744.         O_RDONLY    read mode
  1745.         O_WRONLY    write mode
  1746.         O_RDWR        read/write mode
  1747.     In addition to the (mutually exclusive) modes above, one or more
  1748.     of the following options may be |-ed with <iomode>:
  1749.         O_APPEND    start file pointer at end of file
  1750.         O_TRUNC        if file exists, truncate to 0 length
  1751.         O_CREAT        creat() file if none exists (uses <pmode>!!)
  1752.         O_EXCL        return EEXIST if file exists and
  1753.                 O_CREAT is specified (exclusive mode).
  1754.     Note: It is possible to open the character devices "con:", "aux:",
  1755.     and "prn:" with this call, and negative handles (-1..-3) will be
  1756.     returned.  Error returns are always < -3.  The <fcntl.h> file
  1757.     contains iomode constants.  For pmode constants see creat().
  1758.     (fcntl.h)
  1759.  
  1760. int pipe()
  1761.     still missing
  1762.  
  1763. int rmdir(char *pathname)
  1764.     Removes an existing directory called <pathname>.  A drive letter may
  1765.     be specified.  Returns 0 for success, or a negative error code.
  1766.     THIS FUNCTION MAYBE NOT PORTABLE.
  1767.     (unistd.h)
  1768.  
  1769. int stat(char *name, struct stat *statbuf)
  1770.     Search for file <name> and load <statbuf> with information
  1771.     about that file, if it is found.  Return 0 if found, or
  1772.     ERROR (-1) if no file/directory matched <name>.  Volume
  1773.     labels are not included in the search.  The file <stat.h>
  1774.     must be included if you use this functions, since it defines
  1775.     struct stat you have to allocate first.
  1776.     (stat.h)
  1777.  
  1778. long tell(int h)
  1779.     Return the current file position for the file <h>.
  1780.     (unistd.h)
  1781.  
  1782. int unlink(char *filename)
  1783.     Delete <filename>, if it exists.  Return 0 for success, or a
  1784.     negative error code.
  1785.     Of course it should really do unlink() if MiNT is present, it
  1786.     doesn't yet.
  1787.     (unistd.h)
  1788.  
  1789. sync()
  1790.     Provided for compatibility.  #define'ed as a comment.
  1791.  
  1792.  
  1793. 10.2 INPUT/OUTPUT FUNCTIONS:
  1794.  
  1795. int read(int h, char *data, int length)
  1796.     Read <length> bytes from the file reference by file handle <h>.
  1797.     Data is stored in the buffer pointed to by <data>.  The number
  1798.     of bytes actually read is returned, 0 for end of file, or a
  1799.     negative error code.  Note that the maximum number of bytes
  1800.     that can be read by this function is MAXINT.
  1801.     (unistd.h)
  1802.  
  1803. long lread(int h, char *data, long length)
  1804.     Same as read(), but uses a long value for number of bytes to read.
  1805.     (unistd.h)
  1806.  
  1807. int write(int h, char *data, int length)
  1808.     Write <length> bytes to the file reference by file handle <h>.
  1809.     Data is written from the buffer pointed to by <data>.  The number
  1810.     of bytes actually written is returned, or a negative error code.
  1811.     Note that the maximum number of bytes that can be written by
  1812.     this function is MAXINT.
  1813.     (unistd.h)
  1814.  
  1815. long lwrite(int h, char *data, long length)
  1816.     Same as write(), but uses a long value for number of bytes to write.
  1817.     (unistd.h)
  1818.  
  1819. 10.3 PROCESS CONTROL:
  1820.  
  1821. int alarm()
  1822.     still missing
  1823.  
  1824. int brk(void *address)
  1825.     Set the "break" to <address>.  Return 0 for success.  If <address>
  1826.     is not a valid break value, return -1 and don't move the break.
  1827.     HANDS OFF, this shrinks stacksize, and won't work with
  1828.     accessories or programs using the accapp_s.o startup code.
  1829.     (malloc.h)
  1830.  
  1831. int getpid() 
  1832.     Return an integer value unique for this process.
  1833.     (fake function, will be fixed soon)
  1834.  
  1835. int getuid()
  1836. int getgid() 
  1837. int geteuid() 
  1838. int getegid() 
  1839.     non existing
  1840.  
  1841. void exit()
  1842. void _exit()
  1843.     see chapter to stdlib.h
  1844.  
  1845. int kill()
  1846.     will be implemented soon
  1847.  
  1848. int nice()
  1849.     still missing
  1850.  
  1851. int pause()
  1852.     will be implemented soon
  1853.  
  1854. char *sbrk(int amount)
  1855.     Move the "break" by <amount>.  The break is the line between the
  1856.     top of the heap and the bottom of the stack.  The size of the
  1857.     stack/heap area is defined by _STKSIZ.  Initially, the heap uses
  1858.     zero bytes.  Since malloc() doesn't use the heap, often the heap
  1859.     will stay that way.  This function moves the location of the break
  1860.     by <amount> bytes, positive or negative, and returns the old value
  1861.     of the break.  If this causes a collision with the stack, or a
  1862.     negative value reduces the heap below zero bytes, NULL is returned
  1863.     and the break is not moved.  Note that the heap pointer is moved by
  1864.     EXACTLY the <amount> specified.  If you want to ensure that sbrk()
  1865.     will return word-aligned memory segments, you must make sure that
  1866.     <amount> is always even, since the heap is initially aligned
  1867.     properly.  HANDS OFF, this shrinks stacksize, and won't work with
  1868.     accessories or programs using the accapp_s.o startup code.
  1869.     (malloc.h)
  1870.  
  1871. int setuid()
  1872. int setgid() 
  1873.     still missing
  1874.  
  1875. int (* signal(int sig, int (*func)()));
  1876.     will be implemented soon
  1877.  
  1878. unsigned int sleep(unsigned int seconds) 
  1879.     Suspend process for seconds. 
  1880.  
  1881.     This is implemented as a start_timer()/time_since() tight loop
  1882.     waiting for the specified amount of time to pass.
  1883.     If MiNT is present this is done by a alarm signal.
  1884.     include <time.h>
  1885.     (unistd.h)
  1886.  
  1887. int stime(time_t *rawtime)
  1888.     Set the system clock to <rawtime>. See time.h.
  1889.     (unistd.h)
  1890.  
  1891. time_t time(time_t *rawtime)
  1892.     Get the current system clock date/time value.
  1893.     include <time.h>, see chapter Date/time functions
  1894.  
  1895. void usleep(unsigned long usec)
  1896.     was: void usleep(int dt) !!!!!!!!!!!!!!!
  1897.     Suspend operation for usec microseconds.  Works like sleep().
  1898.     Only milliseconds are taken into account!
  1899.     If MiNT is present it calls sleep() to get usec small enough for 
  1900.     Fselect() calls.     include <time.h>
  1901.     (unistd.h)
  1902.  
  1903.  
  1904. 10.4 CREATE CHILD PROCESSES:
  1905.  
  1906. include <unistd.h> for access to this functions
  1907.  
  1908. int exec...
  1909. int fork()
  1910.     missing, will be implemented, for MiNT can handle this
  1911.  
  1912. Since it is not possible to do a true Unix-style fork() without MiNT,
  1913. the functionality of the fork()/exec() pair is provided by these 
  1914. following fork...() functions.  They are to find in 'extended.lib',
  1915. not in 'xdlibs.a' itself.
  1916. A program is executed, it's return-value is returnded by this fork..()
  1917. functions. With the pseudo wait() function you will get status and
  1918. return value. errno is set if an error occurs, it is set to 0 if no
  1919. error ocurred.
  1920.  
  1921. Note that by convention <arg0> should be the name of the program that
  1922. is being called, if it is empty the function will do this for you.
  1923.  
  1924. The new ARGV arguments passing scheme is always used, including empty
  1925. arguments handling.
  1926.  
  1927. int forkl(char *program[, char *arg0, char *arg1, ..., char *argN], NULL)
  1928.  
  1929. int forkv(char *program, char **argv)
  1930.     Like forkl() except <argv> points to a NULL terminated list of
  1931.     pointers to arguments.  This is particularly useful if the number
  1932.     of arguments is not known at compile time.
  1933.  
  1934. int forklp(char *program[, char *arg0, char *arg1, ..., char *argN], NULL)
  1935.     Use the environment variable "PATH" to find <program>.
  1936.     And if no extension, try the default ones. (cf: forkl)
  1937.  
  1938. int forkvp(char *program, char **argv)
  1939.     Like forklp() except <argv> points to a NULL terminated list of
  1940.     pointers to arguments.
  1941.  
  1942. int forkle(char *program[, char *arg0, char *arg1, ..., char *argN],
  1943.                 NULL, char *env0, ... char *envn, NULL)
  1944.     Pass the environment strings <env0> etc to the child process. 
  1945.     (cf: forkl) 
  1946.  
  1947. int forklpe(char *program[, char *arg0, char *arg1, ..., char *argN],
  1948.                  NULL, char *env0, ... char *envn, NULL)
  1949.     Use the environment variable "PATH" to find <program> and
  1950.     pass the environment strings <env0> etc. to the child process. 
  1951.  
  1952. int forkve(char *program, char **argv, char **envp)
  1953.     Pass the environment strings from <envp> (<envp> points to a NULL
  1954.     terminated list of pointers to env strings)
  1955.     to the child process. (cf: forkv)
  1956.  
  1957. int forkvpe(char *program, char **argv, char **envp)
  1958.     Use the environment variable "PATH" to find <program> and
  1959.     pass the environment strings from <envp> to the child
  1960.     process. (cf: forkve) 
  1961.  
  1962. int forkvep(char *program, char **argv, char *envp)
  1963.     Pass the environment <envp> to the child process. (cf: forkv)
  1964.     (provided for compatibility with elder versions, though the
  1965.     functions name changed!!)
  1966.  
  1967. int forkvpep(char *program, char **argv, char *envp)
  1968.     Use the environment variable "PATH" to find <program> and
  1969.     pass the environment <envp> to the child process. (cf: forkv)
  1970.     (provided for compatibility with elder versions, though the
  1971.     functions name changed!!)
  1972.  
  1973. int wait(int *rvp)
  1974.     fake function 
  1975.     Wait for a child process to terminate.  Return -1 if there are
  1976.     no children.  Normal return is the process id number of the
  1977.     terminated child.  <rvp> is an pointer to the place to store
  1978.     the return value and exit status.  The high byte of the word
  1979.     pointed to be <rvp> will contain the value returned from the
  1980.     child through exit().  The low byte will contain 0 if the process
  1981.     terminated normally, or an error code if abnormally:
  1982.     If it is -1 the return value is a GEMDOS error from Pexec,
  1983.     that means no process was created; if it is 1, the process returned
  1984.     with an error (mostly ENSMEM).
  1985.     If it is (& 0x80) the child was killed by signal/exception.
  1986.     If you mask off 0x80 you will get the signal number. This time you
  1987.     will only find SIGINT (terminated by ^C) or SIGBUS (for an exception)
  1988.     (unistd.h)    
  1989.  
  1990.  
  1991. void shell()
  1992.     Invoke a command line interface shell.  If the "SHELL" environment
  1993.     variable is not defined, a prompt showing the current working
  1994.     directory will be given.  Each line entered will then be passed
  1995.     to the system() function for execution until the command "exit"
  1996.     is entered to terminate the shell.  If "SHELL" is defined, and
  1997.     the "_shell_p" variable is valid, the value of "SHELL" will be
  1998.     passed to the program pointed to by "_shell_p" in order to allow
  1999.     the shell to invoke a command line interaction of its own.  If
  2000.     the "_shell_p" variable is not valid, the program defined by
  2001.     "SHELL" will be searched for along the "PATH", and executed with
  2002.     no arguments.  If the "SHELL" can't be found, the internal command
  2003.     line described above will be used.
  2004.  
  2005. Mabe be this function will not work in current library version, problems
  2006. will be fixed soon.
  2007.  
  2008.  
  2009.  
  2010. 11. MISCELLANEOUS FUNCTIONS:
  2011. They are to find on almost systems.
  2012.  
  2013. 11.1 MALLOC:
  2014. include malloc.h for access to this functions.
  2015.  
  2016. long msize(char *addr)
  2017.     Return the size, in bytes, of the memory block at <addr>.  Note
  2018.     that the size is a long value, since the block may have been
  2019.     allocated by lalloc().
  2020.  
  2021. long memavail()
  2022.     Return the size, in bytes, of the largest block of free memory
  2023.     available for allocation.  Note that this value is a long.
  2024.  
  2025. void *alloca(unsigned int size)
  2026.     Allocate at least <size> bytes of memory from the stack.  This
  2027.     is "automatic" variable space and will be freed when the function
  2028.     which called alloca() exits.  DO NOT use the other dynamic memory
  2029.     functions like free(), realloc() and msize() on the block returned
  2030.     by this function.  A pointer to the requested block is returned,
  2031.     or NULL if there is not enough stack space available.
  2032.  
  2033.  
  2034. 11.2 SEARCHING AND SORTING:
  2035. include  misc.h   for access to this functions.
  2036.  
  2037. void qsort(char *base, int num, int size, int (*cmp)())
  2038.     Perform a recursive quick-sort on an array starting at <base>
  2039.     containing <num> elements of <size> bytes each.  The function
  2040.     pointed to by <cmp> is used to compare elements.  Pointers to
  2041.     two items in the array are passed to the function, which must
  2042.     return a number representing their relationship as follows:
  2043.         negative    item1 < item2
  2044.         0        item1 == item2
  2045.         positive    item1 > item2
  2046.     The qsort() function requires the use of a temporary data area
  2047.     that is large enough to hold <size> bytes.  The default space
  2048.     provided is 128 bytes large.  If your record size is larger than
  2049.     128 bytes, YOU MUST provide an alternative storage area.  The
  2050.     global variable "_qbuf" points to the storage qsort() will use.
  2051.     Setting "_qbuf" to NULL restores use of the internal buffer.
  2052.     This routine is optimized to avoid N*N sort times for ordered data.
  2053.     In fact, performance on sorted or reverse-sorted data is actually
  2054.     "best case" with this algorithm, rather than "worst case" as with
  2055.     most qsort() implementations.
  2056. (from stdlib.h)
  2057.  
  2058. void hsort(char *base, int num, int size, int (*cmp)())
  2059.     Perform an N*log(N) heap-sort on an array starting at <base>
  2060.     containing <num> elements of <size> bytes each.  The function
  2061.     pointed to by <cmp> is used to compare elements.  Pointers to
  2062.     two items in the array are passed to the function, which must
  2063.     return a number representing their relationship as follows:
  2064.         negative    item1 < item2
  2065.         0        item1 == item2
  2066.         positive    item1 > item2
  2067.     The hsort() function requires no extra storage, is not recursive,
  2068.     and has an almost constant N*log(N) sort time.  In the average
  2069.     case, it is about half as fast as qsort() on random data.  If
  2070.     portability is a concern, it should be noted that qsort() is
  2071.     almost always available, but hsort() is not.
  2072.  
  2073. char *bsearch(char *key, char *base, int num, int size, int (*cmp)())
  2074.     Perform a binary search for <key> on the sorted data at <base>.
  2075.     <num>, <size> and <cmp> are like the corresponding parameters
  2076.     to qsort().  A pointer to the matching element is returned for
  2077.     success, or NULL for failure.  The global variable "_bsearch"
  2078.     will contain the index of either the matching element, or the
  2079.     index of the element that the <key> value should be inserted
  2080.     after.  The use of "_bsearch" is not supported by most
  2081.     implementations of bsearch().
  2082. (from stdlib.h)
  2083.  
  2084. void *lsearch(char *key, char *base, int *num, int size, int (*cmp)())
  2085.     Perform a linear search for <key> on the data at <base>. The
  2086.     <num>, <size> and <cmp> parameters are like the corresponding
  2087.     parameters to qsort().  A pointer to the first matching element
  2088.     is returned for success, or NULL for failure.  If <key> is not
  2089.     found, it will be added to the end of the array and <num> will
  2090.     be incremented.  Note that, unlike bsearch() and qsort(), the
  2091.     <num> parameter is a POINTER to a location which holds the
  2092.     number of elements to sort.
  2093.  
  2094. void *lfind(char *key, char *base, int *num, int size, int (*cmp)())
  2095.     Like lsearch(), but do not add elements which are not found.
  2096.     Note that <num> is a POINTER, even though it is not modified.
  2097.  
  2098.  
  2099.  
  2100. void swab(int *src, int *dst, int n)
  2101.     Swap adjacent bytes while copying <n> bytes from <src> to <dst>.
  2102.     This allows bulk translation to/from Intel byte ordering.  Please
  2103.     note the backward order of the <src> and <dst> parameters.  Don't
  2104.     blame me... this is how Microsoft specifies it.
  2105.  
  2106. MACRO max(x,y)
  2107.     Return the larger of <x> and <y>.  This macro evaluates the
  2108.     larger argument twice and the smaller argument once.
  2109.  
  2110. MACRO min(x,y)
  2111.     Return the smaller of <x> and <y>.  This macro evaluates the
  2112.     smaller argument twice and the larger argument once.
  2113.  
  2114. MACRO swap(a,b)
  2115.     Exchange <a> and <b> by chained XORs.  The macro evaluates
  2116.     each argument several times.
  2117.  
  2118.  
  2119.  
  2120. 12. TOS related functions. Non portable
  2121.  
  2122. 12.1 TIMER:
  2123.  
  2124. clock_t start_timer(clock_t *t)
  2125.     Start a 200Hz timer.  This timer value can later be checked with
  2126.     time_since() to determine elapsed time.  These functions provide
  2127.     a very low-overhead way of timing events. include <time.h>
  2128.  
  2129. clock_t time_since(clock_t *t)
  2130.     Returns the number of 200Hz ticks since start_timer() was called
  2131.     for timer <t>. include <time.h>
  2132.  
  2133.  
  2134. 12.2 PROCESS CONTROL:
  2135.  
  2136. The functions are to find in xdlibs.a and extended.lib. 
  2137.  
  2138. BASEPAGE *Getbpact_pd()
  2139.     Get basepage pointer of act_pd.
  2140.     Useful for memory control in accessories. The blocks malloc() 
  2141.     has allocated from TOS are only valid after an AC_CLOSE,
  2142.     if the value of Getbpact_pd() is the same as after malloc()
  2143.     (to save!!), or you find the saved value in the actual's value's
  2144.     parents (bp->p_parent). Include atari.h
  2145.  
  2146. unsigned int GetTOSvers( long *OS_date, 
  2147.          unsigned int *OS_conf, unsigned int * OS_dosdate);
  2148.     Get TOS version.
  2149.     The pointers maybe NULL if you are not interested in this
  2150.     values. Include atari.h
  2151.  
  2152. int Getcookie( long cookie, long *value );
  2153.     Exists a special cookie?
  2154.     If it returns FALSE, it doesn't exit. If the pointer is NULL,
  2155.     you won't get the cookie's value. Include atari.h
  2156.  
  2157. void GetMiNT()
  2158.     Either a dummy function from main.o xdlibs' module, cause you won't
  2159.     need it together with _main(),or a function to set up _mint flag
  2160.     if it is -1.
  2161.  
  2162. long gemdos(int func[, arg1, ..., argN])
  2163.     Call operating system trap #1 (GEMDOS) function number <func> with
  2164.     the arguments given.  Return value returned by the trap call.
  2165.  
  2166. long bios(int func[, arg1, ..., argN])
  2167.     Call operating system trap #13 (BIOS) function number <func> with
  2168.     the arguments given.  Return value returned by the trap call.
  2169.  
  2170. long xbios(int func[, arg1, ..., argN])
  2171.     Call operating system trap #14 (XBIOS) function number <func> with
  2172.     the arguments given.  Return value returned by the trap call.
  2173.  
  2174. int bdos(int func, long parameter)
  2175.     Call operating system trap #2 (BDOS) function number <func> with
  2176.     passing the specified <parameter>.  Note that <parameter> must
  2177.     always be a long value, even if only a 16-bit value is required
  2178.     by the specified BDOS function.
  2179.  
  2180.  
  2181.  
  2182. 13. DEVICE I/O FUNCTIONS:
  2183. (mostl of them are to find in 'extended.lib')
  2184. NON portable functions, they refere to BIOS devices. This will cause
  2185. problems in standard environments.
  2186. Better forget about most of them. -jerry-
  2187.  
  2188. int cfg_ch(int cfg)
  2189.     Configure getch()/putch() operation.  The following are legal
  2190.     values for <cfg> and may be combined with the | operator:
  2191.         _CIOB        Use BIOS level i/o calls
  2192.         _CIOCH        8-bit character codes only (cf:getch)
  2193.         _CIOVT        Enable VT-52 escape sequence processing
  2194.     The initial configuration value at run time is _CIOCH.  This
  2195.     function returns the previous configuration value, and if <cfg>
  2196.     is -1 the value is not set.
  2197.  
  2198. int getch()
  2199.     Machine dependent console input function.  This function normally
  2200.     gets a character from the keyboard by calling the GEMDOS "Cconin"
  2201.     function.  If cfg_ch() is given the _CIOB option, input is gotten
  2202.     from the BIOS "Bconin" function instead.  The BIOS level functions
  2203.     don't process ^C, ^S or ^Q, while the GEMDOS functions do.  The
  2204.     most common use for getch() is when keyboard scan codes are needed
  2205.     to process special function keys.  The return value from getch()
  2206.     consists of the scan code in the high-order byte, and the ascii
  2207.     character code in the low-order byte.  If cfg_ch() is given the
  2208.     _CIOCH option, the return value is always an 8-bit quantity,
  2209.     either the scan code with the 8th bit set, or the ascii code with
  2210.     the 8th bit clear.  This is somewhat less informative, since the
  2211.     scan code form is returned only if the ascii value is 0, but is the
  2212.     default configuration value for compatability with Microsoft C.
  2213.     In any case, the global unsigned long variable "_getch" will contain
  2214.     the full character code value returned by the OS.
  2215.  
  2216. int getche()
  2217.     Same as getch() but calls putch() to echo the character.
  2218.  
  2219. char putch(char c)
  2220.     Machine dependent (typically quite fast) console output function.
  2221.     This function normally puts a character to the console by calling
  2222.     the GEMDOS "Cconout" function.  If cfg_ch() is given the _CIOB
  2223.     option, output is sent to the BIOS "Bconout" function instead.
  2224.     The BIOS level functions don't process ^C, ^S or ^Q, while the
  2225.     GEMDOS functions do.  At the BIOS level, the _CIOVT option to
  2226.     cfg_ch() allows VT-52 escape code processing on output.  The
  2227.     GEMDOS function always does VT-52 emulation.  The BIOS function
  2228.     defaults to skipping this overhead, but if VT-52 emulation is
  2229.     desired, it can still be used through the faster BIOS level
  2230.     routine    by using the _CIOVT option.  Control codes, like '\b'
  2231.     and '\r', are supported even without VT-52 emulation.  The return
  2232.     value of this function is simply the character sent.
  2233.  
  2234. int kbhit()
  2235.     Machine dependent function to detect if input is waiting for the
  2236.     getch() function.  Returns non-zero if the console has data ready.
  2237.  
  2238. char *getln(char *ip, int (*get)(), int (*put)(), char *buffer, int limit)
  2239.     Get a line of input from the user.  Allow simple editing of the line
  2240.     with BS/DEL, ESC, and CR/LF to terminate input.  Characters are
  2241.     retreived by a (*get)(ip) and echoed with (*put)(c).  A pointer to
  2242.     <buffer> is returned in any case.  This function is no longer
  2243.     needed to handle editable i/o from stdin, since the pseduo-tty
  2244.     driver code built into fgetc() now handles line editing, but this
  2245.     function is still useful if you want to supply your own get/put
  2246.     functions (like curses?).
  2247.  
  2248.  
  2249. void cputs(char *data)
  2250.     Write the characters in <data> directly to the console using the
  2251.     system dependent putch() function.  A newline WILL NOT be written
  2252.     after the data.
  2253.  
  2254. FORMATTING/TYPE CONVERSION:
  2255. int cprintf(char *fmt[, arg1, ..., argN])
  2256.     Formatted output directly to the console.  This functions uses the
  2257.     system dependent putch() for output.  See the _printf() function
  2258.     for a description of the <fmt> formatting string.
  2259.  
  2260.  
  2261. ----- END OF FILE -----
  2262.