home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD2.mdf / c / compiler / miracl / miracle.txt < prev    next >
Text File  |  1993-02-08  |  60KB  |  2,660 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  
  14.             User Manual
  15.  
  16.  
  17.             Miracle C Compiler
  18.  
  19.  
  20.  
  21.             version 1.5
  22.             17 January 1993
  23.  
  24.  
  25.  
  26.             Copyright 1989-93  T Szocik
  27.  
  28.  
  29.  
  30.  
  31.  
  32.  
  33.  
  34.  
  35.  
  36.  
  37.  
  38.  
  39.  
  40.  
  41.  
  42.  
  43. The Miracle C Compiler runs on a 386 PC (or better) under 
  44. MS-DOS, accepting a dialect of the C language and 
  45. generating object code suitable for Microsoft or 
  46. compatible linker. 
  47.  
  48. All of traditional (Kernighan & Ritchie) C syntax is 
  49. implemented, including record (struct/union) and 
  50. enumerated data types, int, long and floating point data 
  51. types, user type definition, bit fields in structs, 
  52. initializers for all data types. Both traditional and new 
  53. (ANSI) function declaration is supported. There is a 
  54. comprehensive library of functions.
  55.  
  56.  
  57. REGISTRATION
  58.  
  59. The compiler is shareware, and is supplied  on a trial 
  60. use basis. The compiler package is copyright material and 
  61. should not be modified or disassembled. Programs written 
  62. using the compiler may be freely distributed.
  63.  
  64. If you find it useful you should register. Registration 
  65. costs 10 pounds in the UK, 25 dollars overseas, and 
  66. entitles you to receive a printed copy of the 
  67. documentation and upgrades for one year.
  68.  
  69. Registration is from the author;
  70.  
  71.     T Szocik
  72.     45 Englewood Road
  73.     London S.W.12 9PA
  74.     United Kingdom.
  75.  
  76. Miracle C is under active development by the author. By 
  77. registering you support further development of the 
  78. compiler. Should you wish to make a direct contribution 
  79. to a future release (for example by writing a compiler 
  80. utility, library functions or source code), please write 
  81. to the developer at the above address.
  82.  
  83.  
  84.  
  85. USING THE COMPILER
  86.  
  87. The following files are present in a compressed form in 
  88. the self-extracting archive;
  89.  
  90. miracle.doc    documentation in MS Word format
  91. miracle.txt    documentation in text format
  92. cc.exe        the C Compiler
  93. ccl.lib        C compiler library
  94. mc.bat        batch file for compiler
  95.  
  96. and several example programs;
  97.  
  98. example.c
  99. hanoi.c
  100. cat.c
  101. sieve.c
  102. maze.c    maze
  103. slr.c    grammar.c
  104.  
  105.  
  106.  
  107. Floating point support;
  108.  
  109. The compiler requires an 8087 coprocessor (or better), or 
  110. emulation program, to perform floating point arithmetic. 
  111. A public domain emulation program (em87.com) is to be 
  112. found in the compiler archive.
  113.  
  114.  
  115.  
  116.  
  117.  
  118.  
  119. The compiler uses the following environment variables;
  120.  
  121. LIB        directory containing library ccl.lib
  122.         (this is only used by a linker)
  123.  
  124. INCLUDE    directory containing system include files <*.h>
  125.         (if unset, defaults to \cc\include)
  126.  
  127. LINKER    name of linker, eg LINKER=BLINK
  128.         (if unset, defaults to LINK, the Microsoft 
  129. linker)
  130.  
  131.         Note that a linker is not supplied with the 
  132. compiler.
  133.         Use the Microsoft linker supplied with DOS, or 
  134. a compatible linker.
  135.  
  136.         CC output is Microsoft/Intel object module 
  137. format, as documented
  138.         in the MS-DOS Encyclopedia. The linker must 
  139. accept Microsoft object.
  140.  
  141. Before compiling a program set the environment variables 
  142. to suitable values;
  143.  
  144. C:\> SET LIB=\CC
  145. C:\> SET INCLUDE=\CC\INCLUDE
  146. C:\> SET LINKER=LINK
  147.  
  148. Compile one of the example files;
  149.  
  150. C:\CC> MC EXAMPLE.C
  151. Microsoft (R) Overlay Linker  Version 3.51
  152. Copyright (C) Microsoft Corp 1983, 1984, 1985, 1986.  All 
  153. rights reserved.
  154.  
  155. C:\CC>
  156.  
  157. This will compile and link `example.c', creating 
  158. example.obj, example.exe.
  159.  
  160.  
  161.  
  162. Compiler switches;
  163.  
  164.     -c    compile only (generate .obj, don't link)
  165.     -j    signed char constants
  166.     -n    noisy compile
  167.     -p    disable autoprototyping
  168.     -r    set error limit
  169.     -s    generate source listing (.src) after 
  170. preprocessing
  171.     -t    allow trigraphs
  172.     -w    no warnings
  173.  
  174.     -Dname    define macro
  175.     -Uname    undefine macro
  176.     -Iname    add include directory
  177.  
  178.  
  179. Only one program file may be compiled at one time. To 
  180. compile and link together several programs, compile them 
  181. separately with `-c' option, then link them with ccl.lib.
  182.  
  183.  
  184. If the compiler finds an error (in preprocessing, parsing 
  185. or other compilation error, eg an undeclared variable) it 
  186. will print the statement where it occurred and stop if 
  187. the error limit has been reached. Functions should be 
  188. declared before being called, although this is not 
  189. mandatory. If they are not, then auto-prototyping will 
  190. generate a prototype for a new function returning int. A 
  191. function definition automatically declares the function 
  192. if it has not been declared or auto-prototyped earlier.
  193.  
  194.  
  195.  
  196. EXAMPLE PROGRAMS
  197.  
  198. A few example programs are included to illustrate Miracle 
  199. C facilities.
  200.  
  201. example.c    hanoi.c
  202. cat.c        sieve.c
  203. maze.c    maze
  204. slr.c    grammar.c
  205.  
  206.  
  207.  
  208. example.c    shows most of CC's features; structs/unions; 
  209. initializers for structs and arrays;
  210.         typedefs; function prototyping; functions with 
  211. local variables, and scoping;
  212.         data types; signed and unsigned int, char and 
  213. long variables, floating point;
  214.         use of some library functions for file handling
  215.  
  216. cat.c        reverse words in a sentence, eg `I am 
  217. here' to `here am I'
  218.  
  219. hanoi.c        non-recursive towers of hanoi
  220.         (originally from a Programmer's Challenge in 
  221. Computer Shopper magazine!!)
  222.         gives the sequence of moves to move all discs 
  223. from first to third peg via second
  224.  
  225. sieve.c        Eratosthenes sieve to find prime numbers 
  226. by eliminating composites
  227.         developed from a BYTE C benchmark program
  228.  
  229. maze.c        maze solver, finds shortest path through 
  230. maze from A to B
  231. maze        eg.    C:\> MAZE<MAZE
  232.         uses an algorithm from graph theory to find 
  233. shortest path
  234.  
  235. slr.c        simple parser generator for SLR grammar
  236.         given a grammar file, generates a recognizer 
  237. program to parse the SLR grammar
  238. grammar    grammar file for slr.c
  239.  
  240.  
  241. LANGUAGE FEATURES
  242.  
  243. This is a summary of the C language as implemented by the 
  244. Miracle C compiler.
  245.  
  246. For a tutorial on the C language, read `The C Programming 
  247. Language' by Kernighan and Ritchie. A comprehensive 
  248. reference to the language is the book `C: A Reference 
  249. Manual' by Harbison and Steele, published by Prentice-
  250. Hall, which describes both traiditional and the new ANSI 
  251. C syntax and semantics. Miracle C implements the 
  252. traditional C language and some of the ANSI extensions.
  253.  
  254. Lexical Elements
  255.  
  256. Tokens
  257. The fundamental lexical elements of the language are 
  258. operators, separators, identifiers, reserved-words and 
  259. constants.
  260.  
  261. A C source program consists of tokens separated by 
  262. whitespace. Whitespace is defined as chars 9-13 and 32. 
  263. Tokens can be operators, separators, identifiers, 
  264. reserved-words or constants.
  265.  
  266. 1.    Operators
  267. The following operators are legal in C.
  268.  
  269.     ! % ^ & * - + = ~ | < > ' ? += -= *= /= %= <<= >>= 
  270. &= ^= |=
  271.         -> ++ -- << >> <= >= == != && ||
  272.  
  273. 2.    Separators
  274. Whitespace characters 9-13, and space character 32 are 
  275. separators.
  276. ( ) [ ] { } , ; :
  277.  
  278. 3.    Identifiers
  279. A sequence of any number of letters/digits/underscores 
  280. starting with a letter or underscore character.
  281. Identifiers are case-sensitive so name, Name and NAME are 
  282. different, but external symbols (such as function names) 
  283. are not case-sensitive.
  284.  
  285. 4.    Reserved words
  286. auto break case char default do else enum extern for goto 
  287. if int long register return short signed sizeof static 
  288. struct switch typedef union unsigned void while
  289.  
  290. 5.    Constamts
  291. A C constanr can be an integer, character or string, or 
  292. floating point constant.
  293.  
  294. integer
  295. An integer can be represented as a decimal, octal (base 
  296. 8) or hexadecimal (base 16) constant.
  297.  
  298. *    decimal (digits)
  299. *    octal 0(digits), eg 0243
  300. *    hex '0x' (or 0X) (hex-digits 0-9 a-f A-F), eg 0x4afb
  301.  
  302. A numeric constant can be unsigned (suffixed by U, eg 
  303. 56U), long (eg 128374L) or floating point.
  304. Floating point constants have syntax  aaa.bbbEeee    where
  305.     aaa.bbb = mantissa
  306.                             eee = exponent 
  307. (signed, optional
  308.  
  309.  
  310.  
  311. character
  312. A character is 'char' or '\esc-char'
  313.     where esc-char= nnn octal literal
  314.             xnn hex literal
  315.  
  316.             a alert        b backspace
  317.             f form feed    n newline
  318.             t tab        r carriage return
  319.             v vertical tab    ' single quote
  320.             ? question mark    " double quote
  321.  
  322. A character constant may contain more than one byte, on 
  323. which case bytes are packed into a word,
  324. for example    int a='xy';
  325.  
  326. string
  327. A string is "string" where the string has printable 
  328. characters or \escaped-characters.
  329. Constant strings are null-terminated, eg 
  330. sizeof("hello")=6
  331.  
  332.  
  333.  
  334.  
  335.  
  336. Preprocessor
  337.  
  338. The preprocessor performs macro substitution, file 
  339. inclusion and conditional compilation on the source 
  340. program. Use the `-s' compiler option to see the program 
  341. text after preprocessing.
  342.  
  343. The preprocessor allows a line to be continued by ending 
  344. it with a `\' character. Tokens and strings can be split 
  345. across lines.
  346.  
  347. Preprocessor directives are lines starting with `#'. A 
  348. line with only '#' is a null directive and is ignored by 
  349. the preprocessor.
  350.  
  351.  
  352. Macro substitution
  353. The #define preprocessor directive defines a macro, 
  354. optional parameter list and associated substitution 
  355. string. A macro can have no parameter list, eg
  356.  
  357.     #define WORD_SIZE 16
  358.  
  359. then every occurrence of WORD_SIZE in the program text is 
  360. replaced with `16'.
  361. The general form of a macro definition allows zero or 
  362. more parameters;
  363.  
  364.     #define <name>(parameters) <replacement text>
  365.  
  366.     #define afunc() otherfunc()
  367.     #define times(x,y) ((x)*(y))
  368.  
  369. every call to afunc() is replaced with a call to 
  370. otherfunc(); when `times' is used, actual arguments are 
  371. substituted for macro parameters in the replacement text, 
  372. eg
  373.  
  374.  
  375.     times(4,times(5,6))
  376. gives
  377.     ((4)*(((5)*(6))))
  378.  
  379. The number of arguments when the macro is used must match 
  380. the number of parameters when it is declared.
  381.  
  382. A macro definition may be split across more than one line 
  383. by line continuation with \
  384.  
  385.     #define plus(x,y) \
  386.         ((x) + (y))
  387.  
  388. After macro substitution, the line is scanned again so 
  389. macros created by the expansion can be recognized and 
  390. expanded.
  391.  
  392.  
  393. The following macros are predefined by the preprocessor;
  394.  
  395. MIRACLE    defined as 1
  396.         use for code specific to Miracle C compiler
  397.  
  398. MSDOS        defined as 1
  399.         use for code specific to MS-DOS
  400.  
  401. __FILE__    current source file
  402.  
  403. __LINE__    line in current source file
  404.  
  405. __DATE__    today's date, returned as "Mmm dd yyyy"
  406.  
  407. __TIME__    time of compilation, returned as "hh:mm:ss"
  408.  
  409.  
  410. Redefinition of macros (benign or otherwise) is allowed. 
  411. No warning or error is given if redefinition occurs.
  412.  
  413. A macro definition can be cleared using `#undef' 
  414. directive;
  415.  
  416.     #undef times
  417.  
  418.  
  419. File inclusion
  420. The `#include' directive allows C source files to be 
  421. included in the program text. When the end of the 
  422. included file is reached, compilation continues from the 
  423. line after the `#include' directive. Include files may be 
  424. nested; but they should including themselves, directly or 
  425. indirectly, causes the compiler to crash. Preprocessor 
  426. include files usually have a .h suffix (header files). 
  427. There are two forms of #include directive;
  428.  
  429.     #include "filename"
  430.  
  431. includes a file in the current directory,
  432.  
  433.     #include <filename>
  434.  
  435. includes a file from the system include directory, which 
  436. is given by the INCLUDE environment variable. If INCLUDE 
  437. is not set, the system include directory defaults to 
  438. `\cc\include'.
  439.  
  440. The inclusion-file can be specified by a macro;
  441.  
  442.     #define MYINCLUDES "my.h"
  443.     #include MYINCLUDES
  444.  
  445. A complete pathname can be given in the first form of 
  446. include;
  447.  
  448.     #include "\cc\graphics\graf.h"
  449.  
  450. Conditional Compilation
  451. The preprocessor allows compilation of sections of code 
  452. to be conditional on the values of expressions, using the 
  453. directives `#if' `#ifdef' `#ifndef' `#else' `#endif'. 
  454. Lines after an unsuccessful conditional compilation 
  455. directive are discarded until the next conditional 
  456. compilation directive.
  457.  
  458. A conditionally compiled section of code starts with #if 
  459. #ifdef or #ifndef and ends with a matching #endif. It may 
  460. contain #else or #elif directives, and other (nested) 
  461. conditionally compiled code sections.
  462.  
  463.  
  464. `#if expr'
  465. If the C expression `expr' evaluates to 1, lines are 
  466. processed until a matching else, elif or endif is found. 
  467. If it evaluates to 0, following lines of code are 
  468. discarded until a matching else, elif or endif is found. 
  469. The expression `expr' must be a constant recognisable to 
  470. the preprocessor, containing macro, character and number 
  471. constant values only.
  472.  
  473.  
  474. `#ifdef name'  `#ifndef name'
  475. If the macro `name' is defined (ifdef) or undefined 
  476. (ifndef), lines are processed until a matching else, elif 
  477. or endif is found. Otherwise, following lines of code are 
  478. discarded until a matching else, elif or endif is found.
  479.  
  480. `#else'
  481. The else directive follows an if, ifdef or ifndef, or can 
  482. follow #elif directives. Lines of code following #else 
  483. are processed only if preceeding lines were not 
  484. processed.
  485.  
  486. `#elif'
  487. This is a switch/case construct for conditional 
  488. compilation;
  489.  
  490.     #if expr1
  491.     ...
  492.     #elif expr2
  493.     ...
  494.     #elif expr3
  495.     (etc)
  496.     #else
  497.     ...
  498.     #endif
  499.  
  500. `#endif'
  501. terminates a conditionally compiled code section.
  502.  
  503.  
  504. Other Features
  505. The #error directive aborts compilation with an error 
  506. message;
  507.  
  508.     #ifdef x_once
  509.     #error Illegal include recursion
  510.     #endif
  511.     #define x_once
  512.  
  513. detects a program's attempt to include itself; implement 
  514. "once-only" inclusion of header files similarly.
  515.  
  516.  
  517. Stringification converts a token into a string, and is 
  518. useful when debugging a program;
  519.  
  520.     #define fatal(tok1,tok2) printf("bad tokens: 
  521. %s;%s;",#tok1,#tok2)
  522.  
  523. Concatenation of adjacent strings is supported by Miracle 
  524. C compiler,
  525. so
  526.     #define fatal(tok1,tok2) printf("bad tokens: " #tok1 
  527. ";" #tok2)
  528. is allowed.
  529.  
  530.  
  531. Token merging using the ## operator creates a single 
  532. token from two or more
  533. tokens in a macro definition;
  534.  
  535.     #define line(i) line ## i
  536.  
  537. then    line(1) == line(2)
  538. becomes    line1 == line2
  539.  
  540.  
  541.  
  542.  
  543. Functions
  544.  
  545. Miracle C supports a both the traditional syntax for 
  546. function definition, and a syntax similar to ANSI C for 
  547. function prototyping. Functions can be declared and 
  548. prototyped before use. The traditional way of introducing 
  549. functions, eg.
  550.  
  551.     int main(argc,argv) int argc; char **argv;
  552.  
  553. is supported. Traditionally, functions weren't declared 
  554. before use or definition; CC allows functions to be 
  555. declared and prototyped before use, zero times or exactly 
  556. once, or a parse error results. Note that 'parse errors' 
  557. occur when the current symbol is not one of the expected 
  558. legal symbols, hence a function redeclaration may 
  559. generate a parse error.
  560.  
  561. CC's function declaration syntax is similar to ANSI, eg
  562.  
  563.     void afunc(int one, char *b);
  564.  
  565. but the ANSI syntax
  566.  
  567.     void afunc(int, char *);
  568.  
  569. is not supported (yet). The number and type of 
  570. parameters, and return value, in a function definition 
  571. must match exactly that of the function declaration. 
  572. Miracle CC supports declaration of functions with a 
  573. variable number of
  574. parameters, eg
  575.  
  576.     int printf(char *fmt, ...);
  577.  
  578. but their definition is not supported (yet).
  579.  
  580. Miracle C has the concept of `function types' which are
  581.  
  582.     type1 x .. x typen x varargs -> typer
  583.  
  584. for a function taking n parameters of type (type1, ..., 
  585. typen) and returning a result of type typer, with a 
  586. variable number of arguments if varargs set.
  587.  
  588. A pointer to a function is assigned a function type, 
  589. which should match the type of a function assigned to it; 
  590. for example,
  591.  
  592.     void (*fptr)();
  593.     int printf(char *fmt, ...);
  594.  
  595.     (fptr=&printf,*fptr)("hello");
  596.  
  597. will fail with the error message
  598.  
  599. 158: wrong # args in function call
  600.  
  601. '(fptr=&printf,*fptr)("hello")'
  602.  
  603.  
  604. Functions may return signed or unsigned int, char or long 
  605. values, but not struct or union. They may return pointers 
  606. to any item (including struct), or a user defined type, 
  607. as long as that type isn't a struct. Nor can a function 
  608. return an array, or another function.
  609.  
  610. Parameters in a function call are pushed on the stack 
  611. using normal C linkage conventions, ie right-to-left, to 
  612. allow for functions with a variable number of parameters 
  613. (eg printf, first argument specifies number and type of 
  614. subsequent). Parameters should be word entities, ie int 
  615. char and pointer type.
  616.  
  617. Functions may be declared as extern, static or register, 
  618. but these classes are ignored by the compiler. Miracle C 
  619. marks functions defined in the program text as `internal' 
  620. and others as `external' and generates object 
  621. accordingly. Static functions (visible only within a 
  622. program) are not supported (yet!).
  623.  
  624. Miracle C needs functions with no parameters to be 
  625. declared by
  626.  
  627.     int afunc();
  628.  
  629. It does not follow the ANSI convention of declaring such 
  630. as function by
  631.  
  632.     int afunc(void);
  633.  
  634. nor does it follow the traditional C convention of 
  635. declaring a function's return type, but omitting a 
  636. declaration of parameters, using the above syntax.
  637.  
  638. Parameters in a definition count as local variables in 
  639. the highest level block in the function body, following 
  640. the ANSI definition.
  641.  
  642. Storage classes are not allowed for parameters in a 
  643. definition. Functions with return type `void' must not 
  644. return a value.
  645.  
  646. A function declared to have return type `int' need not 
  647. specify return type in the function definition, so we 
  648. allow
  649.  
  650.     int main();
  651.     ....
  652.     main() { ... }
  653.  
  654. Function prototypes may not be nested;
  655.  
  656.    void (*signal(int sig, void (*func)(int sig)))(int 
  657. sig);
  658.  
  659. is illegal, but can circumvent this by
  660.  
  661.    typedef void sig_handler(int sig);
  662.    sig_handler *signal(int sig,sig_handler *func);
  663.  
  664.  
  665. Autoprototyping of functions is allowed. If a function 
  666. call is introduced for a function which has not been 
  667. declared, a declaration is automatically generated for 
  668. the function. The automatically generated prototype will 
  669. use the types of parameters which are given to the 
  670. function on call, and will assume a function return type 
  671. of int. If the desired function type is different to that 
  672. which will be implicitly generated from the function call 
  673. then an explicit declaration should be made before the 
  674. function is called. Function autoprototyping may be 
  675. disabled by a compiler flag.
  676.  
  677.  
  678.  
  679. Types
  680.  
  681. Miracle C supports void, scalars (pointers, signed and 
  682. unsigned char int long), enumeration types, floating 
  683. point types, pointers to any object, struct/union and 
  684. multi-dimensional array types. It also has `function 
  685. types' (see the section on functions).
  686.  
  687. As a small-model 8086 compiler, CC supports 16-bit ints 
  688. and pointers, 8 bit char values (expanded to 16 bits when 
  689. passed as parameters on the stack), and 32 bit longs. The 
  690. type `short' is a synonym for `int'. An object declared 
  691. by
  692.  
  693.     signed avar;
  694.  
  695. is a signed integer. Floating point numbers are not 
  696. implemented. Long integers are not completely 
  697. implemented; for example, adding a long to an int is not 
  698. allowed, but adding two longs is (so cast the int to long 
  699. before adding); and long values should not be passed as 
  700. function arguments.
  701.  
  702. Miracle C maintains a type value for each expression, 
  703. computed from the types of its components; a data size is 
  704. associated with each type value.Traditional C casts are 
  705. allowed, but type checking of assignments etc is not 
  706. strict.
  707.  
  708. Array subscripts, and adding an int to a pointer, is 
  709. scaled up according to the data size of the type being 
  710. pointed to, eg if intptr is int * then intptr+1 (or 
  711. intptr[1]) will point to intptr plus 2 in memory.
  712.  
  713. Arrays of any type except void can be declared and can be 
  714. multi-dimensional. Void variables are not allowed.
  715.  
  716. Enumerations are introduced by an `enum' declaration, 
  717. such as
  718.  
  719.     enum colour { red, green, blue } mycolour;
  720.     enum colour anothercolour.
  721.  
  722. The tag (here `colour') is optional, and can be used in a 
  723. later declaration. Enumerations must start at zero, the 
  724. traditional "red=2" syntax is not supported. An enum 
  725. variable is int. The enum namespace is separate from 
  726. others, hence
  727.     enum one { one, two } number;
  728.  
  729. is allowed.
  730.  
  731.  
  732. Record (Struct/Union)
  733.  
  734. Structure (record) type is a collection of named 
  735. components;
  736.  
  737.     struct structag
  738.         {
  739.         int x, y[3];
  740.         char z;
  741.         struct structag *sptr, *tptr;
  742.         }
  743.         sarray[10], *sptr;
  744.  
  745.     struct structag another, *anotherptrs[5];
  746.  
  747. Structure tag `structag' identifies this structure type 
  748. for other declarations. The struct has components x,y,z 
  749. and two pointers to other `structag' structs (so we've 
  750. declared a tree structure type). Structure declarations 
  751. cannot be nested (that would be infinitely silly). 
  752. Structure component names live in a separate namespace 
  753. for each struct/union type, hence we can introduce 
  754. variables with the same name. Struct components occupy 
  755. successive memory locations, and the size of a struct (as 
  756. given by sizeof) is the sum of the sizes of it's 
  757. components.
  758.  
  759. Struct components are referred to using . and -> 
  760. operators. In the example above we declare sarray an 
  761. array of 10 `structag' structs and allocate space for it 
  762. (either static or on the stack). Direct reference by 
  763. sarray[i].y[0], indirect reference via pointer to struct 
  764. by sptr->z, sptr->tptr->y[i].
  765.  
  766. A union is declared using the same syntax as struct, but 
  767. contains only one of its members at any one time (so the 
  768. size of a union is the max of the size of it's 
  769. components, and all items are at offset zero in the 
  770. union).
  771.  
  772. Nested structs/unions are allowed. Bit fields in structs 
  773. aren't implemented.
  774.  
  775. Struct bitfields are permitted. A single bitfield must 
  776. not exceed the capacity of a machine word (16 bits). All 
  777. the normal arithmetic operations and assignment are 
  778. permitted on bitfields, as are struct bitfield 
  779. initializers.
  780.  
  781. Typedef
  782.  
  783. User defined type synonyms are introduced by the 
  784. `typedef' statement;
  785.  
  786.     typedef int *ptr, (*func)(), afun();
  787.     ptr wordptr;
  788.     afun main;
  789.     func funcptr=main;
  790.  
  791.     ptr    `ptr to int'
  792.     func    `ptr to function: void->int'
  793.     afun    `function: void->int'
  794.  
  795. Typedef doesn't create a new type, only type synonyms, so 
  796. type compatibility/comparison works. Typedef for function 
  797. can include function prototypes;
  798.  
  799.     typedef int funci(char *x);
  800.     funci funky;
  801.  
  802. A typedef name may be global, or local to a function. The 
  803. ANSI standard allows typedefs to be redeclared in a 
  804. block, but CC doesn't (yet).
  805.  
  806. Type Compatibility
  807.  
  808. Two expressions are assignment compatible  t1=t2  if t1 
  809. is an lvalue, and;
  810.  
  811.     - t1 is (u)long, t2 is (u)int/char, extended to 32 
  812. bits
  813.     - t1 is (u)int/char, t2 is (u)long, truncated to 16 
  814. bits
  815.     - t1 and t2 are both (u)long, 32 bit assignment
  816.     - t1 is (u)char, 8 bit assignment
  817.  
  818.     else 16 bit assignment (of int, pointer etc)
  819.  
  820. Bitfields may be signed or unsigned integer quantities 
  821. and have the same type compatibility rules as integers.
  822.  
  823. Some operators eg  || && ^ | & * / %  require (u)int 
  824. operands.
  825. Pointers may be subtracted (t1-t2 yields a pointer of 
  826. type t1) but not added (addition of pointer is 
  827. meaningless).
  828.  
  829. Array types count as ptrs, depth of ptr=dimensionality of 
  830. array.
  831. Struct/unions types are compatible if they have the same 
  832. struct tag.
  833.  
  834.  
  835.  
  836.  
  837.  
  838. Declarations
  839.  
  840. Variables, functions and user defined data types are 
  841. introduced by declaration statements. A declarator gives 
  842. identifier name and type;
  843.  
  844. Scalar        int x
  845. Floating point    double x;
  846. Pointer        int *x; char *y[];  (y is pointer to 
  847. array, same as char **y;)
  848. Array        int (*x)[4];        (x is pointer to array 
  849. of 4 ints)
  850. Function    int x(), y(int a,char *b), (*x[])(int a);
  851.  
  852. To parse a declaration, start from name and work out 
  853. according to precedence rules;
  854.  
  855.     int *a[10]       a is array of 10 ptrs to int
  856.     int (*x[])(int a)  x is array of ptrs to functions: 
  857. int->int
  858.  
  859.  
  860. Global variables are visible throughout the program from 
  861. the point of declaration, unless they are hidden by a 
  862. local declaration with the same name. Local variables are 
  863. visible throughout the block in which they are defined, 
  864. unless they are hidden by a declaration at an inner level 
  865. with the same name. Globals are extern by default.
  866.  
  867. Static variables (globals and local statics) have storage 
  868. allocated at compile time in static data area to hold a 
  869. possible initializer. Local variables are allocated on 
  870. the stack at runtime and are local to a block, or are 
  871. function parameters.
  872.  
  873. Parameters to a function are considered as being declared 
  874. at the topmost local level in the function, so a local 
  875. declaration using a parameter name is an error. Local 
  876. objects may not be declared more than once.
  877.  
  878. All floating point types (float, double and long double) 
  879. are treated internally as 8-byte double quantities. 
  880. Normal floating point arithmetic is allowed on these 
  881. quantities. No support for numeric coprocessing is 
  882. included in this version.
  883.  
  884. Initializers are allowed for both global and local 
  885. objects and follow traditional syntax. Global 
  886. initializers are evaluated at compile-time, a constant is 
  887. stored in the static data segment. Therefore, expressions 
  888. in global initializers can only contain things which can 
  889. be evaluated at compile-time, such as constants and 
  890. address of objects.
  891.  
  892. Local initializers are evaluated when a function is 
  893. called, so expressions may (even) contain function calls.
  894.  
  895. Multi-dimensional arrays, structs/unions, arrays of 
  896. structs and initializers for them are supported using 
  897. traditional C syntax.
  898.  
  899. A struct tag can be declared before any variables are;
  900.  
  901.     struct S { int a, b; };
  902.     struct S fred;
  903.  
  904. A struct can be declared without tag or variables;
  905.  
  906.     struct { int a,b; };
  907.  
  908. is allowed but pointless.
  909.  
  910. Also  static struct S { int a,b; }; is allowed but 
  911. `static' is meaningless.
  912.  
  913.  
  914. A global variable may be declared more than once, but all 
  915. declarations must agree on type. A local variable may 
  916. only be declared once. Global arrays must have the same 
  917. dimensions when redeclared, but the first dimension need 
  918. not be specified;
  919.  
  920.     char uu[5][4][3]; char uu[][4][3];
  921.  
  922. Only one definition may exist for a variable, so a global 
  923. may have only one declaration with an initializer. 
  924. Redeclaration of functions is not supported.
  925.  
  926. Type definitions, structs/unions and enumerated types are 
  927. supported; see the section on `types'.
  928.  
  929. Global variables are allocated in a static data area. 
  930. Uninitialized globals are set to zero; uninitialized 
  931. parts of partly initialized globals are zeroed. 
  932. Initialized globals give PUBDEF records for the linker, 
  933. uninitialized globals give COMDEF records.
  934.  
  935. Arrays are allocated at compile-time (static) or run-time 
  936. (auto), hence  static char p1[]="hello"  allocated 6 
  937. bytes and copies "hello" into it, but pointer 
  938. initialization is to run-time objects, hence  char 
  939. *p2="hello" allocates 2 bytes for p2 and points it to a 
  940. static string item.
  941.  
  942. Statement labels are local to a function body, and the 
  943. target of goto statements
  944.  
  945.     here:
  946.         ...
  947.         goto here;
  948.  
  949. Forward references are allowed if;
  950.  
  951.     - statement label may be used by goto before it is 
  952. declared
  953.  
  954.     - an identifier should be visible immediately after 
  955. declaration,
  956.       eg int fred=sizeof(fred)
  957.       but this is not yet implemented
  958.  
  959.     - struct can contain pointer to instance of itself
  960.  
  961.     - function declaration and use before definition
  962.  
  963.  
  964.  
  965. Overloading of identifiers permits an identifier to have 
  966. different meanings depending on context;
  967.  
  968.     - macro names are defined and used by the 
  969. preprocessor
  970.  
  971.     - struct tag names have a separate name space
  972.  
  973.     - enum tag names have a separate name space
  974.  
  975.     - typedef, enum and label names are checked before 
  976. variable names.
  977.       a compile error results if a variable is declared 
  978. with the same
  979.       name as a typedef or enum name, or goto-label
  980.  
  981.     - struct component names are specific to a 
  982. struct/union type,
  983.       so two structs can have components of the same 
  984. name
  985.  
  986.  
  987.  
  988. External names must be defined at top-level (global 
  989. variables). Extern declarations inside functions are not 
  990. supported and are treated as declarations of internal 
  991. variables. Global variables are defined to the linker and 
  992. accessible to other programs.
  993.  
  994. The storage classes auto and register are ignored by the 
  995. compiler. Static variables local to a function are 
  996. allocated in the static data area, and should have 
  997. constant initializers.
  998.  
  999.  
  1000.  
  1001.  
  1002. Initializers
  1003. The compiler allows initialization of scalars, strings, 
  1004. struct/unions and arrays. An initializer sets the initial 
  1005. value of a variable, at compile time for static objects 
  1006. (globals or local statics) or run time for automatic 
  1007. variables. If no initializer exists for a global 
  1008. variable, it's set to zero; if none exists for a local, 
  1009. it's initial value is unpredictable.
  1010.  
  1011. The traditional C syntax for initializers is supported;
  1012.  
  1013.     int x=4;
  1014.  
  1015.     struct { int a; char *s; int b; } icky = { 1, 
  1016. "astr", 2 };
  1017.  
  1018.     enum { red, blue } colour = blue;
  1019.  
  1020. Union initializer is for the first component of the 
  1021. union. Structs and multi-dimensional arrays are 
  1022. initialized recursively;
  1023.  
  1024. int m1[2][3] = { { 1, 2, 3 }, { 4, 5, 6 } };
  1025.  
  1026. The `shape' of an initializer (brace structure) must 
  1027. match that of the object being initialized. If there 
  1028. aren't enough initializing items for an array or struct 
  1029. initializer, the rest of the object is zeroed. If there 
  1030. are too many, a compile time error results.
  1031.  
  1032. If the outermost dimension of an array is unspecified, 
  1033. it's taken from the initializer;
  1034.  
  1035.     char a[] = { 'a', 'b', 'c', '\0' }, *b="hello";
  1036.  
  1037. Braces can be dropped in the initializer;
  1038.  
  1039.     int a[2][3]={1,2,3,4,5,6};
  1040.  
  1041. the number of items in the initializer must not exceed 
  1042. the declared object.
  1043.  
  1044. Static variable initializer expressions contain only 
  1045. objects which can be evaluated at compile-time, ie 
  1046. constants and addresses of static objects. The address of 
  1047. a global variable cannot be found if it is declared but 
  1048. not defined;
  1049.  
  1050.     int a, *b=&a;
  1051.  
  1052. won't compile, but
  1053.  
  1054.     int a=2, *b=&a;
  1055.  
  1056. is allowed.
  1057.  
  1058. Local variable initializer expressions are evaluated at 
  1059. runtime, when a function is called. They can contain any 
  1060. expression (even function calls). If goto jumps to a 
  1061. label in a block, initializers for that block don't run.
  1062.  
  1063. Initializers are permitted for floating point variables, 
  1064. and bitfields in struct (record) types, using the 
  1065. standard C syntax.
  1066.  
  1067.  
  1068.  
  1069. Expressions
  1070.  
  1071. An expression consists of operators acting on other 
  1072. expressions, or base values (variables or constants). An 
  1073. expression is either an lvalue or an rvalue; an lvalue 
  1074. refers to an object in memory, eg a variable; an rvalue 
  1075. is a non-lvalue.
  1076.  
  1077. Lvalues can be `variable'  e[k]  lvalue.name  e->name  *e
  1078. they are used by  &  ++  --  assignment-operators
  1079.  
  1080.  
  1081. Expressions are formed from operators, in precedence 
  1082. order:
  1083.  
  1084. ,    sequential evaluation, yields second operand
  1085.  
  1086. =   +=    -=  *=     /=   %=
  1087. &=  |=    ^=  >>=  <<=  assignment
  1088.  
  1089.     assign    (u)long = (u)(int|char)
  1090.         (u)long = (u)long
  1091.         (u)(int|char) = (u)long
  1092.         word/byte lvalue = word/byte rvalue
  1093.  
  1094. ?:    conditional   exp1 ? exp2 : exp3
  1095.     depending on value of exp1, yields exp2 or exp3
  1096.     type of exp1 must be int
  1097.     types of exp2 and exp3 must match, and must be byte 
  1098. or word
  1099.  
  1100. ||    logical or    exp1 || exp2    only evaluate exp2 if 
  1101. exp1 false
  1102.  
  1103. &&    logical and    exp1 || exp2    only evaluate exp2 if 
  1104. exp1 true
  1105.  
  1106. |    bit or
  1107. ^    bit xor
  1108. &    bit and
  1109.     bit or, xor, and take (u)int operands and yield 
  1110. (u)int result
  1111.  
  1112. == !=    compare, signed or unsigned
  1113. < >    signed if at least one operand is signed, both are 
  1114. int or char
  1115. <= >=    unsigned if both operands are unsigned int or 
  1116. char, or pointers
  1117.  
  1118.  
  1119. << >>    shift, arithmetic for signed, logical for 
  1120. unsigned
  1121.  
  1122. + -    add sub
  1123.     (u)(char|int), (u)(char|int)
  1124.     ptr, (u)(char|int)    scale up by size of object 
  1125. pointed to
  1126.     (u)long, (u)long
  1127.     can subtract two pointers giving an integer
  1128.  
  1129. * / %    mul div rem
  1130.     take (u)int operands, yield (u)int result
  1131.  
  1132. (type)    cast
  1133.     cannot cast to/from structs/voids
  1134.     cannot cast between chr and ptr, but can between int 
  1135. and ptr
  1136.     if casting long->int then lose high word, int->long 
  1137. high word zero
  1138.  
  1139. *    indirection
  1140.  
  1141. &    address of
  1142.  
  1143. -    unary minus
  1144.  
  1145. !    logical not
  1146.  
  1147. ~    bit not
  1148.  
  1149. sizeof    sizeof(typename)        size of type
  1150.     sizeof("string")        size of constant string + 1
  1151.     sizeof(array-expr)    size of array in bytes
  1152.     sizeof(expr)            sizeof type of expr
  1153.  
  1154. ++ --    post/pre decr/incr
  1155.     if pointer, scaled up by size of object pointed to
  1156.  
  1157. ->    indirect selection by pointer (struct/union member 
  1158. or bitfield)
  1159.  
  1160. .    direct selection (struct/union member or bitfield)
  1161.  
  1162. f(..)    function call, where f is a function designator
  1163.     f has function type and identifies a function
  1164.  
  1165. (expr)    brackets
  1166.  
  1167. a[k]    array subscript; type of k = (u)(int|char)
  1168.     the result of an array subscript is an lvalue only 
  1169. if a is a pointer, or we have reached the last
  1170.     array dimension
  1171.  
  1172.     for example, if  int a[3][2];  then  a[1]=4;  is 
  1173. meaningless and is flagged as an error
  1174.     but this means that
  1175.  
  1176.         int a[2][3], **x;
  1177.         x=&a[1];
  1178.  
  1179.     will not compile. The ANSI solution (`modifiable 
  1180. lvalues') is not implemented.
  1181.  
  1182. number    constant
  1183.  
  1184. string    constant
  1185.  
  1186. variable global, local, lstatic
  1187.  
  1188. Initializer constant expressions are arithmetic constant 
  1189. expressions and address constant expressions (not fully 
  1190. implemented in CC). These can have normal operators & 
  1191. casts, which are evaluated at compile-time.
  1192.  
  1193.  
  1194.  
  1195. Statements
  1196.  
  1197. All traditional C statements are implemented, except for 
  1198. `continue'.
  1199. A statement can be one of the following;
  1200.  
  1201. expr    expression; (discarded)
  1202.  
  1203. null    null statement (actually a null expression)
  1204.  
  1205. label    label: stmt;
  1206.     which can be a goto-label, case-label, or default-
  1207. label in switch
  1208.  
  1209. goto    goto name;
  1210.     where `name' is a goto-label defined somewhere in 
  1211. function
  1212.  
  1213. block    { decl-list; stmt; ... stmt; }
  1214.     A block starts with zero or more declarations, and 
  1215. contains zero or more statements. Blocks
  1216.      may be nested. Names declared within the block hide 
  1217. declarations of the same name outside
  1218.     the block, and are visible throughout the block 
  1219. unless hidden by a declaration at an inner
  1220.     level.
  1221.  
  1222.     Goto a label inside a block jumps past local 
  1223. variable allocation and initialization code; but
  1224.     the locals are de-allocated at end of block anyway, 
  1225. so don't jump into a block!
  1226.  
  1227. if    if (expr) stmt
  1228.     if (expr) stmt1 else stmt2    NB else belongs to 
  1229. nearest if
  1230.  
  1231.     if `expr' evaluates to non-zero, do stmt1 (else do 
  1232. stmt2)
  1233.     `else' belongs to the nearest `if'
  1234.  
  1235. while    while (expr) stmt
  1236.     continue executing `stmt' while `expr' evaluates to 
  1237. non-zero
  1238.  
  1239. do    do stmt while(expr)
  1240.     do `stmt' at least once, then while `expr' evaluates 
  1241. to non-zero
  1242.  
  1243.  
  1244. for    for(expr1; expr2; expr3) stmt        each of exp1,2,3 
  1245. optional
  1246.     expr1= evaluated once at start of loop
  1247.     expr2= continuation condition, tested before stmt 
  1248. executed
  1249.     expr3= iteration expression, evaluated after 
  1250. statement
  1251.  
  1252.     if expr2 omitted then it defaults to true
  1253.     eg.  for(;;) is an infinite loop
  1254.  
  1255.  
  1256.  
  1257. switch    switch(expr)
  1258.        {
  1259.        case n1: ...;
  1260.        case n2: ...;
  1261.          ...
  1262.        default: ...;
  1263.        }
  1264.  
  1265.     case labels must be numbers or char literals;
  1266.     case labels should not be duplicated, at most one 
  1267. default exists;
  1268.     when a case or default is chosen, execution 
  1269. continues until
  1270.     break or end of block
  1271.  
  1272. break    terminate smallest enclosing  while. do, for, 
  1273. switch
  1274.  
  1275. continue continue smallest enclosing  while. do, for
  1276.  
  1277. return    return opt-expr        return from function 
  1278. with optional value
  1279.     void functions must not return a value
  1280.  
  1281.  
  1282.  
  1283. ASSEMBLER PROGRAMMING INTERFACE
  1284.  
  1285. Miracle C functions can call, and be called by, assembler 
  1286. routines.
  1287.  
  1288. Function call is by pushing arguments onto the stack in 
  1289. right to left order,
  1290. and call (pushes ip on stack). The called function pushes 
  1291. bp and allocate
  1292. stack space for local variables. Function return is the 
  1293. reverse; deallocate
  1294. local variables, pop bp, return; caller pops arguments.
  1295.  
  1296.         +-------+
  1297.         | arg n |
  1298.         |   .   |
  1299.         |   .   |
  1300.         | arg 1 |
  1301.         |  ip   |
  1302.         |  bp   |
  1303.         | local |
  1304.         |   .   |
  1305.         |   .   |
  1306.         | local |
  1307.         +-------+
  1308.  
  1309. At entry to a C function, SP points to the return value 
  1310. of IP on the stack.
  1311. To access word arguments;
  1312.  
  1313.         push    bp
  1314.         mov    bp,sp
  1315.         mov    AX,[bp+2]    ; first argument
  1316.         mov    BX,[bp+4]    ; second argument
  1317.         ...
  1318.         pop    bp
  1319.         mov    ax,retvalue    ; return value
  1320.         ret
  1321.  
  1322.  
  1323.  
  1324. FUNCTION LIBRARY
  1325.  
  1326. Startup code
  1327.  
  1328. The startup code initializes segment registers, sets 
  1329. argc/argv parameters
  1330. to zero, and calls function `main'. If `main' returns to 
  1331. the startup routine,
  1332. an exit handler is called which closes files and 
  1333. terminates.
  1334.  
  1335.  
  1336.  
  1337. Include header files
  1338.  
  1339. The following header files are supplied with the compiler 
  1340. in the 'include' subdirectory.
  1341.  
  1342. ctype.h        Prototypes for alphanumeric test and 
  1343. conversion functions.
  1344. io.h        Prototypes for elementary file functions.
  1345. stdio.h        Prototypes for higher level file handling 
  1346. and input/output functions.
  1347. string.h        Prototypes for memory and string handling 
  1348. functions.
  1349. system.h    Prototypes for memory and other functions.
  1350.  
  1351.  
  1352.  
  1353. Library Functions
  1354.  
  1355. The Miracle C library contains functions for string 
  1356. handling, file operations, input/output formatting, 
  1357. memory allocation and other functions.
  1358.  
  1359.  
  1360.  
  1361. abs, labs
  1362.  
  1363.     #include <system.h>
  1364.  
  1365.     int abs(int i)
  1366.     long labs(long i)
  1367.  
  1368.  
  1369.     Produces the absolute (positive or zero) value of 
  1370. its argument.
  1371.     abs takes an int argument returning an int, labs 
  1372. takes a long argument and returns a long.
  1373.  
  1374.  
  1375.  
  1376. calloc
  1377.  
  1378.     #include <system.h>
  1379.  
  1380.     void *calloc(int nitems, int itemsize)
  1381.  
  1382.     Allocates a block of memory that ia nitems * 
  1383. itemsize bytes in size from the heap. The
  1384.     initial contents of the block is zeroed.
  1385.     If not enough memory is available to satisfy the 
  1386. request a null pointer is returned. Since the
  1387.     compiler uses the small memory model, memory 
  1388. requests should be made accordingly.
  1389.     Allocated memory should be freed explicitly when it 
  1390. is no longer required.
  1391.  
  1392.  
  1393.     Example
  1394.  
  1395.         #include <system.h>
  1396.         #include <stdio.h>
  1397.  
  1398.         void main()
  1399.         {
  1400.             char **buffer;
  1401.             int nitems=100;
  1402.  
  1403.             buffer = calloc(nitems,sizeof(char *));    /* 
  1404. allocate 50 pointers to char */
  1405.             if(buffer==NULL)
  1406.                 {
  1407.                     printf("out of memory\n");
  1408.                     exit(1);
  1409.                 }
  1410.             printf("calloc allocated %d items of %d at 
  1411. : %x\n",nitems,sizeof(char *),buffer);
  1412.             free(buffer);
  1413.             return;
  1414.         }
  1415.  
  1416.  
  1417.  
  1418. close
  1419.  
  1420.     #include <io.h>
  1421.  
  1422.     int close(int fd)
  1423.  
  1424.     Close the file given by file descriptor handle `fd'. 
  1425. freesing the file descriptor for use by
  1426.     another file.
  1427.     close does not write an eof character 26.
  1428.     Returns 0 if successful, otherwise -1 if failed.
  1429.  
  1430.  
  1431.     Example
  1432.         #include <io.h>
  1433.         #include <stdio.h>
  1434.         #include <system.h>
  1435.  
  1436.         void main()
  1437.         {
  1438.         int fd;
  1439.             if((fd = open("tfile",O_RDONLY))<0)
  1440.                 {
  1441.                     printf("failed to open tfile\n");
  1442.                     exit(1);
  1443.                 }
  1444.             printf("close code %d\n",close(fd));
  1445.             return;
  1446.         }
  1447.  
  1448.  
  1449.  
  1450. create
  1451.  
  1452.     #include <io.h>
  1453.  
  1454.     int create(char *fname)
  1455.  
  1456.     Create a file with name `fname'.
  1457.     If successful, returns a file descriptor for the 
  1458. newly created file. Otherwise returns -1 if
  1459.     unsuccessful.
  1460.  
  1461.  
  1462.     Example
  1463.         #include <io.h>
  1464.         #include <stdio.h>
  1465.  
  1466.         void main()
  1467.         {
  1468.             int n;
  1469.             n = create ("tfile");
  1470.             if (n == -1) {
  1471.                 printf("Cannot create tfile\n");
  1472.             }
  1473.             return;
  1474.         }
  1475.  
  1476.  
  1477.  
  1478. exit
  1479.  
  1480.     #include <system.h>
  1481.  
  1482.     void exit(int code)
  1483.  
  1484.     Closes files, flushes all output buffers and 
  1485. terminates with return code `code'.
  1486.  
  1487.     Example
  1488.         #include <io.h>
  1489.         #include <stdio.h>
  1490.         #include <system.h>
  1491.  
  1492.         void main()
  1493.         {
  1494.             int n;
  1495.             n = create ("tfile");
  1496.             if (n == -1) {
  1497.                 printf("Cannot create tfile\n");
  1498.                 exit(1);
  1499.             }
  1500.             exit(0);
  1501.         }
  1502.  
  1503.  
  1504.  
  1505. fclose
  1506.  
  1507.     #include <stdio.h>
  1508.  
  1509.     int fclose(FILE *fp)
  1510.  
  1511.     Close an open file, and flush output buffer for the 
  1512. file. Returns 0 if successful, EOF if not.
  1513.  
  1514.     Example
  1515.         #include <io.h>
  1516.         #include <stdio.h>
  1517.  
  1518.         void main()
  1519.         {
  1520.             FILE *fp;
  1521.             if((fp = fopen("tfile","r"))==NULL) {
  1522.                 printf("failed to open file tfile\n");
  1523.                 return;
  1524.             }
  1525.             else {
  1526.                     fclose(fp);
  1527.                     printf("closed file tfile\n");
  1528.                 }
  1529.             return;
  1530.         }
  1531.  
  1532. feof
  1533.  
  1534.     #include <stdio.h>
  1535.  
  1536.     int feof(FILE *fp)
  1537.  
  1538.     Tests end of file condition for file fp. Returns 
  1539. non-zero if end of file.
  1540.     After an EOF condition no further reads should be 
  1541. performed.
  1542.  
  1543.     Example
  1544.         #include <io.h>
  1545.         #include <stdio.h>
  1546.  
  1547.         void main()
  1548.         {
  1549.             FILE *fp;
  1550.             char buffer[100];
  1551.  
  1552.             fp = fopen ("tfile", "r");
  1553.  
  1554.                     while ( !feof(fp) )
  1555.             fgets(buffer, 100, fp);
  1556.  
  1557.             return;
  1558.         }
  1559.  
  1560.  
  1561.  
  1562. fflush
  1563.  
  1564.     #include <stdio.h>
  1565.  
  1566.     int fflush(FILE *fp)
  1567.  
  1568.     Flush buffer for an output file. If the file is open 
  1569. for writing the output buffer is wriiten to
  1570.     disk. If it is open for reading the buffer     is 
  1571. cleared and another read operation is forced
  1572.     to occur.
  1573.  
  1574.     Returns 0 is operation successful, otherwise EOF if 
  1575. an error occurred.
  1576.  
  1577.     Example
  1578.         #include <stdio.h>
  1579.         #include <system.h>
  1580.  
  1581.         void main()
  1582.         {
  1583.         FILE *fp;
  1584.  
  1585.             if((fp = fopen("tfile","w"))==NULL)
  1586.                  exit(1);
  1587.  
  1588.             fflush(fp);
  1589.         }
  1590.  
  1591.  
  1592.  
  1593. fgetc
  1594.  
  1595.     #include <stdio.h>
  1596.  
  1597.     int fgetc(FILE *fp)
  1598.  
  1599.     Reads and returns a character from a file. Returns 
  1600. next character or EOF.
  1601.  
  1602.  
  1603.     Example
  1604.         #include <stdio.h>
  1605.  
  1606.         void main()
  1607.         {
  1608.             FILE *fp;
  1609.  
  1610.             fp = fopen ("tfile", "r");
  1611.  
  1612.              while ( !feof(fp) )
  1613.             putchar(fgetc(fp));
  1614.  
  1615.             return;
  1616.         }
  1617.  
  1618.  
  1619.  
  1620. fgets
  1621.  
  1622.     #include <stdio.h>
  1623.  
  1624.     char *fgets(char *buf, int n, FILE *fp)
  1625.  
  1626.     Get a string (maximum n characters) from file `fp' 
  1627. to buffer `buf'.
  1628.     Returns NULL if an error occurred or no characters 
  1629. were read,
  1630.     otherwise returns the (null-terminated) string.
  1631.  
  1632.     Example
  1633.         #include <io.h>
  1634.         #include <stdio.h>
  1635.  
  1636.         void main()
  1637.         {
  1638.             FILE *fp;
  1639.             char buffer[100];
  1640.  
  1641.             fp = fopen ("tfile", "r");
  1642.  
  1643.                     while ( !feof(fp) )
  1644.             fgets(buffer, 100, fp);
  1645.  
  1646.             return;
  1647.         }
  1648.  
  1649.  
  1650.  
  1651. fopen
  1652.  
  1653.     #include <stdio.h>
  1654.  
  1655.     FILE *fopen(char *name, char *mode)
  1656.  
  1657.     Open a file with filename `name' returning a pointer 
  1658. to FILE.
  1659.     The following modes are allowed;
  1660.         `r'    open file for reading only
  1661.         `w'    open file for writing
  1662.         `a'    open file for append; position at end of 
  1663. file
  1664.  
  1665.         `r+'    open file for reading and writing
  1666.         `a+' `w+' create new file for reading and 
  1667. writing
  1668.  
  1669.  
  1670.     Example
  1671.         #include <io.h>
  1672.         #include <stdio.h>
  1673.  
  1674.         void main()
  1675.         {
  1676.             FILE *fp;
  1677.             if((fp = fopen("tfile","r"))==NULL) {
  1678.                 printf("failed to open file tfile\n");
  1679.                 return;
  1680.             }
  1681.             else {
  1682.                     fclose(fp);
  1683.                     printf("closed file tfile\n");
  1684.                 }
  1685.             return;
  1686.         }
  1687.  
  1688.  
  1689.  
  1690. fprintf
  1691.  
  1692.     #include <stdio.h>
  1693.  
  1694.     int fprintf(FILE *fp, char *fmt, ...)
  1695.  
  1696.     Print formatted values to file. Arguments follow the 
  1697. format string and are interpreted
  1698.     according to the format string.
  1699.     fprintf writes its characters to the file stream fp.
  1700.  
  1701.     The format string is a sequence of characters with 
  1702. embedded conversion commands.
  1703.     Characters at are not part of the conversion 
  1704.     command are output. Conversion commands
  1705.     are the same as for the printf function.
  1706.  
  1707.     fprintf returns the number of characters written.
  1708.  
  1709.     Example
  1710.         #include <io.h>
  1711.         #include <stdio.h>
  1712.  
  1713.         void main()
  1714.         {
  1715.             FILE *fp;
  1716.             char *msg = "number formats are: ";
  1717.             int n = 42;
  1718.             fp=fopen("con","w");
  1719.  
  1720.             fprintf(fp,"%sx: 0%x d: %d o: 
  1721. %o\n",msg,n,n,n,n);
  1722.             fclose(fp);
  1723.             return;
  1724.         }
  1725.  
  1726.  
  1727.  
  1728. fputc
  1729.  
  1730.     #include <stdio.h>
  1731.  
  1732.     int fputc(int c, FILE *fp)
  1733.  
  1734.     Write a character c to file fp. Returns the 
  1735. character written.
  1736.  
  1737.     Example
  1738.         #include <io.h>
  1739.         #include <stdio.h>
  1740.  
  1741.         void main()
  1742.         {
  1743.             FILE *fp;
  1744.             char *buffer = "this text is written to 
  1745. console";
  1746.             fp=fopen("con","w");
  1747.  
  1748.             while(*buffer)
  1749.                 fputc(*buffer++, fp);
  1750.             fclose(fp);
  1751.             return;
  1752.         }
  1753.  
  1754.  
  1755.  
  1756. fputs
  1757.  
  1758.     #include <stdio.h>
  1759.  
  1760.     int fputs(char *str, FILE *fp)
  1761.  
  1762.     Write a string str to file stream fp.
  1763.     Returns non-negative if successful, EOF if error 
  1764. occurred.
  1765.  
  1766.     Example
  1767.         #include <io.h>
  1768.         #include <stdio.h>
  1769.  
  1770.         void main()
  1771.         {
  1772.             FILE *fp;
  1773.             char *buffer = "this text is written to 
  1774. console";
  1775.             fp=fopen("con","w");
  1776.             fputs(buffer,fp);
  1777.             fclose(fp);
  1778.             return;
  1779.         }
  1780.  
  1781.  
  1782. fread
  1783.  
  1784.     #include <stdio.h>
  1785.  
  1786.     int fread(void *buf, int sizelem, int n, FILE *fp);
  1787.  
  1788.     Read `n' items, each of size `sizelem' from file 
  1789. `fp' into buffer `buf'.
  1790.     Returns the number of complete elements read.
  1791.  
  1792.     Example
  1793.         #include <io.h>
  1794.         #include <stdio.h>
  1795.         #include <system.h>
  1796.  
  1797.         void main()
  1798.         {
  1799.             FILE *fp;
  1800.             char *dest;
  1801.             int n;
  1802.  
  1803.             if((fp = fopen("tfile","r")) == NULL) 
  1804. return;
  1805.             dest = calloc(81,1);
  1806.             n = fread(dest,1,80,fp);
  1807.             printf("read %d bytes\n%s",n,dest);
  1808.             return;
  1809.         }
  1810.  
  1811.  
  1812.  
  1813. free
  1814.  
  1815.     #include <system.h>
  1816.  
  1817.     void free(void *ptr)
  1818.  
  1819.     Free memory block pointed to by `ptr'. The memory 
  1820. block described by ptr must have been
  1821.     allocated by calloc, malloc or realloc.
  1822.  
  1823.     Example
  1824.         #include <stdio.h>
  1825.         #include <system.h>
  1826.  
  1827.         void main()
  1828.         {
  1829.           char *p;
  1830.           if((p = malloc(100)) == NULL) {
  1831.               printf("out of memory\n");
  1832.               return; }
  1833.           free(p);
  1834.           return;
  1835.           }
  1836.  
  1837.  
  1838.  
  1839. fscanf
  1840.  
  1841.     #include <stdio.h>
  1842.  
  1843.     int fscanf(FILE *fp, char *format,...);
  1844.  
  1845.     Read characters from file `fp' and convert according 
  1846. to format string `format', storing via
  1847.     argument pointers which follow `format'.
  1848.     See the description of`scanf' for input format 
  1849. specification.
  1850.  
  1851.     Returns the number of arguments read from input.
  1852.  
  1853.     Example
  1854.         #include <stdio.h>
  1855.         #include <system.h>
  1856.  
  1857.         void main()
  1858.         {
  1859.         FILE *fp;
  1860.         char fst[10], sec[20];
  1861.         int n;
  1862.  
  1863.         fp=fopen("con","r");
  1864.         fscanf(fp, "%s %s %d",fst,sec,&n);
  1865.         printf("You typed %s %s %d\n",fst,sec,n);
  1866.         return;
  1867.         }
  1868.  
  1869.  
  1870.  
  1871. fwrite
  1872.  
  1873.     #include <stdio.h>
  1874.  
  1875.     int fwrite(void *buffer,int sizelem, int n,FILE 
  1876. *fp);
  1877.  
  1878.     Write `n' items, each of size `sizelem' to file `fp' 
  1879. from
  1880.     buffer `buf'.
  1881.  
  1882.     Returns the number of complete elements written.
  1883.  
  1884.  
  1885.  
  1886. getc
  1887.  
  1888.     #include <stdio.h>
  1889.  
  1890.     int getc(char *fp)
  1891.  
  1892.     Get a single character from file `fp'. Returns the 
  1893. character, or EOF if input error.
  1894.  
  1895.     Example
  1896.  
  1897.         #include <stdio.h>
  1898.  
  1899.         void main()
  1900.         {
  1901.             int n;
  1902.             FILE *fp;
  1903.  
  1904.             fp = fopen ("tfile", "r");
  1905.  
  1906.              while ( !feof(fp) )
  1907.             putchar(getc(fp));
  1908.  
  1909.             return;
  1910.         }
  1911.  
  1912.  
  1913.  
  1914. getchar
  1915.  
  1916.     #include <stdio.h>
  1917.  
  1918.     int getchar()
  1919.  
  1920.     Get a single character from stdin. Returns the 
  1921. character, or EOF if input error.
  1922.  
  1923.     Example
  1924.  
  1925.         #include <stdio.h>
  1926.  
  1927.         void main()
  1928.         {
  1929.             int n;
  1930.             FILE *fp;
  1931.  
  1932.              while ((n=getchar())!=EOF)
  1933.             putchar(n);
  1934.  
  1935.             return;
  1936.         }
  1937.  
  1938.  
  1939.  
  1940. gets
  1941.  
  1942.     #include <stdio.h>
  1943.  
  1944.     char *gets(char *buf)
  1945.  
  1946.     Get string from stdin into buffer `buf'. Reads 
  1947. characters from file until newline or end-of-
  1948.     file. The string written to `buf' is null-
  1949. terminated.
  1950.  
  1951.     If a string was read into the buffer it's returned, 
  1952. else returns NULL.
  1953.  
  1954.     Example
  1955.  
  1956.         #include <stdio.h>
  1957.  
  1958.         void main()
  1959.         {
  1960.             char buf[80];
  1961.             gets(buf); puts(buf);
  1962.             return;
  1963.         }
  1964.  
  1965.  
  1966.  
  1967. is-ctype
  1968.  
  1969.     #include <ctype.h>
  1970.  
  1971.     int isxx(char c)
  1972.  
  1973.     Test a character to see if it's of a specified type.
  1974.     If it is, a non-zero value is returned; if not, zero 
  1975. is returned.
  1976.  
  1977.  
  1978.         isalnum        alphanumeric, letter or digit
  1979.         isalpha        alpha, letter
  1980.         isascii        ascii, 0-127
  1981.         iscntrl        control character
  1982.         isdigit        digit
  1983.         isgraph        graphic, printable
  1984.         islower        lowercase letter
  1985.         isprint        printable
  1986.         ispunct        punctuation
  1987.         isspace        space character
  1988.         isupper        uppercase letter
  1989.         isxdigit    hex digit
  1990.  
  1991.  
  1992.  
  1993. malloc
  1994.  
  1995.     #include <system.h>
  1996.  
  1997.     void *malloc(int n)
  1998.  
  1999.     Allocate buffer of n bytes from the heap,
  2000.     Returns address of buffer, or NULL if no memory 
  2001. available.
  2002.  
  2003.     Example
  2004.         #include <stdio.h>
  2005.         #include <system.h>
  2006.  
  2007.         void main()
  2008.         {
  2009.           char *p;
  2010.           if((p = malloc(100)) == NULL) {
  2011.               printf("out of memory\n");
  2012.               return; }
  2013.           free(p);
  2014.           return;
  2015.           }
  2016.  
  2017.  
  2018.  
  2019. memchr
  2020.  
  2021.     #include <string.h>
  2022.  
  2023.     void *memchr(void *buf, int c, int count);
  2024.  
  2025.     Search buffer `buf' for a character `c'. The search 
  2026. stops when a character `c' is found, or
  2027.     after `count' bytes.
  2028.  
  2029.  
  2030.  
  2031. memcmp
  2032.  
  2033.     #include <string.h>
  2034.  
  2035.     int memcmp(void *buf1, void *buf2, int n);
  2036.  
  2037.     Compare data in buffers `buf1' and `buf2', of size 
  2038. `n'.
  2039.  
  2040.     Returns        = 0    buf1 and buf2 hold identical 
  2041. data
  2042.             < 0    first differing byte in buf1 < buf2
  2043.             > 0    first differing byte in buf1 > buf2
  2044.  
  2045.  
  2046.  
  2047. memcpy, memmove
  2048.  
  2049.     #include <string.h>
  2050.  
  2051.     void *memcpy(void *buf1, void *buf2, int count);
  2052.     void *memmove(void *buf1, void *buf2, int count);
  2053.  
  2054.     Copy `count' bytes from buffer `buf2' to buffer 
  2055. `buf1'.
  2056.     Returns `buf1'.
  2057.  
  2058.  
  2059.  
  2060. memset
  2061.  
  2062.     #include <string.h>
  2063.  
  2064.     void *memset(void *buf, int val, int n);
  2065.  
  2066.     Sets contents of buffer `buf' of size `n' to value 
  2067. `val'.
  2068.     Returns buffer `buf'.
  2069.  
  2070.  
  2071.  
  2072. open
  2073.  
  2074.     #include <io.h>
  2075.  
  2076.     int open(char *name, int mode)
  2077.  
  2078.     Open a disk file `name' using read/write mode 
  2079. `mode', which can be O_RDONLY,
  2080.     O_WRONLY, O_RDWR
  2081.     returns file handle for the opened file, or EOF if 
  2082. there was an error opening the file.
  2083.  
  2084.     The mode may be    0 read-only    O_RDONLY
  2085.                 1 write-only    O_WRONLY
  2086.                 2 read-write    O_RDWR
  2087.  
  2088.     Example
  2089.         #include <io.h>
  2090.         #include <stdio.h>
  2091.  
  2092.         void main()
  2093.         {
  2094.             int fd;
  2095.             if (EOF == (fd = open("tfile",O_RDWR))) {
  2096.                 printf ("failed to open tfile");
  2097.             }
  2098.             return;
  2099.         }
  2100.  
  2101.  
  2102.  
  2103. printf
  2104.  
  2105.     #include <stdio.h>
  2106.  
  2107.     int printf(char *fmt, ...)
  2108.  
  2109.     Print formatted values to screen. Arguments follow 
  2110. the format string and are interpreted
  2111.     according to the format string.
  2112.     The format string is a sequence of characters with 
  2113. embedded conversion commands.
  2114.     Characters that are not part of the conversion 
  2115. command are output.
  2116.  
  2117.     printf returns the number of characters written.
  2118.  
  2119.     The format string can contain text values, or a 
  2120. format specification for arguments, one per
  2121.     argument, beginning with a `%' character, the type 
  2122. matching the argument's type;
  2123.  
  2124.     % (conversion-flag) (min-field-width) (precision) 
  2125. (operation)
  2126.  
  2127.     eg %-20s  %12.4d
  2128.  
  2129.     The conversion flag character can be one of
  2130.  
  2131.         -    left adjust
  2132.         +    force sign output
  2133.         0    pad with 0 instead of space
  2134.         (space)    produce sign `-' or space
  2135.  
  2136.     Minimum field width is the minimum number of 
  2137. characters output for the field; if fewer
  2138.     characters are available from the argument, pad 
  2139. characters (0 or space) are inserted.
  2140.  
  2141.     Precision is the minimum number of characters 
  2142. printed from a number, or the maximum
  2143.     number of characters printed from a string.
  2144.  
  2145.     Operation specifies the expected argument type and 
  2146. what will be output; the expected output
  2147.     type must match the type of the corresponding 
  2148. argument for output to be meaningful.
  2149.  
  2150.         `h'    short int
  2151.         `l'    long int
  2152.         `c'    character
  2153.         `d' `i'     integer
  2154.         `o'    octal integer
  2155.         `p'    pointer
  2156.         `x'    hexadecimal
  2157.         `s'    string
  2158.         `u'    unsigned
  2159.     
  2160.     The number of characters written is returned.
  2161.  
  2162.     Example
  2163.         #include <io.h>
  2164.         #include <stdio.h>
  2165.  
  2166.         void main()
  2167.         {
  2168.             char *msg = "number formats are: ";
  2169.             int n = 42;
  2170.  
  2171.             printf(fp,"%sx: 0%x d: %d o: 
  2172. %o\n",msg,n,n,n,n);
  2173.             return;
  2174.         }
  2175.  
  2176.  
  2177.  
  2178. putc
  2179.  
  2180.     #include <stdio.h>
  2181.  
  2182.     int putc(int c, FILE *fp)
  2183.  
  2184.     Write character `c' to file `fp'. Returns `c'.
  2185.  
  2186.  
  2187.  
  2188. putchar
  2189.  
  2190.     #include <stdio.h>
  2191.  
  2192.     int putchar(int c)
  2193.  
  2194.     Write character `c' to stdout. Returns `c'.
  2195.  
  2196.     Example
  2197.  
  2198.         #include <stdio.h>
  2199.  
  2200.         void main()
  2201.         {
  2202.             int n;
  2203.             FILE *fp;
  2204.  
  2205.             fp = fopen ("tfile", "r");
  2206.  
  2207.              while ( !feof(fp) )
  2208.             putchar(getc(fp));
  2209.  
  2210.             return;
  2211.         }
  2212.  
  2213.  
  2214.  
  2215. puts
  2216.  
  2217.     #include <stdio.h>
  2218.  
  2219.     int puts(char *str)
  2220.  
  2221.     Writes string `str' to stdout, then writes a newline 
  2222. character.
  2223.  
  2224.     Example
  2225.  
  2226.         #include <stdio.h>
  2227.  
  2228.         void main()
  2229.         {
  2230.             char buf[80];
  2231.             gets(buf); puts(buf);
  2232.             return;
  2233.         }
  2234.  
  2235.  
  2236.  
  2237. read
  2238.  
  2239.     #include <io.h>
  2240.  
  2241.     int read(int fd, void *buf, int n)
  2242.  
  2243.     Read `n' bytes from file given by file descriptor 
  2244. `fd' into buffer `buf'. Direct DOS read from
  2245.     file.
  2246.  
  2247.     Returns        -1  error
  2248.             0   end of file
  2249.             n   number of bytes read
  2250.  
  2251.     Example
  2252.  
  2253.         #include <io.h>
  2254.         #include <stdio.h>
  2255.  
  2256.         void main()
  2257.         {
  2258.             char buf[80];
  2259.             int fd;
  2260.             if (EOF == (fd = open("tfile",O_RDWR))) {
  2261.                 printf ("failed to open tfile");
  2262.             }
  2263.             read(fd,buf,80); puts(buf);
  2264.             return;
  2265.         }
  2266.  
  2267.  
  2268.  
  2269. scanf
  2270.  
  2271.     #include <stdio.h>
  2272.  
  2273.     int scanf(char *format,...);
  2274.  
  2275.     Read arguments from stdin. Parse it according to 
  2276. specification in `format' string, and assign
  2277.     input to arguments following the format string.
  2278.  
  2279.     The arguments following `format' must be pointers to 
  2280. objects where the input is to be stored,
  2281.     and must match the specification in the format 
  2282. string.
  2283.  
  2284.     Returns the number of arguments assigned to. If no 
  2285. arguments were assigned, an EOF is
  2286.     returned.
  2287.  
  2288.     The format string may contain;
  2289.  
  2290.         - space characters; skip whitespace characters 
  2291. in input.
  2292.  
  2293.         - any other characters (except %) which should 
  2294. match input
  2295.           (match a `%' character by specifying `%%')
  2296.  
  2297.         - input conversion specification
  2298.  
  2299.             % (size) conversion-char
  2300.  
  2301.     If the conversion specification is %*(size) c-char 
  2302. then the converted input is not
  2303.     stored and no argument is used.
  2304.  
  2305.     If `size' is specified then at most `size' 
  2306. characters are converted. Otherwise
  2307.     conversion stops when an invalid input character is 
  2308. read.
  2309.  
  2310.     The conversion character specifies the input object 
  2311. type and must match the type of
  2312.     argument pointer;
  2313.  
  2314.         `h'    short int
  2315.         `l'    long int
  2316.         `c'    character
  2317.         `d' `i' integer
  2318.         `x'    hexadecimal
  2319.         `s'    string
  2320.  
  2321.  
  2322.     Example
  2323.  
  2324.         #include <io.h>
  2325.         #include <stdio.h>
  2326.  
  2327.         void main()
  2328.         {
  2329.             unsigned n;
  2330.             printf("type a number: ");
  2331.             scanf("%i",&n);
  2332.             printf("number %d is %x hex",n,n);
  2333.             return;
  2334.         }
  2335.  
  2336.  
  2337.  
  2338. sprintf
  2339.  
  2340.     #include <stdio.h>
  2341.  
  2342.     int sprintf(char *buf, char *fmt, ...)
  2343.  
  2344.     Print formatted values to memory. Arguments follow 
  2345. the format string and are interpreted
  2346.     according to the format string.
  2347.  
  2348.     sprintf returns the number of characters written.
  2349.     See printf for description of format string.
  2350.  
  2351.  
  2352.  
  2353. sscanf
  2354.  
  2355.     #include <stdio.h>
  2356.  
  2357.     int sscanf(char *buf, char *fmt, ...)
  2358.  
  2359.     Parse string in buffer `buf' according to 
  2360. specification in `format' string, and assign input to
  2361.     arguments following the format string.
  2362.  
  2363.     The arguments following `format' must be pointers to 
  2364. objects where the input is to be stored,
  2365.     and must match the specification in the format 
  2366. string.
  2367.  
  2368.     Returns the number of arguments assigned to. If no 
  2369. arguments were assigned, an EOF is
  2370.     returned.
  2371.  
  2372.  
  2373.  
  2374. strcat
  2375.  
  2376.     #include <string.h>
  2377.  
  2378.     char *strcat(char *buf1,  char *buf2)
  2379.  
  2380.     Catenate null-terminated string in `buf2' to the 
  2381. string in buffer `buf1'. Returns `buf1'.
  2382.  
  2383.  
  2384.  
  2385. strchr
  2386.  
  2387.     #include <string.h>
  2388.  
  2389.     char *strchr(char *str, int c)
  2390.  
  2391.     Search string `str' for character `c', return first 
  2392. occurrence.
  2393.  
  2394.  
  2395.  
  2396. strcmp
  2397.  
  2398.     #include <string.h>
  2399.  
  2400.     int strcmp(char *str1, char *str2)
  2401.  
  2402.     Compare null-terminated strings `str1' and `str2'. 
  2403. If they are identical then return 0. If the
  2404.     first differing character in `str1' is greater than 
  2405. that in `str2' then return a positive value,
  2406.     else return a negative value.
  2407.  
  2408.  
  2409.  
  2410. strcpy
  2411.  
  2412.     #include <string.h>
  2413.  
  2414.     char *strcpy(char *buf1, char *buf2)
  2415.  
  2416.     Copy null-terminated string in `buf2' to buffer 
  2417. `buf1'.
  2418.  
  2419.  
  2420.  
  2421. strdup
  2422.  
  2423.     #include <string.h>
  2424.  
  2425.     char *strdup(char *str)
  2426.  
  2427.     Create copy of null-terminated string `str' in newly 
  2428. allocated buffer, and return the buffer.
  2429.  
  2430.  
  2431.  
  2432. strlen
  2433.  
  2434.     #include <string.h>
  2435.  
  2436.     int strlen(char *str)
  2437.  
  2438.     Return length of null-terminated string `str'.
  2439.  
  2440.  
  2441.  
  2442. strlwr
  2443.  
  2444.     #include <string.h>
  2445.  
  2446.     char *strlwr(char *str)
  2447.  
  2448.     Convert string `str' to lowercase and return it.
  2449.  
  2450.  
  2451.  
  2452. strncat
  2453.  
  2454.     #include <string.h>
  2455.  
  2456.     char *strncat(char *buf1, char *buf2, int n)
  2457.  
  2458.     Catenate null-terminated string in `buf2' to null-
  2459. terminated string in `buf1'. At most `n'
  2460.     bytes are catenated.
  2461.     Returns `buf1'.
  2462.  
  2463.  
  2464.  
  2465. strncmp
  2466.  
  2467.     #include <string.h>
  2468.  
  2469.     int strncmp(char *buf1, char *buf2, int n)
  2470.  
  2471.     Compare null-terminated strings `str1' and `str2'. 
  2472. The strings are compared for at most `n'
  2473.     characters. If they are identical then return 0. If 
  2474. the first differing character in `str1' is
  2475.     greater than that in `str2' then return a positive 
  2476. value, else return a negative value.
  2477.  
  2478.  
  2479.  
  2480. strncpy
  2481.  
  2482.     #include <string.h>
  2483.  
  2484.     char *strncpy(char *buf1, char *buf2, int n)
  2485.  
  2486.     Copy null-terminated string in buffer `buf2' to 
  2487. buffer `buf1'. Exactly `n' characters are
  2488.     copied. If `buf2' contains fewer than `n' 
  2489. characters, destination `buf1' is padded with nulls.
  2490.  
  2491.  
  2492.  
  2493. strnicmp
  2494.  
  2495.     #include <string.h>
  2496.  
  2497.     int strnicmp(char *buf1, char *buf2, int n)
  2498.  
  2499.     Compares `n' characters of strings `buf1' and 
  2500. `buf2', ignoring case.
  2501.  
  2502.     Returns        0    strings equal, ignoring case
  2503.             < 0    first differing character `buf1' < 
  2504. `buf2'
  2505.             > 0    first differing character `buf1' > 
  2506. `buf2'
  2507.  
  2508.  
  2509.  
  2510. strpbrk
  2511.  
  2512.     #include <string.h>
  2513.  
  2514.     char *strpbrk(char *str1, char *str2)
  2515.  
  2516.     Search string `str1' for a character occurring in 
  2517. string `str2', return first occurrence.
  2518.  
  2519.  
  2520.  
  2521. strrchr
  2522.  
  2523.     #include <string.h>
  2524.  
  2525.     char *strrchr(char *buf, int c)
  2526.  
  2527.     Search null-terminated string in buffer `buf' for 
  2528. character `c', returning pointer to last
  2529.     occurrence of `c' in `buf'.
  2530.  
  2531.  
  2532.  
  2533. strrev
  2534.  
  2535.     #include <string.h>
  2536.  
  2537.     char *strrev(char *str)
  2538.  
  2539.     Reverses the contents of string `str'. Returns 
  2540. `str'.
  2541.  
  2542.  
  2543.  
  2544. strspn
  2545.  
  2546.     #include <string.h>
  2547.  
  2548.     int strspn(char *str1, char *str2)
  2549.  
  2550.     Span string `str1' skipping any characters in string 
  2551. `str2'.
  2552.  
  2553.  
  2554.  
  2555. strupr
  2556.  
  2557.     #include <string.h>
  2558.  
  2559.     char *strupr(char *str)
  2560.  
  2561.     Convert string `str' to uppercase, and return 
  2562. uppercased string.
  2563.  
  2564.  
  2565.  
  2566. tolower, toupper
  2567.  
  2568.     #include <string.h>
  2569.  
  2570.     int tolower(int c)
  2571.     int toupper(int c)
  2572.  
  2573.     Convert character `c' to lower/upper case.
  2574.  
  2575.  
  2576.  
  2577. ungetc
  2578.  
  2579.     #include <stdio.h>
  2580.  
  2581.     int ungetc(int c, FILE *fp)
  2582.  
  2583.     Push character `c' back to input file `fp'. Only one 
  2584. character may be ungetc'd.
  2585.     Returns `c' if succeeded, else EOF.
  2586.  
  2587.     Example
  2588.  
  2589.         #include <io.h>
  2590.         #include <stdio.h>
  2591.         #include <ctype.h>
  2592.  
  2593.         void main()
  2594.         {
  2595.             FILE *fp;
  2596.             char c;
  2597.  
  2598.             fp = fopen("tfile","r");
  2599.             while((c = fgetc(fp)) != EOF)
  2600.                 if(isspace(c))
  2601.                   break;
  2602.                 else
  2603.                   putchar(c);
  2604.  
  2605.           ungetc(c,fp);
  2606.           fclose(fp);
  2607.           return;
  2608.         }
  2609.  
  2610.  
  2611.  
  2612. vsprintf
  2613.  
  2614.     #include <stdio.h>
  2615.  
  2616.     int vsprintf(char *buf, char *fmt, char *args)
  2617.  
  2618.     Prints the arguments pointed to by stack segment 
  2619. pointer `args' to output buffer `buf'.
  2620.     See printf for description of format string,
  2621.     Returns the number of characters written.
  2622.  
  2623.  
  2624.  
  2625. write
  2626.  
  2627.     #include <stdio.h>
  2628.  
  2629.     int write(int fd, void *buffer, int size);
  2630.  
  2631.     Write memory buffer of length `size' to file `fd'. 
  2632. This is a direct DOS write to file.
  2633.     Returns the number of characters written or -1 if 
  2634. error.
  2635.  
  2636.     Example
  2637.  
  2638.         #include <io.h>
  2639.         #include <stdio.h>
  2640.         #include <string.h>
  2641.  
  2642.         void main()
  2643.         {
  2644.             int n, fd;
  2645.             char *buf = "test data to be written";
  2646.  
  2647.             if((fd = open("tfile",O_WRONLY)) == -1)
  2648.                 {
  2649.                     puts("failed to open file");
  2650.                     return;
  2651.                 }
  2652.             n = write(fd,buf,strlen(buf));
  2653.             printf("%u bytes written\n",n);
  2654.             close(fd);
  2655.             return;
  2656.         }
  2657. Miracle C Compiler, version 1.5    Page 5
  2658.  
  2659.  
  2660.