DECUS C LANGUAGE SYSTEM Compiler & Library Software Support Manual by Martin Minow Edited by Robert B. Denny This document describes the RSX/VMS/RSTS/RT11 DECUS C language system runtime support library. It also contains all internal functions is available. and such compiler internal information as DECUS Structured Languages SIG Version of 15-Oct-81 NOTE This software is made available without any support whatsoever. The person responsible for an implementation of this system should expect to have to understand and modify the source code if any problems are encountered in implementing or maintaining the compiler or its run-time library. The DECUS 'Structured Languages Special Interest Group' is the primary focus for communication among users of this software. UNIX is a trademark RSTS/E, RT11 of Bell Telephone Laboratories. RSX, Equipment Corporation. and VMS are trademarks of Digital CHAPTER 1 INTRODUCTION The C support library contains three major groups of functions: o Functions called by the compiler to perform certain mathematical operations (such as floating-point multiply or function entrance) that are not performed in-line. o Functions that may be called by C programs to operations, string, that are perform such as copying a more efficiently performed by optimized assembly language subroutines. o An implementation of (most of) the Unix Standard I/O library. The standard installation procedure yields two documents. The Runtime Support Library Reference Manual describes how to use the C library. The Compiler and Library Software Support Manual contains all user documentation plus additional information on the internals of both the library and the C compiler. is the Software Support Manual. This CHAPTER 2 THE STANDARD LIBRARY WARNING This version of the library is somewhat incompatible with previous versions of the Decus C compiler. This incompatibility allows greater compatibility with Unix Version 7, and the capability of generating global references and definitions containing the radix-50 '$' and '.' characters. All C programs should be linked together with the run- time support library. On systems that support logical device descriptors, this will generally be stored in the C: will be logical device/account. On RSX-11M, the library found in LB:[1,1]. To link a C program, proceed as follows: RSX TKB TKB> task/CP,map=objects,LB:C/LB TKB> / ENTER OPTIONS: TKB> STACK=2000 TKB> // RT11 R LINK *save,map=objects,C:SUPORT,C:CLIB/B:2000 *^C Note that, on RSX-11M, the task should be built checkpointable. This is automatic on RSTS/E and VMS emulated modes. On native RSX-11M, the task-builder may be rebuilt with '/CP' as the default. If the '/CP' switch is not given, the task may abort (no memory) when started. Stack extension is needed if subroutines locally allocate large amounts of data. On RT11, note that the '/B' (bottom) switch must be given to increase the size of the run-time stack. This is needed as local variables are allocated on the stack. size If the stack C Compiler and Library Page 2-2 Software Support Manual is not increased, the program may abort without any error message. The standard I/O interface header file is in C:STDIO.H (LB:[1,1]STDIO.H on native RSX-11M implementations) and should be included in all C programs as follows: #include <stdio.h> 2.1 Introduction to Unix-style Stream I/O ____________ __ __________ ______ ___ This section presents an overview of the 'standard' I/O interface for C programs. These routines have proven easy to use and, while they do not provide the full functionality of RSX or RMS, they give the programer essentially all that is needed for everyday use. The discussion includes the following: - Opening and closing files - Reading data from files - Writing data to files Note that this file system is limited: files are sequential with only a limited amount of random-access capability. Also, little of the power of RMS/FCS is available. On the other hand, the limitations make C programs easily transportable to other operating systems. When a C program is started, three files and opened: stdin stdout The 'standard' input file The 'standard' output file are predefined stderr The 'standard' error file Stderr is always assigned to the command terminal. Stdin and stdout are normally assigned to the command terminal, but may be reassigned or closed when the program starts. 2.2 _______ _____ Opening and Closing Files The fopen and fclose functions control access _______ ___ to files. They are normally used as follows: #include <stdio.h> /* Define standard I/O */ FILE *ioptr; /* Pointer to file area */ ... if ((ioptr = fopen("filename", "mode")) == NULL) error("Can't open file"); C Compiler and Library Page 2-3 Software Support Manual All information about an open file is stored in a buffer whose address is returned by fopen(). The buffer is dynamically allocated when the file is opened and deallocated when the file is closed. Its format is described under the heading IOV. The mode string contains flags defining how the file is to be accessed: r w a Read only Write new file Append to existing file (or write new) (Doesn't work on RT11 modes). It also defines some record-control information: n u No newlines mode ('binary' files) RSX: The user program allocates record buffers RT11: Console output is done using .ttyout If mode 'n' is specified, the RSX I/O routines do not interpret the end of a RMS logical record as defining the end of a human-readable line. This is necessary to process 'binary' information. On RT11, the I/O routines do not remove carriage-returns from input files, nor do they insert carriage-returns when newlines are output. Mode 'u' is treated differently on RSX and RT11. If specified on RSX the user maintains the file's record buffer. The program may only call the fget() and fput() routines. Each such call will be translated directly to an RMS/FCS GET$ or PUT$ call. (In RT11 mode, fput() may be used to write binary records which are subsequently read by fget(). with 'n' mode.) The file should be opened If mode 'u' is specified on RT11 mode when opening the console terminal, single character output will be performed (using the RT11 monitor routine .ttyout). If not specified, output will be one line at a time (using the monitor routine .print). The library initialization process opens stderr in mode 'u' and stdout in normal mode. This means that mixing I/O to both units will result in synchronization problems. To obtain single-character output on stdout, the program need simply execute: if (freopen("tt:", "wu", stdout) == NULL) error(""); The program calls fclose(ioptr) to terminate processing on a file. This closes the file and reclaims system- controlled buffer space. an open file. fmkdl(ioptr) may be called to close and delete C Compiler and Library Page 2-4 Software Support Manual 2.3 Reading Data from a File _______ ____ ____ _ ____ The simplest way to read a file is to call the getchar() or getc() routines which read the next character from a file. For example, the following program counts the number of characters in a file: #include <stdio.h> main() { register int ccount; register int lcount; register int c; FILE *ioptr; if ((ioptr = fopen("foo.bar", "r")) == NULL) error("Cannot open file"); ccount = 0; lcount = 0; while ((c = getc(ioptr)) != EOF) { ccount++; if (c == '\n') lcount++; } printf("%d characters, %d lines.\n", ccount, lcount); } Other input routines include: gets fgets fgetss ungetc fseek Read a line from the standard input Read a line from a file Read a line from a file, remove terminator Push one character back on a file Position the file to a specific record These routines are used together with the ferr() functions for error and and feof() which allow testing end of file conditions, respectively. The package assumes error conditions are lethal and force end of file. that all 2.4 Writing Data to a File _______ ____ __ _ ____ There are several routines for data output which are directly analagous to the data input routines: putchar putc puts fputs fputss ftell Write a character to standard output Write a character to a specified file Write a string to the standard outpt Write a string to a specified file Write a record to a specified file Return record location (for fseek) In addition, the printf() or fprintf() routine is used to format C Compiler and Library Page 2-5 Software Support Manual and print data (as was shown in the previous example). Printf() is flexible, powerful, and easy to use; and is perhaps the single most important routine in the file system. 2.5 Interaction with the Operating System ___________ ____ ___ _________ ______ The support library attempts to provide a consistant operating system interface on several implementations of quite different operating systems. The possiblities include: o Native RT11 o Native RSX-11M or IAS o RT11 o RSX-11M emulated on RSTS/E o RSX-11M emulated on VAX/VMS emulated on RSTS/E This section mentions the inconsistencies and random bugs that are more or less intentionally present. 2.5.1 Logical Unit Numbers _______ ____ _______ RT11, RSTS/E, and RSX-11M use small integers to number all I/O channels. Unfortunately, the numbering is not consistent and channel usage differs among the various systems. has resulted in several quirks: o .ttyout On RT11, console terminal interaction uses the This and .print monitor functions. While no device is opened by the fopen() function, a channel number is reserved. o On RSX-11M, a channel must be allocated to the console terminal. When a C program starts, the 'command terminal' is opened on logical unit 1 and assigned to stderr. This is not done using the fopen() routine (although the stderr IOV structure fopen() Also, is defined as if were called). fclose() cannot close stderr. In addition to the standard I/O routines, there are two routines, msg() and regdmp(), that direct output to logical unit 1. These routines were used to debug the library, and are otherwise useful for disasters. On RT11, msg() monitor function. and regdmp() use the .print C Compiler and Library Page 2-6 Software Support Manual o On both systems, the first true files are stdin and stdout. These are opened on logical units 0 and 1 (RT11) or 2 and 3 (RSX). Code in fclose() double- checks that the logical unit number of the file being closed corresponds to the proper slot in the logical unit table. o Since the standard I/O routines know little about the operating system, they do not deal with certain special features. For example, on RT11, the 'user service routine' (USR) is used to open files. The file open routine does not attempt to locate IOV areas so that the USR does not swap over them. This can be a problem for very large programs. On RSX, logical unit numbers are assigned dynamically. This means that 'LUN assignment' cannot be reliably performed by task-build control files (or task initiation). 2.5.2 The Wild-Card Files fwild() and _________ _____ fnext() routines can be used process 'wild-card' files. On RSX-11M and VMS/RSX extension, emulation, the file name, to and/or file version may be expressed as '*' to indicate wild-card support. Due to restrictions in the RSX-11 Files- structure the ' ', ';0' and ';-1' version numbers 11 (ODS1), will NOT function properly on native RSX-11. This means that '*.MAC' will not work, for instance. The algorithm in fwild() depends on the directory being sorted, as in the ODS2 file structure used on VAX/VMS. If you sort the directory to be used in an fwild() operation (use the SRD program available from DECUS with the /WB switch) in order of decreasing file version numbers, then the " ", ";0", and ";-1" versions will work. Wild-card devices, units, or UIC codes are not supported. Note that, on RSX11 emulated on VMS, the ';-1' (earliest version) requires special processing by the user program, as noted in the description of fwild(). On RSX-11M emulated on RSTS/E, the file name and/or extension may contain '*' or '?' wild-cards. Wild-card devices, units, or UIC (PPN) codes are not supported. On RT-11, the file name and/or extension may contain '*', '%' or '?' wild cards. The '?' wild-card is synonymous with '%'. Wild-card devices, or units are not supported. card Since wild- C Compiler and Library Page 2-7 Software Support Manual support is not an RT-11 system service, the file specification parsing and directory operations are handled by the C library fwild() and fnext() functions. The fwild/fnext module requires about 480 words of storage. Also, a file opened by wildcard uses a 1024 byte buffer, twice the normal size, which is shared between data and directory operations. 2.5.3 Memory allocation Memory is allocated using ______ __________ the malloc() function. It works correctly on all operating systems, expanding memory on RSX and RT11/RSTS. On 'native' RT11, all available memory is allocated by invoking the monitor .settop function with a '-2' argument. Neither library supports extended memory (PLAS) directives. The sbreak() routine may be used for permanent allocation of memory. Once memory has been allocated using sbreak(), it cannot be freed. 2.5.4 Global symbols ______ _______ Global symbols defined or referenced by C programs may cause unexpected parts of the operating-system support library to be loaded, with undesirable consequences. There are several aspects to this problem: o resolved A symbol refered to by a C program which is not by the object modules or libraries may cause some part of the system library to be loaded. For example, if a C program refers to the sqrt() function (which is not present in the standard library), the linker may attempt to load the function from the Fortran library. Since the Fortran sqrt() function contains a reference to the Fortran run-time error message routine, the load map may contain many strange global symbols. o Another problem occurs when a C program defines a global symbol that duplicates a global in the system library. This may prevent loading some necessary part of the system library, causing the link to fail with unresolved global symbols. For example, on RSX-11M on RSTS/E V7.0, the following will fail: int eof; main () { } /* Global */ emulated CHAPTER 3 SUPPORT INFORMATION The C system has been implemented on VMS V2.0, RSX-11M V3.2, RSTS/E V7.0, and RT11 V03B. All installations should expect to have to modify the command procedures to suit their specific needs. While the compiler has been built from scratch on RT11, the procedures unrealistically assume a system with no disk storage limitations. The C system has not been tested on IAS, RSX11-D, RSX11M-PLUS, or HT11. The C system is distributed on 9-track magtape in 'DOS- 11' format. The full distribution requires a 2400 foot (or three 600 foot) tapes. Please Note This is a DECUS 'product'; there is no support available from the authors. The person responsible for an implementation of this system should expect to have to understand and modify the source code if any problems are encountered in implementing or maintaining the compiler or its run-time library. The DECUS 'Structured Languages Special Interest Group' is the primary focus for communication among users of this software. This section the contains information on the internals of compiler, assembler, and run-time libraries. It is not complete; 3.1 it is probably not accurate either. The C Compiler ___ _ ________ The compiler source is distributed on account [5,3]. There are four groups of files in this account: o The C compiler source is in modules named CC???.MAC. The root code is in CC0RT.MAC, while overlays are in CC00?.MAC, CC10?, CC20?, and CC3??. have the following functions: The overlays C Compiler and Library Page 3-2 Software Support Manual 0. Pass 0 reads the input source file, writing a temporary file after processing #define, #include, and #ifdef statements. 1. Pass 1 reads the expanded source file, parses the language and writes an 'intermediate code' file. In the intermediate file all operations have been converted into 'low-level' constructions. Variable and structure references are compiled into absolute expressions. All information needed by the file. Except code generator is contained in this for compiler flags and file names, nothing is retained in memory. 2. Pass 2 reads the code file, writing PDP-11 assembly language (in the format requested by the AS assembler). 3. Pass 3 contains some end of processing code to delete work files. All internal files are in Ascii. In order to make the compiler portable between RSX, RSTS/E, and RT11, the file system is simple and inefficient. RT11 users may run into intermediate file size problems. The only (software) solution requires invoking the compilation with explicit size arguments for the output files: #out.s[N1],interm.tm1[N2],expand.tmp[N3]=in.c The expanded source file should be less than the size of the input file plus all #include files. The intermediate file size may be as much as twice the size of the expanded source file. o C programs are assembled into PDP-11 object code by the AS assembler, whose source files are named 'AS????.MAC'. The AS assembler is described in AS.DOC. o A support library for the two compilers is included in a group of files labeled A?????.MAC. The C compiler build process also builds the support library. This library is similar -- but not identical -- to the run- time support library. The compiler and assembler are installed by executing command files. There are several groups of command files supplied to assist in implementation on the various operating systems. It is highly likely that the files will have to be edited to suit each individual installation's needs. VMS, RSX, and RT11 files are run by the indirect command file processor, while RSTS/E files are run by the ATPK system program. RSTS/E installation requires must be run from a privileged account. C Compiler and Library Page 3-3 Software Support Manual The following file conventions are used: VMS command files begin with the letter 'V', RSTS/E RT11 mode with the letter 'R', and RSTS/E RSX mode with the letter 'X'. Native RT11 command files begin with 'T' and native RSX-11M files begin with the letter 'M'. Thus, XMAKCC.CMD builds the CC compiler for RSTS/E RSX-11M mode. The '.TKB' files are indirect command files for the task-builder. Warning As distributed, the compiler and run-time libraries assume hardware support for the SXT (sign-extend) instruction. This is present on all PDP-11 CPU's with EIS, and on all versions of the LSI-11 (11/03, LSI-11, 11/23). If the compiler is to generate code that will run on the 11/04, 11/05, 11/10, 11/20, or on an 11/40 without EIS; all RSX.MAC and RT11.MAC configuration files must be edited to define symbol C$$SXT equal to zero. Note that the compiler must be build with C$$SXT set correctly. As distributed, the RSX configuration files assume hardware EIS support. If this is not the case (hardware EIS is not needed for RSX-11M) edit the RSX.MAC control files to define symbol C$$EIS equal to zero. There are two RT11 configuration files, and the RSTS/E library build procedure builds an EIS library, CLIB.OBJ, as well as a library without EIS support, CLIBN.OBJ. The default 'native' RT11 command file builds a non-EIS library, naming it CLIB.OBJ. Programs linked against the non-EIS library will run on machines with EIS. Also, save-images linked on RT11 will run on RSTS/E and vice-versa without relinking. There are certain differences in task-image format between native RSX-11M and RSX-11M as emulated on RSTS/E. Thus, only source or object files are transportable between the two operating systems. 3.2 The C Run-time Support Library ________ _______ _______ ___ _ The C support library is distributed on two accounts, [5,4] and [5,5]. Account [5,4] contains only those routines which have no I/O dependencies, while account [5,5] contains the standard I/O library. Many routines are conditionally compiled to select RT11 RSX mode. either All routines should be compiled together with or C Compiler and Library Page 3-4 Software Support Manual RT11.MAC (no EIS support), RT11.EIS (hardware EIS support), or RSX.MAC, identical copies of which are present in each account. To build the libraries, execute one of the following command files: RMAKLB.CMD VMAKLB.COM XMAKLB.CMD MMAKLB.CMD TMAKLB.COM RT11 RSX RSX RSX RT11 library library library library library on on on on on RSTS/E VMS RSTS/E RSX-11M RT11 Account [5,1] contains a program, GETCMD.C which was used to build assembler command files. On RSTS/E, a command file, [5,1]RLBCMD.CMD, may be used to rebuild all library command files. All library source code is in PDP-11 MACRO. 3.3 The RSTS/E Interface Library _________ _______ Account [5,6] contains a library of ___ ______ subroutines that allow programs access to all RSTS/E executive functionality. There C is no documentation other than the source code and [5,6]README.506. 3.4 The RSX-11 Extensions Library __________ _______ Account [5,7] contains a library of ___ ______ subroutines that C programs access to all RSX-11M executive functionality, including AST's. Refer to [5,7]CX.DOC for more information. allow This library has not been completely tested, nor has it been tested on 'emulated' RSX-11M modes (under VMS or RSTS/E), nor on IAS or RSX11-PLUS. 3.5 RT11 Extensions Library ____ __________ _______ Access to RT11 executive functionality may be had by calling the system library (SYSLIB). The C library call() routine may be used to generate the necessary calling sequences. Note that SYSLIB routines that depend on Fortran I/O conventions must not be called. C Compiler and Library Page 3-5 Software Support Manual 3.6 C Tools and Toys _ _____ ___ ____ The distribution kit contains several accounts [6,*] with C programs and subroutines. Account [6,1] contains a library of 'software tools' which should be useful for all C installations. Among these are the following: echo Echo arguments onto the standard output. This program serves as the primary test 'Get regular expression pattern.' This of the run-time library. grep program reads one or more files, printing text lines that match a given pattern. kwik 'Key word in context' utility. sortc A file sort utility. sorts Sort-merge subroutines for incorporation into other programs. wc Count bytes, words, and lines in one or more files. ccxrf Cross-referenced listings for C source files. Please refer to README.??? files in the appropriate accounts for more information. 3.7 _____________ Building the Documentation Compiler and assembler documentation is AS.RNO ________ ___ in CC.RNO and respectivly. These files, stored in [5,1] or [.COMMAND], are compiled into .DOC files by using Runoff. The documentation build control file appends the current problem list CBUGS.RNO to CC.RNO before building the documentation. NOTE In order to create titles properly on VMS "Standard Runoff," a command line is present which may cause a non-fatal error message to be printed by other versions of Runoff, notably RNO.TSK. This error message should be ignored. The source of the library documentation is included the library source (Macro) files. within C Compiler and Library Page 3-6 Software Support Manual To build the library documentation, the following programs must have been built and installed on the system: getrno This program reads the library header file, breaking out wizard and non-wizard sections. It then reads a set of macro files (specified using a wild-card convention). Each file contains its own documentation in the form of commentary. This follows a specific, rigid format as described in the documentation of getrno.c. The output of getrno is a runoff source file which is then merged with the various appendices to the library documentation. The source of getrno.c is stored in [5,1] or [.COMMAND]. The running program is normally stored in C:. getkwk This program reads the library macro files, searching for "Index" entries in the documentation. The output of getkwk is passed directly to kwik. The source of getkwk.c is stored in [5,1] or [.COMMAND]. The running program is normally stored in C:. kwik This is the keyword in context program which is used to build the library index. as It is built part of the tools build procedure. The source of kwik.c is stored in program is [6,1] or [.TOOLS]. The running generally written to a public library, PUB: on RSTS/E, BIN: fixdoc on VMS. On RSTS/E RNO.TSK and VMS "Standard RUNOFF", page numbers are put at the "page right margin" (column 80) instead of the text right margin, column 72. As a workaround, getrno is used to mark runoff .title lines. Fixdoc is then run to straighten out the titles. Note that this is needed for RSTS/E RNO and VMS RUNOFF only. The source of fixdoc.c is stored in [5,1] or [.COMMAND]. The running program is noramlly stored in C:. Note that is is used on only ____ RSTS/E. The control files [5,1]RGTRNO.CMD and [5,1]RGTDOC.CMD illustrate the process on RSTS/E while and VGTDOC.COM illustrate it on VMS. VGTRNO.COM CHAPTER 4 COMPILER INTERNAL INFORMATION As noted above, compiler work files are in human-readable Ascii. The parser generates a temporary file with an internal pseudo-code. The code generator converts this pseudo-code to PDP-11 assembly language. Except for compiler flags, all communication between passes is via intermediate files. 4.1 Intermediate Code File Format ____ ____ ______ ____________ The intermediate code file consists of single line entries for each operation. The first byte is an operator, followed by parameter entries as needed. Numeric values are transmitted in octal. The following operators are defined: Location counter control: C Switch to the string P-section (c$strn) O Switch to the data P-section P Switch to the program P-section (c$data) (c$code) Ux[name] [attr] Define program section (x == P or D) Flow control: L [number] J [number] Define a local label Jump to a local label X N Function exit Function entry Data reservation, etc.: A Generate B [number] Generate D Generate G Generate H Generate I Generate Y Generate a a an a a a a .even pseudo-op .blkb [number] external label .globl .byte .word as a local pointer .word Special operations: @ No-op: generate a comment W Generate a switch table Q Dump symbol table entry (-t switch) C Compiler and Library Page 4-2 Software Support Manual M Transmit a line number between passes Tree (expression) operators: R Return S Switch E Compile for effect T Jump if true F Jump if false K Initialize variable Z Tree item Note that 'trees' are the result of compiling expressions, such as (a + b * (c & 4)) * d Each non-terminal node of a tree generally consists of a left part, an operation, and a right part. Operator precedence has been resolved. The above example thus becomes: | -----------------| | --------| | | | | -------| | | | | | | ----| | | | | | ((a + (b * (c & 4))) * d) Trees are described by 'Z' records. Tree elements are variable-length records, the first value describing the operator (and, hence, the length). All numeric values are encoded as octal ascii strings. The tree types are as follows: OP.EOF Used to signal a null tree element. OP.CON Constant, followed by 4 values. OP.REG Register, followed by type and register number. OP.INX Offset from register, followed by type, register number, and offset value. OP.ID Global identifier, followed by type, and identifier name. OP.LID Local identifier (label), followed by number. other An operator (OP.ADD, etc.) followed by the type code. Subsequent records contain the left subtree, then the right subtree. null subtree.) (OP.EOF is used to signal a C Compiler and Library Page 4-3 Software Support Manual For example, here is a simple subroutine and the intermediate code it generates (the trees have been compressed): fact(n) { if (n == 0) D fact N 0 4 F 1 Z [n == 0] return(1); R Z [1] J 2 return(n * fact(n - 1)); L 1 R Z [n * fact(n L 2 X G fact } The C source code is parsed by a | | | | | | | define function fact enter function if false, goto L1 compile expr. value return compile expr. value goto L2 | Label L1, N != 0 | return 1)] | compile expr. value | label L2 | Exit from function | .globl fact top-down, recursive parser. Expressions are parsed bottom-up, by priority. Casts of types are processed by special routines. The parser does some optimizations, such as constant folding. Also, all automatic variables (local to a function), are assigned absolute offsets from the argument frame (Register 5), while structure elements are assigned absolute offsets from the base of the structure. 4.2 The Code Generator ___ ____ _________ The code generator consists of a top-level input file reader, which processes 'easy things' directly. It calls subroutines to compile switch statements and expressions. The expression compiler performs various optimizations, calls a Sethi- Ullman register allocator, then a Ullman code generator. The Sethi- algorithm was described in the Journal of the ACM, Volume 17, No. 4, October 1970. pp. 715-728. 4.2.1 Optimizations and Register Allocation _____________ ___ ________ __________ The following optimizations are performed: o Expressions are reordered. o Constant expressions are folded. o Dummy operations are eliminated, including -(-A), !(!A), ~(~A), (A & A) and (A | A). o and Dummy address expressions are eliminated: *(&A) C Compiler and Library Page 4-4 Software Support Manual &(*A) all become A. o Constant address arithmetic is performed in expressions such as &A + const. o Constant offsets from registers become index operations in expressions such as *(reg + constant) or *(reg constant). o PDP11 autoincrement and autodecrement are used in expressions such as *p++ and *--p. o Conversion between integer and pointer datatypes are converted to multiply and divide operations. o Multiply by 1 is deleted. o The and operator is converted to BIC. o Null operations are deleted, including +0, -0, &-1, |0, ^0, |=0, etc. o If the compiler has been built for in-line floating point (i.e., the machine on which the compiler runs supports floating point), floating point constants are folded. Register allocation is as follows: o R0 and R1 are always scratch registers. o R2, R3, and R4 may be reserved by the C program by using the 'register ...' construction. The parser tells the coder the highest register it can use (in the function initialization intermediate code operation). o The Sethi-Ullman algorithm stores the number of registers needed into each tree node. This number is always >= 2 to insure that R0 and R1 are available for scratch usage. o 'A tree is easy if the other tree uses few enough registers and there is a free register available.' o The GETREG subroutine claims registers. If the code table is modified, be sure that GETREG isn't called on a tree that isn't easy. C Compiler and Library Page 4-5 Software Support Manual 4.2.2 Code generation ____ __________ Almost all code is generated by expanding macro operators out of the code tables. There are four tables (CTAB, ETAB, STAB, RTAB) and a pseudo-table, TTAB. Only RTAB is complete, If an expansion which was attempted in CTAB or ETAB fails, it is retried in RTAB followed by a test (CTAB), move (ETAB), or push (STAB) operation. For example, if an expansion which was attempted in STAB fails, it is done by: [Rtab] mov Reg,-(sp) The code body is in Ascii; bytes with the parity (eighth) bit set are used macro operators: 'address of left', 'push right', etc. Code table entries are selected by the type of the arguments (int, char, long, unsigned, float, double, and pointer) and by kind (constant, address, easy, and any). Here is a typical code table (for addition): int any [LL] int con1 inc [R] any [LL] int add [AR],[R] any [SRV] int ; Add 1 to any integer ; Compile left (subtree) int ; INC Rx addr ; Add var. to anything ; Compile left (subtree) int address ; ADD var,Rx easy ; Setup right value, ; NOP if it's an [LL] ; Compile left (subtree) int add [AR],[R] any [PR] int ; Add var,Rx any ; Compile right to stack [LL] add (sp)+,[R] ; Compile left to reg. ; ADD (sp)+,Rx Here is another example, '= for effect' (as in 'A = B;'): int char any int any int [SLAC] clr[TL] [AL] con0 con0 int char addr int any addr int any [LR] mov[TL] [R],[AL] ; ; ; ; I = 0; C = 0; Get left op. address CLR(B) var ; Compile right subtree ; MOV(B) Rx,var C Compiler and Library Page 4-6 Software Support Manual int char int char any int easy any int easy [SRV] [SLAC] mov[TL] [AR], [AL] any int any any int any [PLA] [LR] mov[TL] [R],@(sp)+ Note that the "easy" storage will ; Setup right value ; Setup left address ; Push left address ; Compile right value handle indirect addressing "(rx)", as well as autoincrement "@(rx)+" and autodecrement "@-(rx)". If the datum is long, the <ALN> and <ARN> code operators perform the address computation without sideeffects. For example, the following computation performs "i <<= 8", where 'i' is an integer: swab clrb mov [ALN] [ALN] [AL],[R] 4.2.3 Macros used in code generation ____ __ ____ __________ The following are defined in the code generator: [M] [F] [F.1] [R] [R.1] [AL] [AL.2] [AL.4] [AL.6] [ALN] [AR] [AR.2] Set modulo return Set function return Result value is in r1 Current register Current register + 1 Address of left Address of left+2 (long int) Address of left+4, double Address of left+6, double Address of left, no side effect Address of right Address of right, long ______ [ARN] [OP.0] [OP.1] [TL] [T] [SRVA] [SRV] [SRAA] [SRA] [SLVA] [SLV] [SLAA] Address of right, no side effect Opcode Opcode Type of left Type of right or left Set right value anywhere Set right value Set right address anywhere Set right address Set left value anywhere Set left value Set left address anywhere C Compiler and Library 4-7 Software Support Manual [SLA] [SLAC] [LL] [LL.1] [LL.O] [LLP.O] [LLP.E] [LR] [LRP.E] [PL] [PLA] [PR] [V] [FPI] [FPL] [FPF] [FPD] [GO.TO] [IFEIS] [IFFPU] [IFOP] [ELSE] [ENDIF] [DEBUG] Set left address Set left address current reg. Load left Load left into [R+1] Load left into odd register Load left into odd of pair of registers Load left into even of pair or registers Load right Load right into even of pair of registers Push left Push left address Push right ADC or SBC for longs Set floating point to I mode Set floating point to L mode Set floating point to single precision Set floating point to double precision Branch within code table Compile if hardware EIS support Compile if hardware FPU support Compile if specifed opcode Compile if IF... test was false End IF... block Write debug record to .S file Page CHAPTER 5 LIBRARY FUNCTION DESCRIPTIONS This chapter contains descriptions of each of the C- callable runtime library functions. In addition, descriptions of internal routines are provided. In most cases the I/O functions match those of UNIX V7 closely, with differences normally called out. information, consult "The C Programming Language" by and Dennis Ritchie (Englewood Cliffs, Hall, ISBN 0-13-110163-3). Routines and global symbols beginning with For more Brian Kernighan NJ: Prentice- '$$' are used for communication among the I/O routines. Routines whose names are of the form 'ABC$X' implement the 'ABC' instruction for the 'X' data type. For example, 'ASL$LI' implements an arithmetic left shift of a long value by an integer argument. C Compiler and Library Page 5-2 $$abuf Allocate memory for i/o buffers 5.1 Allocate memory for i/o buffers ______ ___ ___ _______ ________ ********** * $$abuf * ********** File name: ioabuf.mac Usage mov call bcs #iov,r4 ;file data block $$abuf ;Allocate it error ;Exit on errors Description A block of memory is allocated. If it succeeds, the iov record buffer is correctly setup and $$abuf returns the buffer address in r0. If it fails, an error code is stored in $$ferr, the error bit set in the iov flag word, r0 is set to 0, and $$abuf returns with the bit set. In RSX mode, the record gets padding that may be needed by $$put. Bugs C- C Compiler and Library Page 5-3 $$c5ta 5.2 Convert Radix-50 to Ascii Convert Radix-50 to Ascii _______ ________ __ _____ ********** * $$c5ta * ********** File name: c5ta.mac Usage mov mov call rad50_word, r1 out_ptr, r0 $$c5ta Return: r0 updated r1 random other registers preserved. Description: Convert one radix-50 word to three Ascii bytes. All letters will be in upper-case. The output buffer will not be null-trailed, nor will blank fields be supressed. Bugs C Compiler and Library Page 5-4 $$cl16 5.3 Close all channels Close all channels _____ ___ ________ ********** * $$cl16 * ********** File name: iocl16.mac Usage $$cl16(); /* Close all channels */ Description This module closes all I/O channels. on exit from C programs. Diagnostics Bugs It is called C Compiler and Library Page 5-5 $$clfu Flush last record before closing 5.4 Flush last record before closing ______ ______ _______ _____ ____ ********** * $$clfu * ********** File name: ioclfu.mac Usage mov call #iov,r4 $$cflu ;r4 -> i/o vector ;Flush buffers for close Description Flush the output buffer if the file is open for output. On RSX, the code may be conditionally compiled so that the last buffer is fixed so it is SEE compatible. Bugs C Compiler and Library Page 5-6 $$ctim Convert $$rtim Buffer to Ascii 5.5 Convert $$rtim Buffer to Ascii ______ ______ __ _____ _______ ********** * $$ctim * ********** File name: rctime.mac Usage char * $$ctim(buffer); struct TIME { int int int int int int int int } buffer; year; month; day; hour; minute; second; tick; tsec; /* /* /* /* /* /* /* /* G.TIYR G.TIMO G.TIDA G.TIHR G.TIMI G.TISC G.TICT G.TICP year - 1900 Jan. = 1 */ */ */ 00 .. 23 */ 00 .. 59 */ 00 .. 59 */ 00 .. tsec-1 */ tick/second */ dayofweek(buffer); struct TIME buffer; Description $$ctim() converts the time information in buffer such as returned by $$rtim() to a character string in the format: Sun Sep 16 01:03:52 1973\0\0 All the fields have constant width. Note that there are two trailing <null>'s for the benefit of programs converted from Unix (where the year a is followed by <newline>). $$ctim(0) returns the current time of day, calling $$rtim() internally. The format of the returned information is identical to the Unix function of the same name except that the Unix function has a trailing newline which is omitted here. dayofweek() returns the day of the week (Sunday = 0) for the date information in the argument buffer. C Compiler and Library Page 5-7 $$ctim Convert $$rtim Buffer to Ascii Bugs There is no range checking on the information passed. C Compiler and Library Page 5-8 $$div2 5.6 ______ _____ Unsigned divide (Macro only) Unsigned divide (Macro only) ________ ______ ********** * $$div2 * ********** File name: div2.mac Usage mov mov mov jsr mov mov mov hi_div,r0 lo_div,r1 divisor,r2 pc,$$div2 r0,hi_quotient r1,lo_quotient r2,remainder ;High-order dividend ;Low-order dividend ;Divisor ;Perform the division ;High-order quotient ;Low-order quotient ;Remainder Description Perform an unsigned double-precision division. This is needed for one of the library conversion routines. Bugs C Compiler and Library Page 5-9 $$dtoa 5.7 Convert floating to ASCII Convert floating to ASCII _______ ________ __ _____ ********** * $$dtoa * ********** File name: dtoa.mac Usage char * $$dtoa(buff, conv, field, dplace, value) char *buff; /* Where it goes char conv; /* Conversion type int field; /* Maximum field width int dplace; /* Decimal part width double value; /* What to convert */ */ */ */ */ Description $$dtoa() is called to do the conversion to Ascii text $$dtoa() returns a The is written to buff[]. pointer to the trailing null byte. Field and dplace are the conversion parameters "f" and "d" in the format string "%f.df". Conv is 'e', 'f', or 'g' to define the format. Note that the conversion character must be in lower-case. $$dtoa() is called by printf to convert a double-precision value to Ascii. The text is written to buff[]. Field and dplace are the conversion parameters "f" 'e', and "d" in the format string "%f.df" Conv is 'f', or 'g' to define the format. Note: the conversion character must be in lower-case. To use floating point conversion, the program must reference the $$fpu global as follows: extern If this is not int done, $$fpu; attempting to convert floating point will result in your program crashing. Bugs Only single precision conversion is done so far. The machine which must support FPU floating point, C Compiler and Library Page 5-10 $$dtoa Convert floating to ASCII implies EIS. Note: No compile-time test for C$$EIS is done. This routine uses the table in the DOUTAB module C Compiler and Library Page 5-11 $$fadd Floating-point support, add/subtract 5.8 Floating-point support, add/subtract ______________ ________ ____________ ********** * $$fadd * ********** File name: fadd.mac Usage double $$fadd(a, b) /* Floating add a + b */ double $$fsub(a, b) /* Floating sub a - b */ double double a; b; Description Called by the compiler to compile floating-point. Bugs BEWARE: Untested C Compiler and Library Page 5-12 $$falo Allocate memory for i/o subroutines 5.9 Allocate memory for i/o subroutines ______ ___ ___ ___________ ________ ********** * $$falo * ********** File name: iofalo.mac Usage mov call size,r0 ;Memory needed $$falo ;Allocate it ;return, r0 -> allocation ;no room: return to caller via $$fope Description A block of memory is allocated. If this fails, the return is to the caller of fopen (or fwild/fnext) with i/o control blocks deleted as necessary. Bugs C Compiler and Library Page 5-13 $$fcsi 5.10 Scan file name for fopen Scan file name for fopen ____ ____ ____ ___ _____ ********** * $$fcsi * ********** File name: iocsi.mac Usage mov call iov,r4 $$fcsi ;r4 -> iov ;C$PMTR+0(r5) => file name ;file name is parsed and fdb setup. ;r0-r3 random ;error: return to caller via $$fope Description Parse the file name argument, initializing the file data block. Bugs Used on RSX only. C Compiler and Library Page 5-14 $$flsh 5.11 Flush output buffers Flush output buffers _____ ______ _______ ********** * $$flsh * ********** File name: ioflsh.mac Usage mov call #iov,r4 $$flsh ;r4 -> i/o vector ;Internal flush routine Return, all registers preserved. Description $$flsh is called by other file I/O routines to flush the current record buffer. If this is the first call to an output routine for this file, $$flsh will be called and will allocate a buffer. On RSX, if the file is open to the terminal", the flush is to stderr. Bugs "command C Compiler and Library Page 5-15 $$flun Allocate a logical unit for fopen 5.12 Allocate a logical unit for fopen _ _______ ____ ___ _____ ________ ********** * $$flun * ********** File name: ioflun.mac Usage mov call iov,r4 $$flun ;r4 -> iov if any, else r4 := 0 ;Get a Lun slot, initialize fdb ;return, r4 -> iov, r3 := lun ;r0, r1 random ;error: return to caller via $$fope ;Note: available RSX luns start at 2, ;while RT11 luns start at zero. Description Perform all initialization needed to allocate a new file descriptor. Bugs In RSX modes, the maximum number of files that may be simultaneously open macro (FSRSZ$) which is defined at assembly time by a is expanded when fopen.mac is assembled. The default FSRSZ$ parameter is 4. This may be modified by using the task builder /ACTFIL=n option. The default FSRSZ$ value may be specified when the RSX library is built by editing assembly parameter N$$FIL in RSX.MAC. C Compiler and Library Page 5-16 $$fmul Floating-point multiply/divide 5.13 Floating-point multiply/divide ______________ _______________ ********** * $$fmul * ********** File name: fmul.mac Usage double $$fmul(a, b); double double /* Floating multiply */ a; b; Description Called by the compiler point multiply. Bugs BEWARE: untested to execute floating- C Compiler and Library Page 5-17 $$fopa 5.14 Open file (RT11 only) Open file (RT11 only) ____ ____ _____ _____ ********** * $$fopa * ********** File name: iofopa.mac Usage mov mov jmp iov,r4 lun,r3 $$fopa ;r4 -> iov ;r3 := lun ;RT11 file open (ascii file spec.) ;C$PMTR+0(r5) => ASCII file spec. ;(may include file size for writes) ;Parse the file using .CSISPC, open it, ;returning to the caller via cret$ or ;$$fope if error. mov mov mov iov,r4 ;r4 -> iov lun,r3 ;r3 := lun dblk,r1 ;r1 -> Rad50 device descriptor, jmp $$fopr followed ;by filesize word if write reqeust. ;open by Rad50 device descriptor ;RT11 only -- used to open the device ;for directory processing. Exit via ;cret$$ or $$fope if error. ;If successful, the number of blocks in ;the file is stored in the first word of ;the block buffer. Description Actually open the RT11 file, buffer management and post-open cleanup. Bugs doing data C Compiler and Library Page 5-18 $$fopt Scan options parameter for fopen 5.15 Scan options parameter for fopen _______ _________ ___ _____ ____ ********** * $$fopt * ********** File name: iofopt.mac Usage mov call iov,r4 $$fopt ;r4 -> iov ;C$PMTR+2(r5) => options string ;return: option flags in fdb ;r0 random ;error: return to caller via $$fope Description $$fopt parses the options argument in calls to fopen, freopen(), or fwild(). It returns to the caller (via $$fope) if the argument was incorrect. Bugs C Compiler and Library Page 5-19 $$fsav Floating-point support routines 5.16 Floating-point support routines ______________ _______ ________ ********** * $$fsav * ********** File name: fis.mac Usage $$fsav $$frta $$frtb /* Floating save /* Return to caller a /* Return to caller b */ */ */ Description These routines are used internally by the floatingpoint simulation package. They are never called by the C program. Bugs BEWARE: untested. Note also that whereas C these routines are single- precision, requires double precision. When/if floating-point becomes a reality, something better will have to be done. C Compiler and Library Page 5-20 $$gcmd 5.17 Parse command line Parse command line _____ _______ ____ ********** * $$gcmd * ********** File name: getcmd.mac Usage argc = $$gcmd(text, in, char *text; char **in; char **out; char ***avp; char *task; out, avp, task) /* Command line */ /* stdin filename /* For stdout filename /* Gets argv[] location /* Task name if nonnull */ */ */ */ Description: Parse the command line, building the argv[] table. If I/O redirection is encountered, in and out are modified accordingly. NOTE: $$gcmd will modify text. argv[] entries will point to bytes in text. If not NULL, the task name will become argv[0]. Unquoted arguments will be forced to lowercase, duplicating the action of Vax-11 C. $$gcmd() returns the number of arguments encountered. $$gcmd() is called in the following fashion: /* * Default input is on tty */ char **infile = &def_in; char *def_in = "tt:"; /* * Default output is on tty */ char **outfile = &def_out; char *def_out = "tt:"; /* * Define argv[] pointer and dummy command * line. */ char **argvp; char *dummy = "main"; int argc; C Compiler and Library Page 5-21 $$gcmd Parse command line ... argc = $$gcmd((strlen(cmdlin) == 0) ? dummy : cmdlin, &infile, &outfile, &argvp, $$task); if (argc < 0) error("Bad command line"); stdin = fopen(infile, "r"); if (**outfile == ">") stdout = fopen(*outfile + 1, "a"); else stdout = fopen(*outfile, "w"); Bugs In order to compensate for a problem with native RT11, the "parity" bit is erased from the argument text. This will need modification to Internation character set. handle the Dec C Compiler and Library Page 5-22 $$get 5.18 Get a record Get a record ___ _ ______ ********* * $$get * ********* File name: ioget.mac Usage RSX: mov mov mov call #iov,r4 #buffer,r0 buflen,r1 $$get ;r4 -> ;r0 -> ;r1 := ;Get a i/o vector buffer max. buffer size record VF$EOF and/or VF$ERR are set on error or end of file. r0 := actual record length, -1 on error or end of file. Other registers preserved. RT11: mov call #blknbr,r0 $$get ;r0 := block to read ;Get block (.gtline record) VF$EOF and/or VF$ERR are set on error or end of file. r0 is zero if success, -1 on error or end of file. Other registers preserved. clr jmp r0 $$geof ;End of file error ;(called by $$getc) Description $$get is the internal "get a record" routine. Note that the maximum record size (r1) is only needed on RSX. On RT11, it is fixed at 512. 82. bytes for terminal lines. bytes for files and If the file is defined as "stream" (the "n" flag was not set when the file was opened using fopen()), the end the line of will be represented by the (\n) character, and NULL's will be removed. Bugs newline C Compiler and Library Page 5-23 $$getc 5.19 Get characters Get characters ___ __________ ********** * $$getc * ********** File name: iogetc.mac Usage mov call #iov,r4 $$getc ;r4 -> i/o vector ;Get a character Description $$getc is the internal "get a byte" routine. The byte in the indicated file is returned in r0. All next other registers are preserved. $$getc will allocate a buffer if necessary. This routine removes all NULL bytes and <CR> from <CR><LF> sequences unless the file was opened with the 'n' (nostream) option. Bugs RT11 uses .gtline to read from the user's terminal (thus tracking indirect command files). To read from the physical terminal, fopen "TT:" using "n" mode. RSTS/RT11 has problems reading using either .ttyin or .gtline. There is force "native" system calls. thus special case code to C Compiler and Library Page 5-24 $$init One-time initialization code 5.20 One-time initialization code ______________ ____ ________ ********** * $$init * ********** File name: init.mac Usage Internal $$init() Description When a C program is started, a command line is parsed to form the argv[] array and the standard input, output, and error files are opened. main() may be declared as follows: main(argc, argv) int argc; char *argv[]; { register int i; /* Arg counter */ for (i = 1; i < argc; i++) { printf("arg[%d] == %s\n", i, argv[i]); } } Note the following: On RSX11/M (even emulated), argv[0] will be set to the task name. a dummy value. On RT11 modes, argv[0] will be set to If no command line is passed to the program, it will prompt the task name (or "Argv") and read a line from the command terminal. To disable this, the user program may define a global flag as follows: $$narg = 1; main (argc, argv) { ... } C Compiler and Library Page 5-25 $$init One-time initialization code If $$narg is initialized non-zero and no command line is passed to the program, or if the initialization sequence fails to read an argument, main() will be called with one argument. The command line prompt may be changed from the task name (or "Argv") by defining a global string as follows: char *$$prmt = "Command line prompt" main(argv, argc) { ... On Vax VMS, the program may be installed as a "foreign command" by a command such as: $ command :== $disk:[dir]filename and executed by typing: $ command arg1 arg2 Internal MAINTAINERS, Please Note This module contains code that is sensitive to particular releases of the various operating systems. Also, there is code that is sensitive to the various types of operating system emulators. The maintainer should strive to keep all such code in this module. This module has been tested on VMS V3.0 and V3.1, RSTS/E V7.1, RT11 V4.0, and RSX-11M V4.0. work correctly on earlier (or later) releases. It may not Note especially the "secret patch" to allow Decus C to read stream files on VMS V3.0 (and V3.1), and the command line parser for VMS version 3.0 and later. This code will require examination on every release of VMS. Diagnostics Can't parse command line ?C-Standard input, [filename]: ?C-Standard output, [filename]: error text error text ?C-No memory. The "can't parse" message is given if the command line format is incorrect quotation marks, for example). (because of unbalanced C Compiler and Library Page 5-26 $$init One-time initialization code The "standard input" or "standard output" messages are a user error if input or output are redirected and the associated files cannot be opened. The text should be self-explanatory. The "no memory" message program immensity. suggests a severe case of On RSX systems, it probably means that the task was not built /CP (checkpointable). All errors are fatal. Bugs On RSTS/RSX, command lines are limited to 80 bytes, although 128 byte commands are feasable. On VMS V3.0 and V3.1, the command name includes the expanded form of the command name. This means that long command with long name translations coupled argument strings may cause the total argument string to exceed 80 bytes. Such arguments will be truncated by the operating system without warning. The work-around is to make use of logical names: $ assign $disk[directory.subdirectory] bin $ program :== $bin:prog The expanded form of the "program" command is just "bin:prog". On VMS V3.0 and V3.1, the distributed RSX file service (FCS) refuses to open "stream Ascii" files. module This contains a dynamically-installed patch to the open routine. An error message will be printed if the patch cannot be installed correctly. The VMS3.0 switch There compile- time enables this patch. is also code in fopen.mac that is affected by this patch. It might be reasonable to make error messages non- fatal so $$init could be called by a user program. On RSX, the program aborts (by executing a BPT instruction) if the program or obtain partition parameters. fails to open stderr C Compiler and Library Page 5-27 $$link 5.21 Print memory list Print memory list _____ ______ ____ ********** * $$link * ********** File name: malink.mac Usage $$link(); /* Print memory list */ Return: all registers preserved Description Subroutine $$link() writes the allocation list onto stderr. It was written to debug malloc() but may be useful for debugging programs that write in memory. Note that it preserves all registers. Diagnostics Bugs randomly C Compiler and Library Page 5-28 $$ltoa 5.22 Convert long to Ascii Convert long to Ascii _______ ____ __ _____ ********** * $$ltoa * ********** File name: ltoa.mac Usage $$ltoa(buff, radix, value); char *buff; /* Where it goes int radix; /* Conversion radix long value; /* What to convert */ */ */ Description Called by printf to convert a long integer from binary to Ascii, storing the result in radix argument determines the conversion: d o u X x Bugs Signed decimal Octal Unsigned decimal Hex (10-15 = A-F) Hex (10-15 = a-f) buffer. The C Compiler and Library Page 5-29 $$main 5.23 Start of C programs Start of C programs _____ __ _ ________ ********** * $$main * ********** File name: suport.mac Usage $$main:: extern extern extern extern extern extern extern extern extern /* Start of C programs */ /* /* /* /* /* /* /* /* /* Operating system Non-zero if RSTS/E Non-zero if VMS Non-zero if P/OS RSX: Default uic Stack end point RT11: .scca control RSX: task name Clock interrupt rate */ */ */ */ */ */ */ */ */ /* Profile printer Argument count Argument list ptr. Free memory start Free memory end */ */ */ */ */ int int int int int int int char int $$opsy; $$rsts; $$vms; $$pos; $$uic; $$stnd; $$scca; $$task[]; $$tick; int int int char char (*$$pptr)(); $$argc; /* *$$argv[]; /* *$$mtop; /* *$$mend; /* Internal extern extern extern extern extern Description This module contains the run-time startoff for C programs. It intializes the C environment and calls the main() subroutine. On return from the main exit() to close all files and return to program, is called the operating system. The following globals are defined in this module: $$opsy Operating system unique value. value 7 on RT11, and set as per This is the GTSK$ directive on RSX-based systems: RSX11-D 0. RSX11-M 1. RSX11-S 2. IAS 3. RSTS/E V7 4. VMS 5. C Compiler and Library Page 5-30 $$main Start of C programs RSX11-M+ RT11 P/OS $$rsts 6. 7. 9. This value is non-zero if the program is running on RSTS/E. program is running It is zero if the native RSX, RT11, P/OS or VMS compatibility mode. $$vms This value is non-zero if the program is running (in compatibility mode) on Vax VMS. It is zero if the program is running native RSX, RT11, P/OS or on RSTS/E. $$pos This value is non-zero if the program is running on the Professional P/OS. It is zero if the program is running native RSX, RT11, or on RSTS/E or VMS. $$stnd The (top) end of the stack on entrance. $$scca On RT11, the .scca control word. This is needed to allow RSTS/E programs to trap end of file. $$task On RSX, the task name in Ascii. $$tick The clock interrupt rate. This is set at initialization on RT11 and on the first call to time() or ftime() on RSX. $$uic GTSK$. On RSX, the default UIC word from Internal All $$ values are for internal communication among runtime library routines. I.e., let them alone. Diagnostics On RSX, the task aborts with a BPT if the standard error file did not open. error messages are printed. Bugs Otherwise, explanatory C Compiler and Library Page 5-31 $$mchk Verify memory allocation pointers 5.24 Verify memory allocation pointers ______ __________ ________ ______ ********** * $$mchk * ********** File name: mamchk.mac Usage $$mchk(); /* Check memory list Description Subroutine $$mchk() checks allocation list pointers. The program is crashed by calling error if something goes wrong. Bugs $$mchk preserves all registers. */ C Compiler and Library Page 5-32 $$narg 5.25 Define default for $$narg Define default for $$narg ______ _______ ___ ______ ********** * $$narg * ********** File name: narg.mac Usage int $$narg ... main() { ... } = <value>; Description If no command line is provided when the program starts, the program will print a prompt on the command terminal, read one line and build the argv[] vector. If this is undesirable, include a global definition of $$narg in your C program as follows: int $$narg = 1; This will supress the command terminal read operation. The argv[] vector will be set to a dummy value. If the user program does not define $$narg, it will be defined so as to enable the prompt. Note that $$narg must be initilized at compilation time. It the is tested by the initialization code before main() program is called. Bugs C Compiler and Library Page 5-33 $$prmt 5.26 Null prompt pointer Null prompt pointer ____ ______ _______ ********** * $$prmt * ********** File name: prmt.mac Usage char *$$prmt = "Prompt string"; Description This pointer is checked in $$init and if the user has defined $$prmt then it will be used as the task prompt instead of using the task name on RT-11. on RSX or "Argv:" C Compiler and Library Page 5-34 $$prnt 5.27 Print formatter Print formatter _____ _________ ********** * $$prnt * ********** File name: doprnt.mac Usage $$prnt(format, argvec, iov) char *format; int *argvec[]; FILE *iov; Description $$prnt() performs all formatting operations for printf(), sprintf(), and fprintf(). The formatting options are described int the documentation of printf(). Bugs $$prnt() is functionally identical to the _doprnt() module in Unix and Vax-11 C libraries. Unfortunately, the '_' conflicts with RSX FCS library conventions. C Compiler and Library Page 5-35 $$put 5.28 __ ___ ____ Write a record -- RSX only Write a record -- RSX only _____ _ ______ ********* * $$put * ********* File name: ioput.mac Usage mov mov mov call #bufadr,r0 nbytes,r1 #iov,r4 $$put ;r0 -> buffer start ;r1 := number of bytes ;r4 -> i/o vector ;Internal put buffer routine Return, r1..r4 preserved. Description $$put is called by RSX-mode routines to write a record. $$put only runs under the RSX library. Using it in RT11-mode will cause the job to abort with a BPT trap. The byte count may be zero for RSX Terminal I/O. If output is to flushed (first). Bugs a terminal, stderr will be C Compiler and Library Page 5-36 $$putc Output one character to a file 5.29 Output one character to a file _________ __ _ ____ ______ ___ ********** * $$putc * ********** File name: ioputc.mac Usage mov mov call #iov,r4 byte,r0 $$putc ; r4 -> I/O vector ; r0 := byte to output Description $$putc is the internal call to write one character to an indicated file. On return, all registers are preserved, even r0. $$putc will allocate a record buffer if necessary. If an error is detected, $$putc will return to the original (C-language) caller. Bugs C Compiler and Library Page 5-37 $$qiow Call RSX executive service 5.30 Call RSX executive service _________ _______ ____ ___ ********** * $$qiow * ********** File name: ioqiow.mac Usage mov mov mov call bcs <I/O function code>,r0 IOV pointer,r4 <iopl parameters> onto the stack, right to left $$qiow <error> Description Issue a qio$ directive for all I/O requests needing such. Uses r0, r1. This routine is used only in the RSX library. Using it in the RT11 library will cause the program to abort with by executing a BPT instruction. Bugs C Compiler and Library Page 5-38 $$rtim 5.31 Date and time conversion Date and time conversion ____ ___ ____ __________ ********** * $$rtim * ********** File name: rtime.mac Usage $$rtim(buffer); struct TIME { int int int int int int int int } buffer; year; month; day; hour; minute; second; tick; tsec; /* /* /* /* /* /* /* /* G.TIYR G.TIMO G.TIDA G.TIHR G.TIMI G.TISC G.TICT G.TICP year - 1900 Jan. = 1 */ */ */ 00 .. 23 */ 00 .. 59 */ 00 .. 59 */ 00 .. tsec-1 */ tick/second */ Description Stores the current time of day in the buffer. The format is executive service. Bugs compatible with the RSX11-M GTIM$ C Compiler and Library Page 5-39 $$scan 5.32 Formatted input conversion Formatted input conversion _________ _____ __________ ********** * $$scan * ********** File name: doscan.mac Usage $$scan(fmt, args, iov) char *fmt; /* Format string int *arg[]; /* Arg vector FILE *iov; /* File descriptor */ */ */ Description $$scan() does parsing for scanf(), etc. See the description of scanf() for more details. Bugs $$scan() is functionally identical to the _doscan() routine in Unix and Vax-11 C libraries. Unfortunately, the leading '_' conflicts name conventions. with RSX FCS library C Compiler and Library Page 5-40 $$svr1 Save registers r1-r5 on the stack 5.33 Save registers r1-r5 on the stack _________ _____ __ ___ _____ ____ ********** * $$svr1 * ********** File name: savr1.mac Usage jsr ... return caller r5,$$svr1 ;Save r1-r5 on the stack ;Restore r1-r5 and return to Description Save general registers r1-r5 on the stack and return to the caller. When the caller executes an return (rts pc), it will cause the original r1-r5 to be restored and the program will return to the original caller. On return, the caller's registers are as follows: R1 R2 R3 R4 R5 PC 02(SP) 04(SP) 06(SP) 10(SP) 12(SP) 14(SP) Return to original user Bugs Except for the C-bit, condition codes are not preserved. C Compiler and Library Page 5-41 $$tens Conversion table for dtoa, atof 5.34 Conversion table for dtoa, atof _____ ___ _____ ____ ********** * $$tens * ********** File name: doutab.mac Usage extern double $$tens[]; Description $$tens[i] has 10^i for the range 0..35 __________ C Compiler and Library Page 5-42 $$utim Convert $$rtim buffer to Unix time 5.35 Convert $$rtim buffer to Unix time ______ ______ __ ____ ____ _______ ********** * $$utim * ********** File name: utime.mac Usage long $$utim(buffer); struct TIME { int int int int int int int int } buffer; year; month; day; hour; minute; second; tick; tsec; /* /* /* /* /* /* /* /* G.TIYR G.TIMO G.TIDA G.TIHR G.TIMI G.TISC G.TICT G.TICP year - 1900 Jan. = 1 */ */ */ 00 .. 23 */ 00 .. 59 */ 00 .. 59 */ 00 .. tsec-1 */ tick/second */ Description The user calls $$rtim() to initialize a buffer. Then, $$utim will convert buffer contents to the number of seconds since Jan 1, 1970. Note: $$utim() does not compensate for timezone or daylight savings time. Bugs This routine works only in the range: 1970 <= year < 2100 local C Compiler and Library Page 5-43 abort Abort program with a BPT trap 5.36 Abort program with a BPT trap _______ ____ _ ___ ____ _____ ********* * abort * ********* File name: abort.mac Usage abort() Description After closing all files, the program exits by executing a BPT trap. Bugs C Compiler and Library Page 5-44 abs 5.37 Integer absolute value Integer absolute value _______ ________ _____ ******* * abs * ******* File name: abs.mac Usage abs(val) int val; Description Return absolute value of the integer argument. Bugs C Compiler and Library Page 5-45 alloc 5.38 Allocate memory Allocate memory ________ ______ ********* * alloc * ********* File name: alloc.mac Usage char * alloc(n); /* -1 if no space */ Description Allocate the requested number of bytes, returning a pointer to the first. The program image will be expanded as needed. alloc() returns -1 if the requested space could not be allocated. free() is used to return the buffer to free space. See also the description of malloc(), realloc() and sbrk(). Diagnostics Bugs alloc() is obsolete. Use malloc() for new programs. C Compiler and Library Page 5-46 ascr50 Ascii to Radix-50 conversion 5.39 Ascii to Radix-50 conversion ________ __________ _____ __ ********** * ascr50 * ********** File name: ascr50.mac Usage ascr50(count, input, output) int count; int *output; char *input; Description Convert 'count' characters from ascii to Radix 50. If there aren't a multiple of 3 characters, blanks are padded on the end. The ascii string is moved to the output when finished. The input and output areas may be the same since three input characters are read for every two bytes of output. Bugs C Compiler and Library Page 5-47 asl$l 5.40 Shift long << long Shift long << long _____ ____ __ ____ ********* * asl$l * ********* File name: asll.mac Usage long asl$l(l, n) long long l; n; long asr$l(l, n) long long l; n; Description Performs shifting of long by long. Only the low- order six bits of the shift argument are examined. is compatible with the hardware ASH instruction. Note that, if n is negative: (l << n) == (l >> (-n)) Bugs This C Compiler and Library Page 5-48 asl$li 5.41 Shift long << integer Shift long << integer _____ ____ __ _______ ********** * asl$li * ********** File name: aslli.mac Usage long asl$li(l, n) long int l; n; long asr$li(l, n) long int l; n; Description Performs arithmetic shifting for integer shift arguments. Note that only the low-order six bits of the shift argument are examined. This with the hardware shift instruction. Bugs is compatible C Compiler and Library Page 5-49 asr$u Right shift unsigned >> integer 5.42 Right shift unsigned >> integer _____ ________ __ _______ _____ ********* * asr$u * ********* File name: asru.mac Usage unsigned asr$u(u, n) unsigned int u; n; Description Performs u >> n for unsigneds. Note that, if is negative, it acts as if (u << (-n)) were executed. Bugs n C Compiler and Library Page 5-50 atod Convert Ascii to double floating 5.43 Convert Ascii to double floating _____ __ ______ ________ _______ ******** * atod * ******** File name: atod.mac Usage double atod(buffer) char *buffer; Description Converts a double-precision floating point number written in scientific notation from ASCII to a number. The BNF for numbers which can decoded "double" by this routine follows: <number> := <sign> <real number> <real number> := <decimal number> | <decimal number> <exponent> | <exponent> <decimal number> := <integer> | <integer> . | . <integer> | <integer> . <integer> <integer> := <digit> | <integer> <digit> <exponent> := { E | e | D | d } <sign> <integer> <digit> := 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 <sign> := + | - | <empty> The conversion stops on the first character. non-legal (Note: if this routine is declared type char *, it will return a pointer to the first non-legal character.) Bugs Internal If the C library is compiled using "inline EIS" (C$$EIS=1), hardware floating point is also required. Note: module. This routine uses the table in the DOUTAB C Compiler and Library Page 5-51 atof Convert Ascii to double floating 5.44 Convert Ascii to double floating _____ __ ______ ________ _______ ******** * atof * ******** File name: atof.mac Usage double atof(buffer) char *buffer; Description Converts a double-precision floating point number written in scientific notation from ASCII to a number. The BNF for numbers which can decoded "double" by this routine follows: <number> := <sign> <real number> <real number> := <decimal number> | <decimal number> <exponent> | <exponent> <decimal number> := <integer> | <integer> . | . <integer> | <integer> . <integer> <integer> := <digit> | <integer> <digit> <exponent> := { E | e | D | d } <sign> <integer> <digit> := 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 <sign> := + | - | <empty> The conversion stops on the first character. non-legal (Note: if this routine is declared type char *, it will return a pointer to the first non-legal character.) Bugs Internal If the C library is compiled using "inline EIS" (C$$EIS=1), hardware floating point is also required. Note: module. This routine uses the table in the DOUTAB C Compiler and Library Page 5-52 atofd Convert ASCII to floating -- dummy 5.45 Convert ASCII to floating -- dummy _____ __ ________ __ _____ _______ ********* * atofd * ********* File name: atofd.mac Usage double atof(buffer) char *buffer; Description This is a dummy routine that is always present in the Decus C run-time library. If a program attempts to convert an ASCII string to a floating point value (by calling scanf() with a '%f' format effector), the program will crash. If floating point conversion is needed, the conversion routine must be named in the link or task-build command line as follows: RSX: TKB file=file,c:atof,c:c/lb RT11: LINK file,c:atof,c:suport,c:clib/bot:2000 Bugs C Compiler and Library Page 5-53 atoi 5.46 Convert Ascii to integer Convert Ascii to integer _______ _____ __ _______ ******** * atoi * ******** File name: atoi.mac Usage atoi(p) char *p; Description Convert string to integer. No data checking is performed. The conversion non-integer. Leading spaces, stops at the first tabs, plus-signs and/or newlines are ignored. a minus sign. Bugs The integer may be preceeded by C Compiler and Library Page 5-54 atol 5.47 Convert Ascii to long Convert Ascii to long _______ _____ __ ____ ******** * atol * ******** File name: atol.mac Usage long atol(p) char *p; Description Convert string to integer. No data checking is performed. The conversion non-integer. Leading spaces, stops at the first tabs, plus-signs and/or newlines are ignored. a minus sign. Bugs The integer may be preceeded by C Compiler and Library Page 5-55 brk 5.48 Change memory allocation Change memory allocation ______ ______ __________ ******* * brk * ******* File name: brk.mac Usage char * brk(addr); int *addr; Description brk() sets the run-time library's "top of memory" pointer to addr. This value should have been returned by a previous call to sbrk(). Intervening calls malloc() open routines may cause memory to to or file be corrupted by calling brk(). Diagnostics Returns 0 if the brk() argument is reasonable. Returns -1 if it is greater than the current top of memory. (Use sbrk() to increase memory allocation.) Bugs C Compiler and Library Page 5-56 call Call (Fortran) subroutine from C 5.49 Call (Fortran) subroutine from C _________ __________ ____ _ ____ ******** * call * ******** File name: call.mac Usage return_value = call(routine, count, &arg1, ... &argN); extern int routine(); /* PDP-11 function name */ int count; /* Number of arguments */ Description C Library user-callable interface between C programs and subroutines which follow the standard PDP11 calling sequence. Note that call() saves and restores registers r2-r5. The arguments are as follows: routine The name of the PDP11 routine to be called. count The number of arguments the calling sequence. arg1 The first argument. For example: extern int int int sort(); data_to_sort[NDATA]; ndata = NDATA; in call(sort, 2, &data_to_sort, &ndata); Note that, if the called function returns some other datatype such as a long, the routine and call() must be correctly declared: long long long long call(); myfun(); larg; result; result = call(myfun, 1, &larg); C Compiler and Library Page 5-57 call Call (Fortran) subroutine from C If call() is being used to return several different datatypes, type coersion may be effective: int long long long call(); myfun(); larg; result; result = (long)call(myfun, 1, &larg); Bugs: WARNING: watch out for trouble if the PDP-11 routine does any I/O. been implemented. Floating-point data return has not C Compiler and Library Page 5-58 callc Call (Fortran) subroutine from C 5.50 Call (Fortran) subroutine from C _________ __________ ____ _ ____ ********* * callc * ********* File name: callc.mac Usage integer callc ivalue = callc(routine, arg1, ... argN) Description User-callable interface between Fortran programs and subroutines written in C. The arguments are as follows: routine The name of the C routine to be called. arg1 The (location of the) first argument. For example: call callc(sort, table, nelement) Bugs There will be I/O library conflicts since C files have not been initialized. The following problem will occur if a is C subroutine called from a Fortran main program: The C subroutine refers to the save register routine (CSV$) which refers to the C main program. This pulls in a large amount of I/O dependent code, which may cause conflicts. What is worse is that there will be two main programs. It is therefore recommended that there be a C main program that calls Fortran in turn, call C subroutines. subroutines that may, C Compiler and Library Page 5-59 callc Call (Fortran) subroutine from C The programmer can also define a dummy program that resolves the globals referenced by CSV$ modify callc.mac to provide the necessary globals. or C Compiler and Library Page 5-60 caller Return name of profiled caller 5.51 Return name of profiled caller __ ________ ______ ______ ____ ********** * caller * ********** File name: caller.mac Usage char * caller(); Description If the routine which called the current function was compiled using the profile option, caller() returns a pointer to the name of the calling function. If the calling function was not compiled with profiling enabled, a pointer to the null string is returned. Example: foo() { foobar(); } foobar() { extern char *caller(); printf("foobar was called by %s\n", caller()); } Internal Warning -- this routine is sensitive to the format of the environment frame and profile information layout. If csv$, pcsv$, or $$prof change, this may be modified. Bugs have to C Compiler and Library Page 5-61 calloc Allocate and Initialize Memory 5.52 Allocate and Initialize Memory ___ __________ ______ ________ ********** * calloc * ********** File name: calloc.mac Usage char * calloc(n, m); int int /* NULL if no space /* Number of elements /* Size of an element n; m; */ */ */ Description Calloc() allocates space for n elements, each m bytes long. On return, the space is zero'ed. The program image will be expanded as needed. If the requested space cannot be allocated, calloc() returns NULL. See also the description of malloc(), and sbrk(). The space is returned by calling free(). Diagnostics Bugs realloc() C Compiler and Library Page 5-62 calltr 5.53 Trace Path to the Caller Trace Path to the Caller _____ ____ __ ___ ______ ********** * calltr * ********** File name: calltr.mac Usage calltrace(outfd); FILE *outfd; Description calltrace() prints the calling path (from main()) to the routine that called calltrace()) on the indicated file. The path is printed on one line as: [ main sub1 sub2 ] If a subroutine within the path was not compiled with profiling, or does not start with a call to the C register register save routine, it will be printed as <nnnnnn> (where <nnnnnn> is the octal address of the entry to the routine). Note that the last entry on the line is the routine that invoked calltrace(). A call trace will be printed on exit if profiling is enabled and the program aborts or calls error(). Internal Warning -- this routine is sensitive to the format of the environment frame and profile information layout. If csv$, pcsv$, or $$prof change, this may have to be modified. A special entry for error() is provided, which allows the proper "bug" address to be displayed, rather than the return address of error() itself. Bugs C Compiler and Library Page 5-63 clearerr 5.54 Clear file error flags Clear file error flags _____ ____ _____ _____ ************ * clearerr * ************ File name: cleare.mac Usage clearerr(iop); FILE *iop; Description Clear the error flags for an open file. This be needed for interaction with the user's console terminal. Bugs may C Compiler and Library Page 5-64 concat 5.55 Concatenate strings Concatenate strings ___________ _______ ********** * concat * ********** File name: concat.mac Usage char * concat(out, in0, in1, ..., inN, 0); char *out; char *in0, in1, ... inN; Description Concat concatenates the argument strings. a pointer to the first byte of out. Bugs It returns C Compiler and Library Page 5-65 copy Copy a given number of bytes 5.56 Copy a given number of bytes ______ __ _____ ____ _ _____ ******** * copy * ******** File name: copy.mac Usage char * copy(out, in, nbytes) char *out; char *in; unsigned int count; /* Output vector /* Input vector /* Bytes to copy */ */ */ Description Copy the indicated number of bytes from the input area to the output area. Return a pointer to the first free byte in the output area. The copying will be faster if out and in are either both even or both odd addresses. Bugs C Compiler and Library Page 5-66 cpystr 5.57 String copy String copy ______ ____ ********** * cpystr * ********** File name: cpystr.mac Usage char * cpystr(out, in); char *out; char *in; Description Copy "in" to "out". Return a pointer to the end of out. This allows the following usage: char char extern char *ptr; buffer[BUFSIZ]; *cpystr(); ptr = cpystr(buffer, text); ptr = cpystr(ptr, more_text); The above sequence appends more_text to the copy of text already moved into the buffer. Bugs C Compiler and Library Page 5-67 csv$ C register save and restore 5.58 C register save and restore ____ ___ _______ _ ________ ******** * csv$ * ******** File name: csv.mac Usage jsr ... jmp r5,csv$ cret$ Description C program Run-time Environment Each C subroutine starts with a call to CSV$ and exits by jumping to CRET$. Upon exit, the stack need not be equal to its value on entrance. During the execution of all C subroutines, register R5 points to the current "environment." Within a subroutine, it appears as follows: _______________ | | SP -> | 1st loc. var. | -10(R5) |_______________| | | | Saved R2 | -6(R5) |_______________| | | | Saved R3 | -4(R5) |_______________| | | | Saved R4 | -2(R5) C$AUTO-2(R5) |_______________| | | R5 -> | Saved R5 | |_______________| | | | Return add. | |_______________| | | | First arg. | |_______________| | | +2(R5) +4(R5) C$PMTR+0(R5) C Compiler and Library Page 5-68 csv$ C register save and restore | Second arg. | |_______________| +6(R5) C$PMTR+2(R5) Within a subroutine, Registers R0-R4 and the top of the stack, (sp) are available for use. Registers R0 and R1 are not preserved by subroutines and may be used to pass a return value. R5 must not be modified by a subroutine. All variable addressing must be done by offsets to R5. Subroutine arguments must be accessed by reference to C$PMTR. Subroutine local variables must be accessed by reference to C$AUTO. This permits modification of calling sequences without rewriting all subroutines. CSV$ refers to global symbol $$main to call the runtime startup program from the (RSX) library. Internal The global symbols needed C compiler are also included. Bugs for the Whitesmith's C Compiler and Library Page 5-69 ctime 5.59 _____ __ _____ Convert time value to ascii Convert time value to ascii _______ ____ ********* * ctime * ********* File name: ctime.mac Usage #include <time.h> char * ctime(tvecp) long *tvec; /* Time value pointer */ char * asctime(tm) struct tm *tm; /* Time buffer pointer */ Description ctime() converts a time value, as returned by time() to an ascii string. For compatibility with previous versions, ctime(0) obtains and converts the current time of day. Note, however, that ctime(0) is not portable. asctime() converts a time vector, as returned by localtime() to an ascii string. The string is statically allocated. It has the format Sun Sep 16 01:03:52 1973\n\0 012345678901234567890123 4 5 0 1 2 All the fields the have constant width. To remove trailing newline, just: char extern char int *tp; *ctime(); tvec[2]; time(&tvec); tp = ctime(&tvec); tp[24] = '\0'; Bugs /* Get time /* in Ascii /* Fix newline */ */ */ C Compiler and Library Page 5-70 ctime Convert time value to ascii There is no range checking on the information passed. C Compiler and Library Page 5-71 ctype Character classification type table 5.60 Character classification type table _________ ______________ ____ _____ ********* * ctype * ********* File name: ctype.mac Usage #include <ctype.h> mov jmp #MASK,r0 $$ctype Description This module contains the bit-mask table and common code for the is... and to... functions. Bugs No provisions are made for national letters. Maintainers note that is included. source for a test program C Compiler and Library Page 5-72 ddtoa Convert floating to ASCII -- dummy 5.61 Convert floating to ASCII -- dummy ________ __ _____ __ _____ _______ ********* * ddtoa * ********* File name: dtoad.mac Usage $$dtoa(buff, value, field, dplace) char *buff; /* Where it goes double value; /* What to convert int field; /* Maximum field width int dplace; /* Decimal part width */ */ */ */ Description This is a dummy routine that is always present in the Decus C run-time library. If a program attempts to convert a floating point value to ascii (by calling printf() with a '%f' format effector), an error message will be generated. If floating point conversion is needed, the conversion routine must be named in the link or task-build command line as follows: RSX: TKB file=file,c:dtoa,c:c/lb RT11: LINK file,c:dtoa,c:suport,c:clib/bot:2000 Bugs C Compiler and Library Page 5-73 delete 5.62 Delete a named file Delete a named file ______ _ _____ ____ ********** * delete * ********** File name: delete.mac Usage delete(filename) char *filename; Description Delete the named file. Returns 1 on success, 0 on error (such as file not found). If an error occurs, $$ferr can be checked for the error code. On RSX modes, the filename as passed need not include an explicit version number. file.nam;0 will be deleted. If none is Note that the provided, filename returned by fgetname() always includes an explicit version. On RT modes, the only error ever returned is "File not found". Bugs On RSX/VMS, the file must be in the user's current ("SET DEFAULT") directory. On RSTS, "SY0:" cannot be distinguished from "SY:". C Compiler and Library Page 5-74 div$li 5.63 ___ _______ Long division and modulus Long division and modulus ____ ________ ********** * div$li * ********** File name: divl.mac Usage div$li(long, integer) div$l(long, long) mod$li(long, integer) mod$l(long, long) Description Division with long result. Called by the compiler when the appropriate code sequences are encountered. Bugs Warning -- an internal present. Change one, change both. version of cret$ is C Compiler and Library Page 5-75 eis$i 5.64 EIS emulator module EIS emulator module ___ ________ ______ ********* * eis$i * ********* File name: eis.mac Usage asl$i(a, asr$i(a, mul$i(a, div$i(a, mod$i(a, b); b); b); b); b); /* /* /* /* /* Execute Execute Execute Execute Execute a a a a a << b >> b * b / b % b */ */ */ */ */ Description All arguments are integers. These routines are called by the C compiler to perform the indicated operations. The module may be conditionally compiled to generated hardware EIS operations. Edit RT11.MAC or RSX.MAC to define C$$EIS as needed: 0 1 Emulate EIS operations Generate EIS operations C$$EIS is defaulted zero for RT11, non-zero for RSX. If n is negative, x << n == x >> (-n) and v.v. Note: div$i returns the remainder in r1. This may be useful for assembly-language programs that need both the quotient and remainder. To overlay explicitly position this module in an structure, refer to the title, EIS$I. Bugs Divide by and remainder. zero yields zero for the quotient C Compiler and Library Page 5-76 envsave Multi-level function return 5.65 Multi-level function return ________ ______ ___________ *********** * envsave * *********** File name: envset.mac Usage int * envsave(); envreset(frame, int int int hval, lval) *frame; /* Frame pointer hval; /* High-order return lval; /* Low-order return */ */ */ Description These functions permit a multi-level return from a C function to one of its dynamic ancestors in the stack. Envsave() returns the address of the frame of its caller. Later calls to envreset() with this pointer as an argument will create the illusion that the last function invoked by the caller of envsave() returned directly with a value equal to the parameter(s) to envreset(). Envreset() simulates a return to the function whose frame pointer matches frame (the result of a previous call to envsave()). as Envreset() may be made to look if it is returning a one or two word value. If only a single integer value is passed in addition to envreset(), it looks as if a 1-word value was returned. If two integers (or equivalently, a long) are specified, it looks like a long is returned. Thus any 1 or 2 word value may be returned because of the lax type checking in C. It is catastrophic to attempt to return to a function which has itself already returned!!! The following illustrates and envreset(): int *save_frame; use of envsave() C Compiler and Library Page 5-77 envsave Multi-level function return process() { ... save_frame = envsave(); if (subroutine()) { /* * Success */ } else { /* * Failure */ } } subroutine() { /* * Abort on error */ if (...) envreset(save_frame, 0) /* * Success */ return(1); } When subroutine() detects an error, it calls envreset() to return to the caller of process(), passing a "failure" flag. Bugs If the caller of envsave() has already returned, disaster will result. It is highly recommended use setjmp/longjmp instead. that programs C Compiler and Library Page 5-78 error 5.66 Error exit from C programs Error exit from C programs _____ ____ ____ _ ________ ********* * error * ********* File name: error.mac Usage error(format, arglist); /* Fatal error exit */ Description An error message is written to stderr and the exits. a subroutine program If profiling was enabled, call trace will be written to stderr. The exit status, $$exst, will be set to "error". Diagnostics Bugs C Compiler and Library Page 5-79 exit 5.67 Exit from C programs Exit from C programs ____ ____ _ ________ ******** * exit * ******** File name: exit.mac Usage exit(status); /* Exit, no return */ exits(status); /* Exit with status */ $$fail(); /* Immediate exit */ extern int $$exst; /* Exit status value */ Internal jmp $$exit ;Call exit routine Description On exit, the following sequence occurs: 1. The user-supplied wrapup() function is called. 2. User-supplied finalizers are called. 3. Profiles (if requested) are printed. 4. All files are closed. 5. The program exits to the operating system. By calling exits() with an appropriate value, the program can pass an exit status code to the operating system monitor. The RT11 and RSX11 monitors define exit status codes differently; the value passed to exits() is not checked for consistancy. RT11 1. RSX 1. Meaning IO_SUCCESS -- no message is printed 2. 4. 8. 0. 2. 4. IO_WARNING -- minor error IO_ERROR -- serious error IO_FATAL -- severe error Calling exit() with some other value is equivalent to calling exits(IO_SUCCESS). This is compatible with Unix programs that exit by calling exit() without parameters. Note that the program may also set a value $$exst and exit via exit(): into C Compiler and Library Page 5-80 exit Exit from C programs extern int $$exst; ... $$exst = IO_WARNING; exit(); If the program calls, or jumps to, $$fail, it will immediately exit to the operating system without closing files, calling wrapup() a profile file. Diagnostics Bugs or finalizers, or writing C Compiler and Library Page 5-81 fabs 5.68 Floating absolute value Floating absolute value ________ ________ _____ ******** * fabs * ******** File name: fabs.mac Usage double fabs(val) double val; Description Return absolute value of a floating argument. Bugs C Compiler and Library Page 5-82 fclear 5.69 Clear file error flags Clear file error flags _____ ____ _____ _____ ********** * fclear * ********** File name: fclear.mac Usage fclear(iop); FILE *iop; Description Clear the error flags for an open file. This be needed for interaction with the user's console terminal. Bugs may C Compiler and Library Page 5-83 fclose Close a currently-open file 5.70 Close a currently-open file ______________ ____ _____ _ ********** * fclose * ********** File name: fclose.mac Usage fclose(iop); FILE *iop; Internal mov mov call #iov,r4 <signal>,r0 $$clos ;r4 -> i/o vector ;r0 == 0 to free i/o vector ;close file. mov mov call #iov,r4 <signal>,r0 $$fcls ;r4 -> i/o vector ;r0 == 0 to free i/o vector ;Free buffer space Description Close the file. Returns 0 if ok, -1 if an error. The error code is saved in $$ferr. Note that stderr is never closed. On RT11-mode, the last block of a disk file which was open for output is filled with nulls. Internal $$clos is called internally to close a file. $$fcls is called internally to free buffer space. After the file has been closed, record buffers (RSX-mode) and the file-name buffer (RT11-mode) will be freed. If r0 is zero on entry, the iov and any wild-card buffer will also be freed. This flag is set non-zero by freopen() or fnext() to close a file without freeing the iov. Bugs C Compiler and Library Page 5-84 feof 5.71 Test for end of file Test for end of file ____ ___ ___ __ ____ ******** * feof * ******** File name: feof.mac Usage feof(iop); FILE *iop; Description Return 1 if end of file on iop, else zero. Bugs C Compiler and Library Page 5-85 ferr 5.72 Test for file error Test for file error ____ ___ ____ _____ ******** * ferr * ******** File name: ferr.mac Usage ferr(iop); FILE *iop; Description Return 1 if an error has been indicated file. Bugs Obsolete, use ferror() instead. seen on the C Compiler and Library Page 5-86 ferror 5.73 Test for file error Test for file error ____ ___ ____ _____ ********** * ferror * ********** File name: ferror.mac Usage ferror(iop); FILE *iop; Description Return 1 if an error has indicated file. Bugs been seen on the C Compiler and Library Page 5-87 fflush 5.74 Flush output buffers Flush output buffers _____ ______ _______ ********** * fflush * ********** File name: fflush.mac Usage fflush(iop); FILE *iop; Description Flush output buffers. This routine actually I/O. $$ferr is set if anything unexpected happens. Bugs does C Compiler and Library Page 5-88 fget 5.75 Input a binary record Input a binary record _____ _ ______ ______ ******** * fget * ******** File name: fget.mac Usage fget(buffer, maxbytes, iop); char *buffer; int maxbytes; FILE *iop; Description Read a record from the indicated file. Maxbytes is the maximum record size. On RSX, the record is read by a direct call to the file service GET$ routine. Your program must not mix calls to fget() with calls to other I/O routines, such as fgets(). On RT11, the file must have been written by fput(). The actual number of bytes read is returned. Use feof() to test for end of file. Fget() is not present on Unix standard I/O libraries. Internal On RT11, when the record is written is by fput(), it preceeded by a two-byte byte count. This value is one greater than the number of bytes in the record. a zero count is read, it will mean "end of file.") Bugs (If C Compiler and Library Page 5-89 fgetname 5.76 ____ __ _____ Convert file name to Ascii Convert file name to Ascii _______ ____ ************ * fgetname * ************ File name: fgetna.mac Usage char * fgetname(iop, buffer); FILE *iop; char *buffer; Description Convert the file name to Ascii and put it in the buffer. On native RSX (and RSTS/E emulation) the device name, file name, file type, and version are converted to Ascii. The UIC is converted if it was specified and differs from the job's default UIC. (Note that on VMS compatibility mode, the UIC is unavailable.) The version is converted to octal on native RSX and to decimal on VMS emulation. The result should be sufficient to delete the file. On RT11 modes, the file name passed to fopen() is copied to the buffer without further processing. If the file was opened by an fwild()/fnext() sequence, correct the file name is returned. (On RSTS/E, the PPN is returned as well.) Fgetname() returns a pointer to the buffer argument. Fgetname() is present in the Vax-11 C support library, but is not generally present on Unix implementations. Note that fgetname() returns a fully-qualified file specification including, where possible, the disk, directory, and version of the file. If only the actual file name is needed, the following code segment may be executed. As shown, it writes the file and filetype (extension) to a global "buffer". getfilename(fd, buffer) FILE *fd; register char *buffer; name C Compiler and Library Page 5-90 fgetname Convert file name to Ascii { register char *tp; register char c; fgetname(fd, buffer); /* * Skip over node and device name */ while ((tp = strchr(buffer, ':')) != NULL) strcpy(buffer, tp + 1); /* * Skip over [UIC] or [PPN] if present */ c = EOS; switch (*tp) { case '[': c = ']'; break; case '(': c = ')'; break; case '<': c = '>'; break; } if (c != EOS && (tp = strchr(buffer, c)) != NULL) { strcpy(buffer, tp + 1); /* * Don't include version */ if ((tp = strchr(buffer, ';')) != NULL) *tp = EOS; } Bugs Various operating systems behave differently. C Compiler and Library Page 5-91 fgets 5.77 ____ _ ____ Read a string from a file Read a string from a file ____ _ ______ ********* * fgets * ********* File name: fgets.mac Usage char * fgets(buffer, maxbytes, iop); char *buffer; int maxbytes; FILE *iop; char * fgetss(buffer, maxbytes, iop); char *buffer; int maxbytes; FILE *iop; Description Fgets() reads a string into the buffer from the indicated file. Maxbytes is the maximum number of to string bytes read. The is terminated by a newline character, which is followed by a null. Fgets() normally returns buffer. It returns NULL on end of file or error. If the line being read is maxbytes long or longer, no newline is appended. Fgetss() is identical to fgets() except that the terminating is newline is replaced by a null. (This compatible with gets(), but fgetss() is not present in the Unix standard library.) Note that fgets keeps the newline, while fgetss() and gets() delete it. To delete the newline after executing fgets(), execute the following: buffer[strlen(buffer) - 1] = 0; Bugs Note that fgets() returns the next logical text line. Certain RSX-11 or RMS file formats, such as Runoff output files or task-builder load maps, often have multiple record. text lines packed into one logical C Compiler and Library Page 5-92 fgets Read a string from a file Fgets() processes these correctly. Note, however, that the record location, as returned by ftell(), is the location of the physical record, as returned by the operating system. The "obvious" ftell/fgets sequence, rfa = ftell(fd); fgets(text, sizeof text, fd); will not work properly if multiple text lines are packed into one RSX-11 record. These routines do not understand some of the more baroque RSX-11 file formats, such as "Fortran carriage control" or VMS print-file format. The typeout program in the tools package, T.C, shows an example of complete record deblocking and "seek to byte" procedure. C Compiler and Library Page 5-93 fileno 5.78 Get logical unit number Get logical unit number ___ _______ ____ ______ ********** * fileno * ********** File name: fileno.mac Usage fileno(iop) FILE *iop; Description Return the logical unit number associated with the file. (On RT11, the channel number is returned.) Bugs C Compiler and Library Page 5-94 fill Fill a Block of Memory With a Character 5.79 Fill a Block of Memory With a Character ____ _ _____ __ ______ ____ _ _________ ******** * fill * ******** File name: fill.mac Usage fill(addr, ch, count); char *addr; char ch; unsigned int count; Description: Fill the count characters of memory beginning addr with the character ch. Note: To fill with zero zero(), which is slightly faster. Bugs bytes, you can use at C Compiler and Library Page 5-95 flun 5.80 Get logical unit number Get logical unit number ___ _______ ____ ______ ******** * flun * ******** File name: flun.mac Usage flun(iop) FILE *iop; Description Return the logical unit number associated with the file. (On RT11, the channel number is returned.) Bugs Obsolete -- use fileno() for transportability. C Compiler and Library Page 5-96 fmkdl Mark file for deletion -- obsolete 5.81 Mark file for deletion -- obsolete ____ ___ ________ __ ________ ____ ********* * fmkdl * ********* File name: fmkdl.mac Usage fmkdl(iop); FILE *iop; Description fmkdl() closes and deletes the specified file. Returns 0 on success, -1 on error. This routine is obsolete. New programs should call delete() instead. To delete an existing file, the program may execute: char buffer[80]; ... fgetname(iop, buffer); fclose(iop); delete(buffer); Bugs On RT11, the job is aborted with an error message if the file wouldn't parse. $$ferr is set to "file not found" if the program tries to delete something (like the line-printer) does that it shouldn't. Note that RT11 not flush the last buffer before deleting the file. On VMS compatibility mode, the user's default directory. the file must be in C Compiler and Library Page 5-97 fopen 5.82 C library file opener C library file opener _ _______ ____ ______ ********* * fopen * ********* File name: fopen.mac Usage FILE * fopen(name, mode); char *name; char *mode; /* File to open /* Open modes */ */ FILE * freopen(name, mode, iop); char *name; /* File to open char *mode; /* Open modes FILE *iop; /* I/O pointer */ */ */ Internal mov jmp iov,r4 $$fopn ;r4 -> iov ;Open the file and return to the ;caller via $$fopx or $$fope if error. ;On RSX, fixup append mode if the file ;wasn't found. mov call iov,r4 $$fopo ;r4 -> iov ;Normal open, then exit via $$fopx ;On RSX, $$fopo returns if any error ;occurred. On return, r0 := RSX error mov jmp iov,r4 $$fopx ;r4 -> iov, file is open ;Normal exit from fopen ;On RSX, $$fopx allocates the record ;buffer. mov mov iov,r4 ;r4 -> iov (or r4 == 0) code,r0 ;r0 := error code (to go to $$ferr) code. jmp $$fope ;Error exit from fopen ;$$fope deallocates buffers Description Fopen opens a new or indicated mode: existing file in the C Compiler and Library Page 5-98 fopen C library file opener r w a n u Read the existing file sequentially Create and write the file sequentially Append to the file Not record oriented RSX-mode "unbuffered i/o" RT11-mode: use .ttyin and .ttyout Either "r", "w", or "a" must be given. "n" and "u" are optional. "n" should be given for "binary" files. Note that "n" mode will create fixed-block records on RSX systems. Append mode does not work on native RT11. Note that "n" and "u" are not compatible with other Unix systems. Implementation Details On RSX, "u" mode files will be created with the "variable-length" attribute. On RSTS/RSX emulation, text files (neither "n" nor "u" specified) will be created with "stream" attribute. On RSX, if the record type bits in the record attribute byte (F.RATT in the FDB) is zero, the file will be read as if the "n" was specified. Note that, if the file contains carriage-return line-feed sequences, the entire sequence will be passed to the user's program. If record attributes are understandable, the carriage-return will be deleted from <CR><LF> sequences. On RSX, if the "file" is being opened for write the to same device/unit as stderr (the user's "command console), the character stream is diverted to stderr. This avoids synchronization problems by funnelling all output through the same buffer. In addition, output to any terminal device is done via QIO's to the terminal, IO.WLB for normal mode, IO.WAL for "n" mode. On RT11, when opening a file for writing, a specific block allocation may be included in the Ascii file specification following standard RT-11 syntax: "DKn:file.nam[nnn]" where the "nnn" specifies the number of blocks to allocate to the file. After opening a file successfully, the actual file size (or number of blocks allocated) will be found in (FILE *)fd->io_size. If the RT11 library decides that the file is really the user's command terminal, single-character I/O will be performed (by calling .ttyin and .ttyout). Note that the "special-mode" bits must be set in the Job Status Word by the program if it requires true singlecharacter or immediate return input. Output to the terminal will be performed without for buffering, which is useful C Compiler and Library Page 5-99 fopen C library file opener screen updating, but otherwise expensive. Fopen() returns NULL on errors -- $$ferr gets an error code. On RT11, this will be a RSTS/E compatible code (described in iov), while on RSX, this will be the FCS error code. On RT11, the file name pointed to by the "io_name" field of the iov is either the file name string as passed to fopen() or an ascii string reconstructed from the 4word Rad50 device block if the file was opened as part of a fwild/fnext sequence. By saving the ascii string, RSTS/E is able to re-parse logical device names and PPN's, which are not present on native RT11. On VMS compatibility mode, the device and directory of the file name argument are saved in the iov "io_dname" field for use by fgetname(). Note that "no buffer space available" (IE.NBF or E$$NSP) and "invalid lun" (IE.ILU or E$$NOC) may be generated by fopen. On RT11, if the file cannot be opened because the user's program has already opened the channel, an E$$ILU error will be returned. The same file may not be used for both reading and writing except if the program writes a disk file, then repositions and reads it using ftell()/fseek(). In this case, to the program should call rewind() or freopen() reinitialize the file before using fseek(). Except in the one specific case of the RT11 console terminal open in "u" mode, an open file must not be used for reading and writing at the same time. Freopen() substitutes the named file in place of the open file -- indicated by iop. The file currently open on iop is closed. Freopen returns iop. If the open failed, iop will be deallocated. Note that freopen loses any pending fwild/fnext status. Internal The following routines/globals are for use by fopen/fwild. If any of these routines detect an error, they return to the fopen() caller with an appropriate error code in $$ferr. $$fope $$fopn $$fopx Warning: unpublished fopen() Error exit from fopen Normal open, hack append Normal exit from fopen in RSX/RSTS mode uses C Compiler and Library Page 5-100 fopen C library file opener information to obtain the PPN [UIC] of an open file. This code (in iocsi.mac) may require modification for subsequent releases of RSTS/E. Bugs Append mode cannot work on native RT11 given the design of the RT11 file system. The RT11 file system does not support files greater than 65535 blocks long. RT11 does not get the actual keyboard name of the console terminal, although this isn't too hard to do on RT11/RSTS/E. Freopen() cannot be used to assign a file to stderr as there is code throughout the i/o package for special treatment of stderr. For example, it cannot be closed by a user-written program. In RSX modes, the maximum number of files that may be simultaneously open macro (FSRSZ$) which is defined at assembly time by a is expanded when fopen.mac is assembled. The default FSRSZ$ parameter is 4. This may be modified by using the task builder /ACTFIL=n option. The default FSRSZ$ value may be specified when the RSX library is built by editing assembly parameter N$$FIL in RSX.MAC. Internal This module contains release-specific code for VMS V3.0 to enable Decus C programs to read "Ascii stream" files. C Compiler and Library Page 5-101 fprintf Formatted Output Conversion 5.83 Formatted Output Conversion ______ __________ _________ *********** * fprintf * *********** File name: fprint.mac Usage fprintf(iov, format, arg1, ...); FILE *iov; char *buffer; char *format; Description fprintf() converts and formats its arguments, writing the result to the indicated file. For information on formatting, the description of printf. Bugs please refer to C Compiler and Library Page 5-102 fps Set floating point status (FPS) 5.84 Set floating point status (FPS) ________ _____ ______ _____ ___ ******* * fps * ******* File name: fps.mac Usage #include <fps.h> fps(status) unsigned int status; Description This routien sets the floating point status by executing This allows a simply the LDFPS instruction. user program to switch between roundoff and truncation modes or enable/disable floating point interrupts. Bit definitions are in the include file, "fps.h". For example, to enable rounding and all fpu error interrupts except underflow, do the following: #include <fps.h> fps(FIUV | FIV | FIC); Bugs The C library doesn't initialize the floating point status. This routine -- with appropriate parameters - should be in all C main programs that floating require point operations. C Compiler and Library Page 5-103 fput 5.85 Output a binary record Output a binary record ______ _ ______ ______ ******** * fput * ******** File name: fput.mac Usage fput(buffer, nbytes, iop); char *buffer; int nbytes; FILE *iop; Description The specified record is written to the file. The file must have been opened 'n' so newlines aren't stuffed here and there. On RT11, the file is only readable by fget. Nbytes is always returned. A call to ferr() after calling fput() is advised. Bugs On RT11, file close zeros the current output block. To prevent fget() from reading "zero length" records, fput writes "record count + 1" on the file. C Compiler and Library Page 5-104 fread 5.86 Input a record Input a record _____ _ ______ ********* * fread * ********* File name: fread.mac Usage int fread(object, sizeof (*object), nitem, iop) int nitem; FILE *iop; Description Object points to a buffer that is to receive a specified number of items from the file. fread() returns the actual number of items This will be zero if an end-of-file or error was encountered. Bugs read. C Compiler and Library Page 5-105 frec Return True if record-oriented file 5.87 Return True if record-oriented file ____ __ _______________ ____ ______ ******** * frec * ******** File name: frec.mac Usage frec(iop); FILE *iop; Description Return 1 if the file is record-oriented. Note: this context, record-oriented files are not file- structured disks, nor are they the user's console terminal. Other terminals, along printers, qualify, however. Bugs with devices such as line- in C Compiler and Library Page 5-106 fscanf 5.88 Formatted input conversion Formatted input conversion _________ _____ __________ ********** * fscanf * ********** File name: fscanf.mac Usage fscanf(fd, fmt, pointer(s)) FILE *fd; /* Input file pointer char *fmt; /* Format string */ */ Description Fscanf() parses the input file according to the indicated format descriptor, storing the results in the pointer arguments. It returns the number of successfully assigned input items. See the description of scanf() for further documentation. Diagnostics Fscanf() returns -1 if an end of file condition exists and no data was stored. It returns -2 if a palpably incorrect format, such as "%" is encountered. Bugs C Compiler and Library Page 5-107 fseek Reposition file pointer (seek) 5.89 Reposition file pointer (seek) ____ _______ ______ __________ ********* * fseek * ********* File name: fseek.mac Usage fseek(iop, offset, param); FILE *iop; /* What device to seek long offset; /* New read position int param; /* Zero for abs. seek */ */ */ Description fseek() moves the file pointer to the indicated position. The position must have been returned by ftell() or equal zero for rewind. Param must be zero. The file/device must be seekable. fseek() returns zero if correct, EOF if an error occurs. If no error occurred, error and eof flags are reset. flseek() is an alternate entry with identical parameters and actions. Note that on RSX, fseek() can be used to open a file for update by a sequence such as: fd = fopen("file.nam", "a"); fseek(fd, 0L, 0); /* Rewind file */ If the file was opened on RSX using the 'n' mode switch, it will be opened using file attributes "fixed 512- byte records with no carriage control". The offset pointer is thus a virtual byte number and fseek may be used to freely reposition the file pointer. Bugs C Compiler and Library Page 5-108 fspool Spool file to default print queue 5.90 Spool file to default print queue ____ __ _______ _____ _____ _____ ********** * fspool * ********** File name: fspool.mac Usage fspool(fp); FILE *fp; /* Open file IOV */ Description This routine is called in lieu of fclose() when it is desired to spool the file to the system line printer. There is no control over the disposition or printout parameters. Fspool() returns zero if the file was spooled, it returns an error code if spooling could not be initiated. If called on native RT11, the file will be closed and an "illegal device error" (E$$NOD = 6) will be returned. If the program needs access to the power of the queue manager print spooler on native RSX, the RSX extensions library spwn() routine should be used to spawn a command line to MCR after closing the file as usual. If the program needs access to the power of the queue manager on RSTS/E, it should close the file and use the routines in the RSTS/E extensions library to execute the UU.SPL system function call. On RSTS/E V7.0, the file is spooled to any line printer (RSX mode) or to LP0: in RT11 mode. The particular line printer cannot be selected without modifying the source of fspool(). If the file was opened by calling fwild()/fnext(), internal buffers will not be freed, allowing the program to call fnext() for subsequent files. Bugs On RSTS/E RT11 mode, error codes will follow the description of the spooling system function call. C Compiler and Library Page 5-109 ftell Get file position for subsequent seek 5.91 Get file position for subsequent seek ____ ________ ___ __________ ____ ___ ********* * ftell * ********* File name: ftell.mac Usage long ftell(iop); FILE *iop; /* What device to seek */ Description ftell() returns the position of the read/write pointer of the indicated file. This value may be fed back to the file system by calling fseek(). Note that the value is a pointer to the record, not a block or byte pointer. On RSX, the program should flush the current record before calling ftell(). (Flush() is a noop on RT11.) If reading lines of text, the correct sequence is: position = ftell(fd); if (fgets(buffer, sizeof buffer, fd) != EOF) { /* * 'position' locates the record * read by the call to fgets() */ } Make sure you declare ftell() extern long ftell(); If you do not, it will return garbage. Bugs On both systems, the value returned is the position of the file pointer (RFA), as a byte offset from the start of the file. Note, however, that on RSX systems the pointer is to the start of the current record. It is not necessarily the case that the start of a text line equates to the start of a record. RSX supports many file record formats, including Fortran, print_file and "unformatted" The (with embedded control information). C Compiler and Library Page 5-110 ftell Get file position for subsequent seek latter files may have multiple text lines embedded each internally in record. This is handled by the formatted read routines (i.e., fgets() and getc()). On RSX, the only way to be certain of the exact record/line correspondance is to use the fget() and fput() functions. The T utility program (in the tools library) shows another method of handling this problem. On RSTS/E RT11 mode, ftell will not process "large" files (with more than 65535 blocks) correctly. C Compiler and Library Page 5-111 ftime Compute time of day (augmented) 5.92 Compute time of day (augmented) ____ __ ___ ___________ _______ ********* * ftime * ********* File name: ftime.mac Usage #ifdef unix #include <sys/types.h> #include <sys/timeb.h> #else #include <timeb.h> #endif long ftime(buf); struct timeb *buf; Description ftime returns the time of day in seconds. The time buffer receives the time of day, milliseconds since the current second, and timezone and Daylight Savings time indicators. The time buffer has the following format: struct timeb { long time; unsigned millitm; short timezone; short dstflag; }; /* /* /* /* Time of day Milliseconds Current timezone Daylight Savings */ */ */ */ The time value is the time since midnite, Jan 1, 1970, measured in seconds. The timezone value is the number of minutes that local time differs from GMT. Note that, on Unix, the time buffer definition is stored in the sys directory, while for Decus-C and Vax-11 C, it is stored in the default or sys$library: Bugs respectively). system library (C: C Compiler and Library Page 5-112 ftime Compute time of day (augmented) The Unix time function returns GMT. Decus C returns local time. Timezone and dstflag are set to zero. C Compiler and Library Page 5-113 ftty 5.93 Test if terminal file Test if terminal file ____ __ ________ ____ ******** * ftty * ******** File name: ftty.mac Usage ftty(iop) FILE *iop; Description Return 1 if the file is a terminal-type device. In general, this means the user's command terminal. Bugs Obsolete -- use for transportability. isatty(fileno(iop)) instead C Compiler and Library Page 5-114 fwild 5.94 Wild-card file open Wild-card file open _________ ____ ____ ********* * fwild * ********* File name: fwild.mac Usage FILE * fwild(name, mode); char *name; char *mode; /* File to open /* Open modes */ */ FILE * fnext(iop); FILE /* I/O pointer */ *iop; Description Fwild() opens a new or existing file (whose file name may contain "wild-cards"). Open modes are identical to those given in fopen(). On return, the file name has been parsed, but no file has yet been opened. A NULL return means that the file name did not parse correctly. Fnext() opens the first or next file which was defined by a previous call to fwild(). If fnext() returns NULL, there are no (more) files that match the wild- card specification. fwild/fnext handle RSX file version numbers correctly on VMS compatibility mode (which uses the ODS2 disk structure). Fwild/fnext do not handle version numbers correctly on native RSX systems which use the FILES- 11 (ODS1) disk structure. For example, a program can request "foo.*;3", "foo.*;*", "foo.*;0", and "foo.*;1". Omitting a version number "foo.*" is equivalent to "foo.*;0". Note that version number 0 means the "newest" file, while version number -1 means the oldest. (Version numbers are not used on RT11 or RSTS/E.) For native RSX systems (using the FILES-11 disk structure), an explicit version number and the wildcard version number work correctly. Version numbers 0 and - 1 work only if the directory has been reorganized by using the SRD utility program. If the directory has not reorganized the been appears (such that youngest version C Compiler and Library Page 5-115 fwild Wild-card file open first in the directory), fnext() will yield unpredictable results. On RT-11, the wildcard filename match is handled internally to fwild/fnext. The parser will handle several forms of wild file specs, including imbedded '*' and the single character wildcard '%', and acts the same as the DIRECTORY wildcard handler. For convenience, a '?' acts the same as a '%' in a match string. Note: if a program executes fclose(), all file name information will be lost. The following sequence illustrates proper use of fwild()/fnext(): if (gets(name_buff) == NULL) exit(); if ((fd = fwild(name_buff, "r")) == NULL) error("Can't open %s\n", name_buff); for (count = 0; fnext(fd) != NULL; count++) { /* * Process each file */ while (fgets(buffer, sizeof buffer, fd) != NULL) { /* * Process each record */ } } /* * fnext() fails; the channel is closed. * count has the number of files processed. */ if (count == 0) error("No matching files found"); The following summarizes the types of wild- card processing of available on the various implementations the C support library: Environment Supports Native RSX "*" matches any filename, filetype, or version number. Version ;0 and ;-1 are supported on ODS2 systems. UIC's may not contain wildcards. RSX/VMS As above, note that version ;-1 means the "earliest" version. Note warning below. Directory identifiers may not be RSX/RSTS wildcarded. VMS systems support ODS2. Uses RSTS/E wildcard conventions: "*" replaces "?" filename or filetype. C Compiler and Library Page 5-116 fwild Wild-card file open matches any character. PPN's may not be wildcarded. Version numbers are not supported on RSTS/E. Native RT11 "*" replaces any string, "%" or "?" match any non-blank character. RT11/RSTS Uses RSTS/E wildcard conventions noted above. Bugs On native RSX systems using ODS1 (FILES-11) disk structures, version numbers will be processed properly only if directories have been sorted (by using the SRD utility program, for example). If directories are not sorted, and fwild() is invoked with version number ;0 or ;-1, it will yield unpredictable results. The command language scan (CSI1$) on VMS compatibility mode does not parse version number -1 (because it has a different meaning on native VMS) and fwild() will consequently fail. If you want the oldest version, fwild() should be invoked with a file name of the type "foo.*" or "foo.*;0" and, before calling fnext() for the first time, you should set the correct bits in the IOV flag word as follows: if ((fd = fwild(file, "r")) == NULL) error("can't open file %s", file); if ((fd->io_flag & IO_VER) != 0 && version_minus_1_wanted) fd->io_flag |= IO_VM1; Flag bit IO_VER signals "version 0 or -1", while bit IO_VM1 signals version minus 1. Again, note that this must be done before the first call to fnext(). On native RT11 and all RSTS/E modes, fwild/fnext will fail if the device is not directory structured (even if no wildcard file is specified). If this is a problem, you should write: if ((fd = fwild(filename, mode)) != NULL) iswild = 1; else if ((fd = fopen(filename, mode) != NULL) iswild = 0; else error("cannot open the file"); The program must then test iswild to determine it must call initiated directly. fnext() or if processing should be if C Compiler and Library Page 5-117 fwild Wild-card file open On all RSTS/E modes, there may be problems with logical name translation as file name strings must be parsed more than once. Thus, if a programer defines a logical name which is identical to a valid physical device name, a wildcard lookup may access the wrong unit. This problem is described in the RSTS/E documentation. Fwild/fnext was designed to work only with disk devices. It will not necessarily work correctly with other directory-structured devices, such as magtape. Internal If you are always running on RSTS/E, or always running on RSX-11 (native or VMS compatibility mode) or always running on native RT11, you should consider editing fwild.mac to remove unnecessary code. This routine depends on some internal knowledge about RSTS/E and about the implementation of RSX-11 file control services on RSTS/E. It may need modification for subsequent releases of RSTS/E. The implementors do not apologize for the size of this module. The distribution of the C language system includes source code utility program. for the SRD (sort directories) C Compiler and Library Page 5-118 fwrite 5.95 Output a record Output a record ______ _ ______ ********** * fwrite * ********** File name: fwrite.mac Usage int fwrite(object, sizeof (*object), nitem, iop) int nitem; FILE *iop; Description Object points to a buffer that is contains a specified number of items to be written to the file. fwrite() returns the actual number of items written. This will be zero if an error was encountered. Bugs C Compiler and Library Page 5-119 getchar Get characters 5.96 Get characters ___ __________ *********** * getchar * *********** File name: getcha.mac Usage getchar(); getc(iop); FILE *iop; Description Getchar() reads one character from the standard input file. getc() reads one character from the indicated input file. Both return EOF on error or end of file. To continue reading from the program may execute: clearerr(iop); Bugs a terminal after EOF, C Compiler and Library Page 5-120 gets 5.97 Read a string from stdin Read a string from stdin ____ _ ______ ____ _____ ******** * gets * ******** File name: gets.mac Usage char * gets(buffer); char *buffer; Description gets() reads a string into the buffer from the standard input (stdin). The string is terminated by a newline character, which is replaced in the buffer by a null. Gets() returns buffer or NULL on end of file or error. Bugs C Compiler and Library Page 5-121 gettty 5.98 ________ ____ Get control terminal name Get control terminal name ___ _______ ********** * gettty * ********** File name: gettty.mac Usage gettty(buffer); char *buffer; Description Store the device name of the control terminal in the buffer. If this cannot be done, a null string will be returned. Bugs On RSX modes, gettty() uses the GLUN$ executive directive to obtain the device name and unit number of stderr (which always is assigned to the control terminal). On RT11 modes, gettty() calls iovtoa to return the file name on which stderr was opened. not necessarily contain a valid unit number. This will C Compiler and Library Page 5-122 getw Input a binary integer from a file 5.99 Input a binary integer from a file ______ _______ ____ _ ____ _____ _ ******** * getw * ******** File name: getw.mac Usage getw(iop); FILE *iop; Description getw() reads one (16-bit) word from the indicated file. The program must call feof() or ferr() to test for end of file or error. Bugs C Compiler and Library Page 5-123 inchr Find Index of Character in a String 5.100 Find Index of Character in a String _____ __ _________ __ _ ______ ____ ********* * inchr * ********* File name: inchr.mac Usage char * inchr(stng, chr) char *stng; char chr; /* String to search in /* Byte to search for */ */ Description If chr is in stng, return its index, i.e. the offset in bytes from the beginning of the string inchr("abc",'b') == 1. return -1. See also strchr(). Bugs If chr is not in stng, C Compiler and Library Page 5-124 index Find First Instance of a Character in a String 5.101 Find First Instance of a Character in a String ____ _____ ________ __ _ _________ __ _ ______ ********* * index * ********* File name: index.mac Usage char * index(stng, chr) char *stng; char chr; /* String to search in /* Byte to search for */ */ Description If chr is in stng, return a pointer not, return NULL. Bugs Obsolete; use strchr() instead. to it. If C Compiler and Library Page 5-125 iov I/O vector definition 5.102 I/O vector definition ___ ______ __________ ******* * iov * ******* File name: iov.mac Usage #include <stdio.h> ... to be supplied ... Bits in iov.io_flag: #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define _IOREAD 0000001 _IOWRT 0000002 _IONBF 0000004 _IOMYBUF 000010 _IOEOF 0000020 _IOERR 0000040 _IOSTRG 0000100 _IORW 0000200 IO_CMD 0000400 IO_APN 0001000 IO_NOS 0002000 IO_NEWL 0004000 IO_FIL 0010000 IO_TTY 0020000 IO_REC 0040000 IO_OPN 0100000 IO_EOR (IO_ERR Bits in iov.io_wflag: #define IO_WLD 0000001 #define IO_VM1 0000002 #define IO_VER 0000004 #define IO_WF1 0000010 #define IO_NLH 0000020 /* read /* write /* Unbuffered, "u" mode /* I/O lib. owns buffer /* End of file seen /* Error seen /* For sprintf /* Open for read/write /* User's command tty /* Append mode open /* No newlines needed /* RSX TTY newline hack /* Disk file /* Terminal device /* Record device /* Open file | IO_EOF) */ */ */ */ */ */ */ */ */ */ */ */ */ */ */ */ /* /* /* /* /* */ */ */ */ */ fwild: wildcard file fwild: version ;-1 fwild: ;0 or ;-1 fwild first flag Newlines hack bit Bits in iov.io_rsflag (RSTS native only) #define IO_ODT2 0100000 /* ODT mode (RSTS only) */ extern extern extern extern extern int FILE FILE FILE int $$ferr; *stdin; *stdout; *stderr; $$exst; /* /* /* /* /* Error word Standard input file Standard output file User's command tty Exit status */ */ */ */ */ C Compiler and Library Page 5-126 iov I/O vector definition Internal extern extern extern extern extern extern FILE extern FILE *$$luns[]; /* IOV pointer table FILE *$$lune; /* IOV table end (int)(char *$$lmax); /* RSX $$luns dim. char **$$ifil; /* -> stdin file name char **$$ofil; /* -> stdout file name int $$nlun; /* RSX: Number of luns *$$eiov; /* RSX: Stderr iov int $$iosb[2]; /* RSX: I/O status */ */ */ */ */ */ */ */ Description Define the I/O vector structure used for communication by all I/O routines in the C library. Note that it is different for RSX certain in and RT11 modes. Note also that bits IO_FLAG are only meaningful for one flavor of I/O. The RSX-mode IOV contains an entire file data block (FDB). Also, 'io_uic' contains the binary UIC of the directory via which the file is being accessed, not the 'owner' UIC. It is this UIC which is given when fgetname() is called. The RT11-mode IOV contains only enough information to read and write files plus a pointer to an Ascii string with the file name argument to fopen(). The file name is needed for fgetname() and to allow deleting files given the IOV pointer. The following files are defined here: stdin The standard input file. stdout The standard output file. stderr The error output file. Note: on RSX systems, stderr is opened on LUN 1. $$ferr (error word) is also defined here. This is set non-zero if an error occurred when performing I/O. On RSX, the standard I/O error code is returned. On RT11, an error code compatible with RSTS/E usage is returned: Global E$$ILF E$$NOR E$$FNF E$$NOD E$$ILU E$$NOO E$$EOF E$$FAT Value 02. 002 04. 004 05. 005 06. 006 07. 007 09. 011 11. 013 12. 014 Meaning Illegal file name No room for user on device Can't find file or account Not a valid device I/O channel in use I/O channel not open End of file on device Fatal system I/O failure C Compiler and Library Page 5-127 iov I/O vector definition E$$ERR E$$FND E$$NOC E$$NSP 13. 16. 17. 32. 015 020 021 040 User data error on device File already found (protected) Too many open files on unit. No memory space for buffer E$$FAT (12) is set only if an "impossible" error occurs. While this may indicate a bug in the RT11 library, it is more likely to be a user programming error (like passing garbage to an I/O routine). E$$ILU (7) is set if fopen tries to open a channel that is already in use. The perror() library routine may be used to print an error message defined for the error code. $$exst (exit status) is used to transmit a termination code to the operating system. The value is set by calling exit() or exits(). The following exit status values are defined in stdio.h: Global E$$XOK E$$XWA E$$XER E$$XFA #define IO_SUCCESS IO_WARNING IO_ERROR IO_FATAL RSX RT11 Meaning 1 1 Normal 0 2 Warning 2 4 Error 4 8 Severe Error Internal In RSX, buffering is done by the RSX file- management services (FCS). The block buffer pointer is unused (but reserved for anybody who cares to add random access). Bugs C Compiler and Library Page 5-128 irand Random number modulus argument 5.103 Random number modulus argument ______ _______ ________ ______ ********* * irand * ********* File name: irand.mac Usage int irand(arg) int arg; Description Generate a pseudorandom number in the range (arg-1). If arg is zero, generate a number in the .. range 0 .. 32767. Note that the algorithm is prone to nonrandom sequences when considering the next pseudorandom number. irand is equivalent to the following sequence: extern long rand; if (arg == 0) arg = 32767; return(((rand() >> 8) & 32767) % arg); Bugs 0 C Compiler and Library Page 5-129 isalloc Check If a Pointer Points to Allocated Memory 5.104 Check If a Pointer Points to Allocated Memory _____ __ _ _______ ______ __ _________ ______ *********** * isalloc * *********** File name: isallo.mac Usage int isalloc(buff) char *buff; Description isalloc() returns 1 if buff is a pointer to a block of memory allocated by calloc(), malloc(), or realloc() that has not been freed (by free()); -1 if it is a (recently) freed allocated block; and 0 otherwise. isalloc(NULL) == 0. isalloc(p) will remain -1 after a call of free(p) at least until the next call to calloc(), malloc(), etc. Beyond that, its value is not predictable. Pointers for which isalloc() is non-zero are exactly those that may safely be passed to realloc(). The test done by isalloc() is definitive, unlike the tests done by, for example, free() and msize(), which will yield false positives at least time. 25% of the However, isalloc() is slower. Bugs Not portable. C Compiler and Library Page 5-130 isalnum Return TRUE if alphanumeric argument 5.105 Return TRUE if alphanumeric argument ______ ____ __ ____________ ________ *********** * isalnum * *********** File name: isalnu.mac Usage isalnum(c); int c; Description Return non-zero if c is 0 otherwise. Bugs an alphanumeric character, C Compiler and Library Page 5-131 isalpha Test for alphabetic argument 5.106 Test for alphabetic argument __________ ________ ____ ___ *********** * isalpha * *********** File name: isalph.mac Usage isalpha(c); int c; Description Return non-zero if 0 otherwise. Bugs c is an alphabetic character, C Compiler and Library Page 5-132 isascii Test for 7-bit Ascii character 5.107 Test for 7-bit Ascii character _____ _____ _________ ____ ___ *********** * isascii * *********** File name: isasci.mac Usage isascii(c); int c; Description Return non-zero if c 0 otherwise. Bugs is a 7-bit Ascii character, C Compiler and Library Page 5-133 isatty 5.108 Test if terminal file Test if terminal file ____ __ ________ ____ ********** * isatty * ********** File name: isatty.mac Usage isatty(channel_number) int channel_number; Description Return 1 if the file open on this channel is a terminal-type device. In general, this means the user's command terminal. Note that the argument is a file descriptor, not a FILE * pointer. File descriptors are used on Unix to identify the channel on which the file is open. As Decus C does not support file descriptor I/O processing, the logical unit number assigned to a file by fopen() is used instead. Use isatty() as follows: if (isatty(fileno(fd))) ... Bugs Note that Decus C channel numbers are to Unix file descriptors. isatty(0) Specifically, not related does not necessarily check stdin. isatty(fileno(stdin)) instead. Use C Compiler and Library Page 5-134 iscntrl Test for control character argument ;02 5.109 Test for control character argument ____ ___ _______ _________ ________ 02 *********** * iscntrl * *********** File name: isctrl.mac Usage iscntrl(c); int c; Description Return non-zero if C is a control character. Bugs C Compiler and Library Page 5-135 isdigit Return TRUE if digit argument 5.110 Return TRUE if digit argument ____ __ _____ ________ *********** * isdigit * *********** File name: isdigi.mac Usage isdigit(c); int c; Description Return 1 if c is an Ascii digit, 0 otherwise. Bugs ______ C Compiler and Library Page 5-136 isgraph Test for graphic alphabetic argument 5.111 Test for graphic alphabetic argument ____ ___ _______ __________ ________ *********** * isgraph * *********** File name: isgrap.mac Usage isgraph(c); int c; Description Return non-zero if c is a graphic character, 0 otherwise. Graphics characters include letters, digits, and punctuation. Bugs Space, tab, etc. are not graphics. C Compiler and Library Page 5-137 islower Test for lower-case alphabetic argument 5.112 Test for lower-case alphabetic argument ____ ___ __________ __________ ________ *********** * islower * *********** File name: islowe.mac Usage islower(c); int c; Description Return non-zero if C alphabetic character, 0 otherwise. Bugs is a lower-case C Compiler and Library Page 5-138 isprint Return non-zero if printable argument 5.113 Return non-zero if printable argument ______ ________ __ _________ ________ *********** * isprint * *********** File name: isprin.mac Usage isprint(c); int c; Description Return non-zero if c is a printable character, 0 otherwise. Printable characters include letters, digits, punctuation, and the newline, etc. Bugs are not included. space character. Tab, C Compiler and Library Page 5-139 ispunct Return TRUE if punctuation argument 5.114 Return TRUE if punctuation argument ______ ____ __ ___________ ________ *********** * ispunct * *********** File name: ispunc.mac Usage ispunct(c); int c; Description Return non-zero 0 otherwise. Bugs if c is an Ascii punctuation, C Compiler and Library Page 5-140 isspace Return non-zero if the character is "whitespace" 5.115 Return non-zero if the character is "whitespace" ______ ________ __ ___ _________ __ ____________ *********** * isspace * *********** File name: isspac.mac Usage isspace(c); int c; Description Return non-zero if c is a whitespace character. These consist of space, backspace, newline, and form-feed. included. Bugs The carriage return ('\r') is also tab, C Compiler and Library Page 5-141 isupper Return TRUE if Upper-case alphabetic argument 5.116 Return TRUE if Upper-case alphabetic argument ______ ____ __ __________ __________ ________ *********** * isupper * *********** File name: isuppe.mac Usage isupper(c); int c; Description Return 1 if c is an Upper-case alphabetic 0 otherwise. Bugs character, C Compiler and Library Page 5-142 isxdigit Return non-zero if hexadecimal digit 5.117 Return non-zero if hexadecimal digit ______ ________ __ ___________ _____ ************ * isxdigit * ************ File name: isxdig.mac Usage isxdigit(c); int c; Description Return non-zero if C is a valid hexadecimal digit 9, A-F, a-f). Bugs This routine is not present in other C libraries. (0- C Compiler and Library Page 5-143 itoa 5.118 Integer to Ascii Integer to Ascii _______ __ _____ ******** * itoa * ******** File name: itoa.mac Usage char * itoa(value, string) int value; char *string; Description itoa converts the value to a (signed) decimal string. The string is null-trailed. itoa returns a pointer to the trailing null. Note that the result can be computed (more flexibly) by executing sprintf(buffer, "%d", value); Bugs C Compiler and Library Page 5-144 itoa8 Convert integer to octal Ascii 5.119 Convert integer to octal Ascii _______ __ _____ _____ _______ ********* * itoa8 * ********* File name: itoa8.mac Usage char * itoa8(value, buffer); int value; char *buffer; Description: The value is converted to octal and stored in the buffer. A pointer to the trailing null is returned. Note that the result can be computed (more flexibly) by executing sprintf(buffer, "%o", value); Bugs: This routine does not generate leading zeros. they are needed, use: sprintf(buffer, "%06o", value); If C Compiler and Library Page 5-145 itoax Convert an integer to hexidecimal Ascii 5.120 Convert an integer to hexidecimal Ascii _______ __ _______ __ ___________ _____ ********* * itoax * ********* File name: itoax.mac Usage char * itoax(value, buffer); int value; char *buffer; Description: Convert the integer to hexidecimal ascii. The string is null-trailed. Values from 10 to 15 (decimal) are represented by "A" to "F". Itoax() returns a pointer to the trailing null. Note that the result can be computed (more flexibly) by executing sprintf(buffer, "%x", value); Bugs: C Compiler and Library Page 5-146 kbin Single Character Terminal Input 5.121 Single Character Terminal Input _________ ________ _____ ______ ******** * kbin * ******** File name: kbin.mac Usage int kbin(); Description Read one character from the console terminal. The input character is not echoed nor does the program delay until an entire line has been entered. Note the following: This routine is very inefficient, as it requests operating-system service for every character entered. Typing Control/C (or Control/Y on VMS) will cause the program to exit immediately (as if the main() routine exited), closing all files. On RT-11 (native and emulated), the operating system expands <return> to a carriage return line feed sequence. This will be stripped by kbin() to just <return> reads ('\r' in C). Thus, if the user program '\n', a <line-feed> was typed. Note that this is unlike the general C library. Bugs On RSX, this routine requires the command terminal having been assigned as logical unit number 1. In general, the input character will not have been echoed. On RSTS/E and native RT11, the operating system may already have echoed the character if you type the character before the read request has been made. C Compiler and Library Page 5-147 kbinr Terminal Input Without Wait 5.122 Terminal Input Without Wait _____ _______ ____ ________ ********* * kbinr * ********* File name: kbinr.mac Usage int kbinr(); Description If a character has been typed on the console terminal, return it (without echoing or waiting). If no character is available, kbin() returns -1 (EOF). Note the following: This routine is very inefficient, as it requests operating-system service for every character entered. Typing Control/C (or Control/Y on VMS) will cause the program to exit immediately. On RT-11, the operating system expands <return> to a carriage return line feed sequence. This will be stripped by kbin() to just <return> ('\r' in C). Thus, if the user program reads '\n', a <line-feed> was typed. Note that this is unlike the general C library. Bugs On RSX-11M, this routine depends on the fact that the console terminal was assigned to LUN 1. On RSX-11M and VMS emulation mode, the typed character will not be echoed. On RSTS/E and RT11 modes, it may have already been echoed by the operating system if the terminal user typed before the program requests input. C Compiler and Library Page 5-148 localtime 5.123 Build time of day buffer Build time of day buffer _____ ____ __ ___ ______ ************* * localtime * ************* File name: localt.mac Usage #include <time.h> /* Define tm structure */ struct tm * localtime(tvec); long *tvec; /* Time value pointer */ struct tm { int tm_sec; int tm_min; int tm_hour; int tm_mday; int tm_mon; int tm_year; int tm_wday; int tm_yday; int tm_isdst; }; /* /* /* /* /* /* /* /* /* Seconds */ Minutes */ Hours */ Day of month */ Month 0 .. 11 */ Year - 1970 */ Weekday, Sunday == 0 */ Days since Jan 1 */ Daylight Saving if 1 */ Description localtime() converts a Unix time value to a vector of values. Bugs Decus C doesn't correct for time zone or daylight savings time. Leap year isn't done correctly. fail The routine will after Feb 28, 2100. Following Unix precedent, localt returns a pointer to a static buffer. C Compiler and Library Page 5-149 malloc 5.124 ____ ______ Allocate and free memory Allocate and free memory ________ ___ ********** * malloc * ********** File name: malloc.mac Usage char * malloc(size); unsigned size; /* NULL if no space /* Number of bytes */ */ mfree(p); free(p); char *p; /* Was allocated */ Internal extern char *$$alhd; /* Allocated block list */ mov call ; Internal call ; to malloc() size,r0 $$aloc Return: r0 -> space (or 0), other registers preserved mov call pointer,r0 $$free ; Internal call ; to free() Return: r0 random, other registers preserved Description malloc() allocates the indicated number of bytes, returning a pointer to the first. If the allocation request cannot be satisfied, malloc returns The program image is expanded as needed. NULL. free() and mfree() return a buffer to free space. Nothing is returned. See also the description of realloc() and sbrk(). Internal All free memory is allocated in linked lists which are stored in monotonically linked, noncontiguous areas. Each block has is preceeded by a one word header: C Compiler and Library Page 5-150 malloc Allocate and free memory pointer to next block + "busy bit" The pointer is to the next following block. The last block points to the first. The "busy bit" will be set if the data in the block is in use. $$alhd points to the first such block. Note that a block need not contain any data. Free space is coalesced during the allocation search. Diagnostics The program may abort if free() is passed a random pointer or if the program writes outside of an area reserved by malloc(). Note that only certain cases are trapped by this test and that free will accept invalid addresses, which will cause mysterious failures. The isalloc() function may be used to test whether a block of memory has been allocated by malloc(). Bugs C Compiler and Library Page 5-151 maxmin Maximum and Minimum Routines 5.125 Maximum and Minimum Routines _______ ________ _______ ___ ********** * maxmin * ********** File name: maxmin.mac Usage max(a,b) int int a; b; min(a,b) int int a; b; unsigned maxu(a,b) unsigned unsigned a; b; unsigned minu(a,b) unsigned unsigned a; b; Description max() and min() return, respectively, the maximum and minimum of their two arguments, considered as signed integers. maxu() and minu() are the same but consider their arguments to be unsigned. Note: If you are interested in getting the fastest code possible sizes and have some knowledge of the relative of a and b, arrange for a to be chosen most often. (It's unlikely the in virtually all cases.) Bugs difference will be noticable C Compiler and Library Page 5-152 memdmp 5.126 Dump memory or registers Dump memory or registers ____ ______ __ _________ ********** * memdmp * ********** File name: memdmp.mac Usage memdmp(start, end); /* Memory dump routine char *start; /* First to dump char *end; /* Last to dump */ */ */ regdmp(); */ /* Register dump Internal call regdmp ;Register dump mov mov call #end,-(sp) #start,-(sp) memdmp ;Last address ;First address ;Dump memory (or first) (or last) mov mov call #start,r0 #end,r1 $$dump ;First address ;Last address ;Dump memory (or first) (or last) mov mov call value,r0 #buffer,r1 $$toct ;What to convert ;Where it goes ;Convert it Return: r0 r1 r2-r5 unchanged -> first free byte in buffer unchanged Description Dump registers are preserved. and/or memory. All registers If memdmp is called with a zero argument, the stack will be dumped. Memdmp and regdmp are independent of the C I/O library. However, on RSX, they assume that the console terminal has been assigned as LUN 1. C Compiler and Library 5-153 memdmp Dump memory or registers Bugs Condition codes are not preserved. Page C Compiler and Library Page 5-154 msg Print a message on the command terminal 5.127 Print a message on the command terminal _____ _ _______ __ ___ _______ ________ ******* * msg * ******* File name: msg.mac Usage msg(text) char *text; Internal mov call #text,r0 $$msg Description Print a message on the console terminal. This does Return: routine not use the standard library. all registers are preserved. Bugs On RSX, this routine requires the command terminal having been assigned as logical unit number 1. C Compiler and Library Page 5-155 msize 5.128 ______ _____ Get Size of a Memory Block Get Size of a Memory Block ___ ____ __ _ ********* * msize * ********* File name: msize.mac Usage unsigned int msize(buff) char *buff; Description msize() returns the size of a block of memory allocated by calloc(), malloc(), or realloc(). If buff did not, in fact, come from one of these routines, the program will crash about 75% of the time; the other 25% , nonsense will be returned. (This behavior is due to a simple-minded validation algorithm.) However, buff == NULL is valid and will return 0. Note that the value returned is the amount of memory that malloc() (or whoever) actually allocated, which may not be exactly the same as the program asked for. (Currently, all even number of bytes.) Bugs allocations are rounded up to an Not portable. C Compiler and Library Page 5-156 mul$l 5.129 Multiply long * long Multiply long * long ________ ____ _ ____ ********* * mul$l * ********* File name: mull.mac Usage long mul$l(a, b); long long a; b; long mul$li(a, b); long int a; b; /* long = long * long */ /* Long = long * int */ Description Multiply the long arguments. This routine is called by the C compiler to compile long multiplies. For EIS, given two longs, A and B, in the word format Ah,As,Al and Bh,Bs,Bl where Ah is the high word, As the sign bit of the low word, and Al the remaining 15 bits of the low order word. A * B = Al * Bl Then + As * Bl * 2**15 + Bs * Al * + Al * Bh * 2**16 + Bl * Ah * 2**15 2**16 This derivation was provided by Cliff Geschke. Bugs C Compiler and Library Page 5-157 peek Peek at a location in RSTS/E 5.130 Peek at a location in RSTS/E ________ __ ______ ____ __ _ ******** * peek * ******** File name: peek.mac Usage peek(location) int *location; Description Peek to a location in the RSTS/E monitor. The job will be aborted with a BPT if not running under RSTS/E. Bugs C Compiler and Library Page 5-158 perror Print Library Error Message 5.131 Print Library Error Message _______ _____ _______ _____ ********** * perror * ********** File name: perror.mac Usage perror(text) char *text; Description An error message is written to stderr, using the current i/o library error (stored in $$ferr). prepended to the message. Diagnostics Bugs Text is C Compiler and Library Page 5-159 printf 5.132 Formatted print routine Formatted print routine _________ _____ _______ ********** * printf * ********** File name: printf.mac Usage printf(format, arg1, ...) char *format; fprintf(iov, format, arg1, ...) FILE *iov; char *format; char * sprintf(buffer, format, arg1, ...); char *buffer; char *format; $$prnt(format, argvec, iov) char *format; int *argvec[]; FILE *iov; Description printf() converts, formats, and prints its arguments, under control of the first argument, writing output via putchar(). fprintf() writes its output to the indicated file. sprintf() writes its output to the indicated string buffer. $$prnt() is the internal print formatter which is called by printf, etc. sprintf() returns a pointer to the EOS at the end of the output buffer. This is not necessarily transportable. The format argument is a character string which contains two types of objects: plain characters, which are simply copied to the output stream, and conversion specifications, each of which causes conversion and printing of the next successive argument to printf. Each conversion specification is introduced by the character %. - an left Following the %, there may be optional minus sign "-" which specifies C Compiler and Library Page 5-160 printf Formatted print routine adjustment of the converted argument in the indicated field. - an optional digit string specifying field width; if the converted argument has fewer characters than the field width, it will be blank-padded on the left (or right, if the left-adjustment indicator has been given) to make up the field width. If the field width is specified as '*' or '?', the next argument is used. (Note: '?' is obsolete.) If the width is specified with a leading zero, zeros are used for padding instead of blanks. This zero does NOT imply an octal field width. For example, assume the value 123 is to be printed: %d "123" %5d " 123" %-5d "123 " %05d "00123" - an optional period "." which serves to separate the field width from the next digit string; - an optional digit string (precision) which specifies the number of digits to appear after the decimal point for e- and f-conversion, or the maximum number of characters to be printed from a string. If the precision is specified as '*' or '?', type of next argument is used. - a character which indicates the conversion the to be applied. The conversion characters and their meanings are d u o X x Signed-decimal Unsigned-decimal Octal Hexadecimal, 10-15 are represented by A-F Hexadecimal, 10-15 are represented by a-f The integer argument is converted to decimal, octal, or hexadecimal notation respectively. Any of the conversion characters may be preceeded by 'l' to signal "long" integer argument. Note that the Unix usage of capital letters to represent long arguments is not supported. Note In order to eliminate the very large floating point conversion routines from most programs, a program which requires floating point conversion must request C Compiler and Library Page 5-161 printf Formatted print routine the double to ascii conversion routine explicitly. The following sequences show how this is done: RSX: TKB task=source,LB:DTOA,LB:C/LB RT11: LINK source,C:DTOA,C:SUPORT,C:CLIB/BOT:2000 If this is not done, any use of the %f %e, or %g conversions will result in an error message. On RSTS/E, the library build procedure creates RTDTOA.OBJ and RXDTOA.OBJ in the library account. ** ** ** ** ** ** f The Floating point support has not yet been fully implemented. The float or double value must be the last or only argument to printf. Only single-precision conversion is presently available. argument is ** ** ** ** ** ** converted to decimal notation in the style "[-]ddd.dd" where the number of d's after the decimal point equals the precision specification for the argument. If precision is missing, 6 digits are given; if explicitly 0, no digits and no decimal point are printed. The argument should be float or double. "%lf" or "%F" must be used to signal "long (i.e. double) argument." e This is a restriction of Decus C. The float or double argument is converted in the style "[-]d.ddde+-dd" where there is one digit before the decimal point and the number after is equal the to the precision specified for argument; if the precision is missing, 6 digits are produced. "%le" or "%E" must be used to signal "long (i.e. double) argument." This is a restriction of Decus C. g Floating point: "%f" format if suitable, else "%e" format. "%lg" or "%G" must be used to signal "long (i.e. double) argument." This is a restriction of Decus C. c The argument character is printed. (Note that 'lc' takes a long integer argument.) r Remote format. The next printf() argument is the format. Note that this is not a subroutine. The current format is not processed further. For example: bug(args) { C Compiler and Library Page 5-162 printf Formatted print routine error("Error at %r", &args); } This routine might be called as follows: bug("Error %d at %s\n", val, name); %r is not transportable to all implementations of the standard library. It does not word on Vax-11 C, for example. $$prnt may be used as shown below for similar functionality. s The argument is taken to be a string (character pointer) and characters from the string are printed until a null character or until the number of characters indicated by the precision specification is reached; however if the precision specification is 0 or missing all characters up to null are printed. If no recognizable character appears after the %, that character is printed; thus % may be printed by the use of the string %%. In no case does a non-existant or small field width cause truncation of a field; padding takes place only if the specified field width exceeds the actual width. Characters generated by printf() are printed by calling putchar(). $$prnt() is the internal print formatter called all "top-level" print functions. It is functionally identical to the Unix and library Vax-11 C _doprnt() by routine. Unfortunately, the leading '_' conflicts with RSX-11M file services library routine conventions, requiring the use of the Decus C unique "$$" prefix. If your programs wish to call $$prnt, a potentially transportable procedure would be: #ifdef decus $$prnt(format, args, iov); #else _doprnt(format, args, iov); #endif You should assume, however, that _doprnt() is implementations of not necessarily present on all the "standard library." Bugs e, f, and g conversion only work for single- precision floating point. Use of "%lf" etc. is not and may change. It may also cause problems transportable in the C compiler (as the standard says that subroutine calls take double (not short floating) arguments. C Compiler and Library Page 5-163 profile Print profile data 5.133 Print profile data _____ _______ ____ *********** * profile * *********** File name: profil.mac Usage $$prof(); extern int $$prnl; extern char *$$pfil; Description $$prof is called by the run-time library when the program exits if any functions have been executed that were compiled with the profile option. A profile file is written to file "profil.out". This is defined by a global symbol $$pfil. By setting $$prnl to NULL, the profile file is supressed. By changing the value of $$prnl, the program can control the number of profile entries written on each line. The default value writes 4 entries per line. $$prnl writes N entries on each line, Changing to N simplifing post-processing (sorting) of the data. $$prnl = 0; For example: writes each entry on a separate line. The following example shows how to control the output file name: extern char *$$pfil; ... $$pfil = "ti:"; /* Output to ti: $$pfil = NULL; /* No profile output Data is written using the format string "%8s If more than one entry is written to a line, succeeding entries will be preceeded by one space. */ */ %6u". C Compiler and Library Page 5-164 profile Print profile data Note that, by writing the data one entry per line, the profile output may easily be sorted either by function name or by frequency count. Bugs C Compiler and Library Page 5-165 putc Output one character to a file 5.134 Output one character to a file ___ _________ __ _ ____ ______ ******** * putc * ******** File name: putcha.mac Usage putchar(c); char c; putc(c, iop); char FILE c; *iop; Description Putchar() writes one character to the standard output file. Putc() writes one character to the named output file. Normally, the character is returned. on errors. Bugs EOF is returned C Compiler and Library Page 5-166 puts Output a string to a file 5.135 Output a string to a file ______ __ _ ____ ______ _ ******** * puts * ******** File name: puts.mac Usage puts(s); char *s; fputs(s, iop); char FILE *s; *iop; fputss(s, iop); char *s; FILE *iop; Description puts() writes a string to the standard output. It appends a newline after the string. fputs() writes a string to the indicated file. No newline is appended. fputss() writes a string A newline is appended. Bugs to the indicated file. C Compiler and Library Page 5-167 putw Output a binary integer to a file 5.136 Output a binary integer to a file _ ______ _______ __ _ ____ ______ ******** * putw * ******** File name: putw.mac Usage putw(word, iop); int word; FILE *iop; Description putw() writes one word to the It returns EOF on error, 0 on success Bugs indicated file. C Compiler and Library Page 5-168 qset Add memory to the RT11 queue area 5.137 Add memory to the RT11 queue area ______ __ ___ ____ _____ ____ ___ ******** * qset * ******** File name: qset.mac Usage qset(number) int number; /* How many elements */ Description Allocate sufficient memory for the requested number queue cannot of elements. If sufficient be allocated, do nothing. Bugs This routine is ignored on RSX. memory C Compiler and Library Page 5-169 r50toa Convert Radix-50 to Ascii 5.138 Convert Radix-50 to Ascii ________ __ _____ _______ ********** * r50toa * ********** File name: r50toa.mac Usage r50toa(buff, r5vec, r5cnt); char *buff; /* Output text buffer */ int *r5vec; /* Input rad50 buffer */ int r5cnt; /* How many rad50 words */ Description: Convert r5cnt words of radix 50 data to Ascii. All letters will be in upper-case. The output buffer will not be null-trailed, nor will blank fields be supressed. Bugs C Compiler and Library Page 5-170 rand 5.139 Random number generator Random number generator ______ ______ _________ ******** * rand * ******** File name: rand.mac Usage long rand() extern long seed; /* Random number seed */ Description Generate a pseudorandom number. The algorithm is: seed = (69069 * seed + 1); return (rand & 0X8FFFFFFF); The algorithm is based on the mth$random function in the VMS common run-time library. Note that the algorithm is prone to nonrandom sequences when considering the next pseudorandom number. Bugs C Compiler and Library Page 5-171 realloc Reallocate memory 5.140 Reallocate memory __________ ______ *********** * realloc * *********** File name: reallo.mac Usage char * realloc(buff, size); char *buff; unsigned size; /* Buffer from malloc() */ /* New size for buff */ Description Realloc() changes the size of the block pointed to by buff, returning a pointer to the (possibly moved) block. The contents will be unchanged up to the lesser of the new and old sizes. Realloc() also works if buff points to a block freed since the last call of malloc(), realloc(), or calloc(); thus sequences of free(), malloc(), and realloc() can exploit the search strategy of malloc() to do storage compaction. See also the description of malloc(), calloc() and sbreak(). The following program segment illustrates of realloc() to expand and compact storage. use #ifndef vms static char *compact_work; #endif main() { /* * Initialize work element * for compact() */ #ifndef vms compact_work = malloc(1); #endif ... } C Compiler and Library Page 5-172 realloc Reallocate memory char * compact(old_ptr, new_size) char *old_ptr; int new_size; /* * Reallocate the area allocated to old_ptr, * originally allocated by a call to malloc(), * so that it will contain new_size bytes (which * may be greater or less than the current size). * Return a pointer to the new area. * Note: error handling is not shown. */ { extern char *realloc(); free(old_ptr); #ifndef vms free(compact_work); compact_work = malloc(1); #endif return(realloc(old_ptr, new_size)); } compact_work must not be used on the native vax compiler (Vax-11 C) as the internal free memory buffers are organized in a different and incompatible manner. Diagnostics The program will abort if buff is not the address a buffer allocated by malloc() or calloc(). Bugs of C Compiler and Library Page 5-173 rewind Rewind a file for re-reading 5.141 Rewind a file for re-reading ____ ___ __________ ______ _ ********** * rewind * ********** File name: rewind.mac Usage rewind(iop); FILE *iop; Description Rewind the indicated file. Return -1 if failure, 0 if ok. On RT11, if the file was opened for output, it is closed and reopened for input. Diagnostics RT11 exits fatally if the file name won't parse. As the filename was stored by fopen(), this probably means that the user program has stored randomly in memory. Bugs C Compiler and Library Page 5-174 rindex Find Last Instance of a Character in a String 5.142 Find Last Instance of a Character in a String ____ ____ ________ __ _ _________ __ _ ______ ********** * rindex * ********** File name: rindex.mac Usage char * rindex(stng, chr) char *stng; char chr; /* String to search in /* Byte to search for Description If chr is in stng, return a pointer to the last instance it. If not, return NULL. Bugs Obsolete, use strrchr() instead. */ */ C Compiler and Library Page 5-175 rstsys 5.143 Execute a RSTS EMT Execute a RSTS EMT _______ _ ____ ___ ********** * rstsys * ********** File name: rstsys.mac Usage int rstsys(emt) Description Execute a rsts emt, returning the error code. Bugs C Compiler and Library Page 5-176 rtemt 5.144 Execute a RT11 EMT Execute a RT11 EMT _______ _ ____ ___ ********* * rtemt * ********* File name: rtemt.mac Usage int rtemt(emt, r0value) Description Execute a rt11 emt after loading r0. Bugs C Compiler and Library Page 5-177 salloc 5.145 Allocate local memory Allocate local memory ________ _____ ______ ********** * salloc * ********** File name: salloc.mac Usage char * salloc(n); /* NULL if no space */ Description Allocate the requested number of bytes on the run- time stack, returning a pointer to the first byte allocated. The storage will be reclaimed automatically when the function that called salloc() exits. Note that storage so allocated cannot be explicitly freed. salloc() returns NULL if allocating the requested space would cause the run-time stack to go below 1000 octal. Note: it is essential that salloc() be called with a "clean stack". I.e, the program must not execute subr(salloc(10), 20); Instead, it should execute temp = salloc(10); subr(temp, 20); Diagnostics Bugs C Compiler and Library Page 5-178 sbrk Allocate memory from operating system 5.146 Allocate memory from operating system ________ ______ ____ _________ ______ ******** * sbrk * ******** File name: sbrk.mac Usage char * sbrk(amount) int amount; Description sbrk() allocates the indicated amount of memory from the operating system. The allocation is permanent. Diagnostics NULL is returned if the memory requested not available. There is no "shortened" return. Bugs Internal Sbrk() does not modify its argument. is C Compiler and Library Page 5-179 scanf Formatted input conversion 5.147 Formatted input conversion _____ __________ _________ ********* * scanf * ********* File name: scanf.mac Usage scanf(fmt, pointer(s)) char *fmt; /* Format string */ fscanf(fd, fmt, pointer(s)) FILE *fd; /* Input file pointer char *fmt; /* Format string */ */ sscanf(buf, fmt, pointer(s)) char *buf; /* Input text buffer char *fmt; /* Format string */ */ $$scan(fmt, argp, iov) char *fmt; /* Format string int *ptr[]; /* Pointer vector FILE *iov; /* Input file des. */ */ */ Description Using the format string, these functions parse the input file (or given text file), storing the results in the pointer arguments. The three user-callable routines differ as follows: scanf Reads from the standard input file. fscanf Reads from the indicated file. sscanf Reads from the text buffer. $$scan() is an internal routine called by the above to actually parse the input text. It is functionally identical to the Unix and Vax-11 C _doscan() routine. Unfortunately, the leading '_' conflicts with RSX file control service routine naming conventions. The format string may contain control characters to direct the conversion of the input textual data: ' ' format Blanks, tabs, or newlines are ignored in C Compiler and Library Page 5-180 scanf Formatted input conversion strings. x An To match whitespace, use "%[ \t\n]". ordinary character (not %) must match the next input character. % Conversion specifications consist of a '%', an optional '*' (to supress assignment), an optional maximum numeric field width, and a conversion specifier. Unless value assignment was supressed by the '*' format modifier, the next field is converted and stored in the variable pointed to by the corresponding argument. An input field is defined as a string of non- space characters, extending to the first inappropriate character or until the field width (if given) is exhausted. The following conversion characters are specified: % A single '%' is expected in the input, no assignment is done. d An integer of the specified o octal, hexadecimal) x corresponding class (decimal, or is expected. The argument should be an integer pointer. If the format specifer is given in upper-case, or preceeded by 'l', a long integer will be stored. For example, "%ld" is identical to "%D". ignored. Leading whitespace will be A null field is not converted. Scanf() returns a count of the number of fields converted, but does not indicate which fields were ignored. s A character string is expected. The input field will be terminated by a space, tab, or newline. The corresponding argument should point to a buffer large enough to contain the text and a terminating NULL. Leading whitespace will be ignored. c A single character is read. Leading white space is not supressed -- to read the next non- blank character, use "%1s". If a field width is given the corresponding argument is a pointer to a vector of characters and the indicated number of characters are read. e A floating-point number is converted and f appropriately. g capitalized, or stored If the format indicator is preceeded by 'l', a doubleprecision floating-point number will be stored. The floating-point format is the same as in the C language: of an optionally signed string C Compiler and Library Page 5-181 scanf Formatted input conversion digits possibly containing a decimal point, followed by an optional exponent field which consists of an 'E' or 'e' followed by an optionally signed integer. [ ] A string not to be delimited by white- space characters. Unless the first character is '^', the format constitutes an acceptance list: input field is all characters until the character which the brackets. Note the first is not in set within that leading whitespace is not ignored. If the first character after the left bracket is '^', the format defines a stop list: the field the input is all characters until first character specified within the bracketed string. The corresponding argument points to a character vector. The result will be null-terminated. Scanf() returns the number of successfully matched and assigned input items. If the end of input was reached, EOF (-1) is returned. For example: main() { register int int char c; i; text[10]; c = scanf("%d%9s", &i, &text); printf("i = %d, text = %s\n", i, text); } If the input line is "150 foobar", the program will print: i = 150, text = foobar Diagnostics Scanf() returns -1 if an end of file (end of string) condition exists and no data was stored. It returns - 2 if a palpably is encountered. Bugs incorrect format, such as "%" C Compiler and Library Page 5-182 screen 5.148 Screen I/O Primitives Screen I/O Primitives ______ ___ __________ ********** * screen * ********** File name: screen.mac Usage scdown() /* Roll screen down */ scerln(line, column) /* Erase to end of line */ int line; /* Line number */ int column; /* Column number */ scerpg(line, column) /* Erase to end of page */ int line; /* Line number */ int column; /* Column number */ char * scget(buff, size, text) char int char *buff; size; *text; int sclmargin(lmarg) int lmarg; /* /* /* /* Prompt and read Returned text Buffer size Optional prompt */ */ */ */ /* Set left margin /* New left margin */ */ scout(line, column, text) /* int line; /* int column; /* char *text; /* scput(oldbf) Write text to screen */ Line number */ Column number */ Text to write */ /* Reset buffer mode */ char *oldbf; /* Previous buffer */ int scset(newbf, size, old) char /* Set buffer mode *newbf; /* New buffer */ */ C Compiler and Library Page 5-183 screen Screen I/O Primitives char char size; **old; /* Size of new buffer */ /* Previous buffer save */ int scsettype(type) int type; /* Force terminal type /* Terminal type int sctype() /* Return terminal type */ */ */ Description Based on the "terminal independent screen procedures" in the VAX/VMS runtime library, these routines provide an efficient, operating-system independent, interface to (DIGITAL) video terminals. VT52 VT100 (ANSI) They work correctly with and terminals and do nothing disasterous if the terminal is not a video terminal. Note that they only work with the user's console (stderr) terminal. The following definitions should be noted: line The line on the screen to which the cursor is to be moved. The top of the screen is line one. If line is less than or equal to zero, the cursor does not move. column The column to which the cursor is to be moved. the This value will be offset by left-margin value (if one is set). The default left-hand margin is column one. If column (after offsetting) is less than or equal to zero, the cursor does not move. text A null-terminated string to be output. If text equals NULL, nothing is output and internal buffers are flushed. The routines are designed to operate in a buffered mode, allowing the program to format an entire screen of information and present this data with one call to the monitor-level I/O service. This is particularily efficient on multi-user or networked systems. The routines scput() and scset() establish and release buffer mode. Buffers can be chained together, allowing a subroutine to establish a buffer independently of its callers. long. Each buffer must be at least 12 bytes C Compiler and Library Page 5-184 screen Screen I/O Primitives Longer buffers are more efficient. Although multiple buffers can be established, only one is active at any particular time. If a call to scset() establishes a new buffer, the contents of the previous buffer are copied to the new buffer and the previous buffer is set empty. If scput() releases a buffer, its contents are copied to any higher-level buffer. The first call to any routine determines the terminal type. Note that on native RT11, if the screen handler decides that the terminal may be a scope, it will send an "identify" request "<ESC>/Z" to determine whether it is a VT52 or VT100. If the screen routine decides that the terminal is not a scope, cursor move operations are ignored and text is output to "stderr". If the screen handler decides that the terminal is a VT100, the "Enter ANSI mode" escape sequence will be sent to the terminal. Similarily, if the terminal is thought to be a VT52, the "Enter VT52 emulation mode" sequence will be sent. The screen handler will not record the current mode for subsequent resetting. Screen output will be to the "stderr" device (explicitly the console terminal). Input will be from the "stdin" device. If a local buffer has been established, the screen directly, handler calls operating system service bypassing the "standard" I/O library. This means that output formatting should use sprintf() to format a buffer which user is subsequently output using scout(). Furthermore, the newline '\n' character will not be expanded to a "carriage return/line feed" sequence. It is thus highly recommended that the user program perform all formatting by passing appropriate row and column values to scout(). The following routines are defined: scdown() The cursor is moved up one line on the screen. If the cursor was already at the top line on the screen, all lines are moved down one line, the top line is replaced with a blank, and the data that was on the bottom line is lost. (VMS Lib$Down_Scroll) scerln(line, column) Erase the screen from the indicated (or current) cursor position to (VMS Lib$Erase_Line) the end of the current line. C Compiler and Library Page 5-185 screen Screen I/O Primitives scerpg(line, column) Erase the screen from the indicated (or current) cursor position to the end of the screen. (VMS Lib$Erase_Page) scget(buff, size, text) Output the prompt text, if given, then flush any buffered text. Read text input by the terminal user (from stdin) to the buffer. Scget() returns NULL on end of file or error. (Scget calls fgetss() to perform the read.) (VMS Lib$Get_Screen) Programs using scget() to read from the keyboard should not use the input redirection capabilities of the C library. sclmargin(lmarg) Define a new left margin (if lmarg is greater than zero). Sclmargin() returns the old lmarg value. After calling sclmargin(), an output request to column and column one will be written to column lmarg. scout(line, column, text) Move the cursor to the indicated line and output the text. If line or column are less than or equal to zero, the cursor is not moved. If buffers are text is equal to NULL, the internal flushed (possibly after cursor movement). (VMS Lib$Put_Screen) scput(oldbf) Scput() terminates reverts to the current buffering mode and the previous mode as specified in the parameter. If oldbuf is NULL, buffering is terminated and the current buffer is flushed to the screen. If oldbuf is not zero, it is taken as the location of a previous buffer (established by calling scset()) and the current buffer is copied into the previous buffer. The previous buffer is then made current. (VMS Lib$Put_Buffer) scset(newbf, size, old) Scset() establishes a new buffer for the screen routines. Newbf is a character array whose size is given in parameter size (Size must be at least 12 bytes.) Old is the address of a word which will be set to the previous buffer (if any). a This is used for C Compiler and Library Page 5-186 screen Screen I/O Primitives subsequent call to scput(). Scset returns zero if correct, returning -1 if size was less than 12 bytes. (VMS Lib$Set_Buffer). A larger buffer will generally yield a more efficient program as the number of operating system requests will be minimized. For example, for a typeout program, a buffer size of 800 bytes might well be used. scsettype(type) This routine sets the terminal type, overriding the definition supplied by the operating system. scsettype() returns what it thought the type was (as if sctype were called). The type must be one of the following values: 0 65 97 If type has Not a video terminal VT52 or VT100 in VT52 mode VT100 in ANSI mode some other value, scsettype() not change the type. sctype() This routine returns the terminal type. following types are defined: 0 1 1+64 1+96 Not a video terminal Unknown video terminal VT52 VT100 type The does Note: On intitialization, a VT100 will be forced into VT52 or VT100 mode depending on the determined type. VT100-type terminals include newer terminals such as the VT125. It is not clear whether the algorithm used is correct for terminals developed since these routines were written. Note the following normal use of scset() and scput() char char **oldbuf; mybuf[100]; main() { /* * Setup */ scset(mybuf, sizeof mybuf, &oldbuf); C Compiler and Library Page 5-187 screen Screen I/O Primitives /* * Usage */ scout(1, 1, "Stuff"); /* * Termination (force out last buffer) */ scout(0, 0, NULL); scput(oldbuf); } Bugs These routines are fairly inefficient if no buffer is supplied. Determining the terminal type turns out to be a somewhat painful process which is different for the various operating systems: On native RSX-11M and VMS compatibility mode, the QIO "get multiple characteristics function" is executed. If the terminal is a scope and can generate escape sequences, it is assumed to be a VT100, otherwise, if it is a scope, it is assumed to be a VT52. On all RSTS/E systems, the executive "get terminal characteristics" request is executed, the determination proceeding as above. On native RT11 systems, a peek sequence described in the RT11 Software Support manual is used to determine whether the terminal is a scope. (This may not work on the request XM monitor.) If so, an "<ESC>/Z" is sent to identification and various tests are made on the returned text. Note that, if the terminal does not reply to the inquiry, the program will hang. These tests are valid for VT52 and VT100 terminals only. You will have to modify this routine if you have anything else (including a VT125). On RSX-11M systems (even emulated), if a local buffer is established by calling scset(), output will be done using the IO.WAL QIO function. While based on the VMS Run-time library screen I/O primitives, there are a few differences that may be of interest: The VMS library standard assumes that subroutines generally return a status code, permit missing parameters, and return error codes presented on being C Compiler and Library Page 5-188 screen Screen I/O Primitives with invalid arguments. The routines described here do nothing when arguments are out of range. Also, there are no optional arguments (optionality is provided for by specifing zero or NULL argument values). Where appropriate, arguments have been ordered "line_no, col_no, other". A more significant difference is that the VMS library writes to the standard output device (SYS$OUTPUT: or TT:) while these routines write to the user's terminal (SYS$ERROR standard input. or CO:). scget() reads from the C Compiler and Library Page 5-189 setcc Trap Control/C (RSTS/E RT11 mode only) 5.149 Trap Control/C (RSTS/E RT11 mode only) ____ _________ _______ ____ ____ _____ ********* * setcc * ********* File name: setcc.mac Usage setcc(function); extern int function(); Description The function is defined as a CTRL/C trap routine. Executing setcc(0) disables CTRL/C trapping. Note: If the routine is reentered (because typed during CTRL/C was the execution of function()), the program aborts. Bugs Runs on RSTS/E RT11 mode only. C Compiler and Library Page 5-190 setjmp 5.150 Execute non-local goto Execute non-local goto _______ _________ ____ ********** * setjmp * ********** File name: setjmp.mac Usage #include <setjmp.h> setjmp(env); jmp_buf env; longjmp(env, val) jmp_buf env; int val; /* Static save buffer */ /* Was set by setjmp /* Value to return */ */ Description: These routines are useful for dealing with errors and interrupts encountered in a low-level subroutine of a program. Setjmp() saves its stack environment in env for later use by unwind(). It returns 0. Longjmp(env) restores the environment saved by the last call of setjmp(env). It then returns in such a way that execution continues as if the call of setjmp() had just returned. All accessible data have values as of the time setjmp() was called. The return from setexit() will have the specified value. For example: #include <setjmp.h> jmp_buf env; ... main() { ... if (setjmp(&env) != 0) { err_exit(); /* Longjmp called } else { process(); /* Setjmp called } ... process() { ... */ */ C Compiler and Library Page 5-191 setjmp Execute non-local goto longjmp(&env); The routine that called setjmp() must active when longjmp() is called. Bugs still be C Compiler and Library Page 5-192 sleep Delay job a given number of seconds 5.151 Delay job a given number of seconds _____ ___ _ _____ ______ __ _______ ********* * sleep * ********* File name: sleep.mac Usage sleep(delay); int delay; Description Sleep a specified number of seconds. Bugs On RSTS/E, the reader should refer to the description of SLEEP() in the operating system documentation. On native RSX-11M or RSX emulated by VMS, sleep() executes a mark-time (MRKT$) and wait sequence, using event flag 1. On native RT11, sleep() executes executive request. Sleep flushes stdout and stderr. a .TWAIT C Compiler and Library Page 5-193 sprintf Formatted Numeric Conversion 5.152 Formatted Numeric Conversion _______ __________ _________ *********** * sprintf * *********** File name: sprint.mac Usage char * sprintf(buffer, format, arg1, ...); char *buffer; char *format; Description sprintf() converts and formats its arguments, writing the result to the indicated string buffer. For information on formatting, please refer to the description of printf. sprintf() returns a pointer to the EOS byte at the end of the output buffer. Note, however, that this feature is not transportable to other C implementations. Bugs C Compiler and Library Page 5-194 sscanf Formatted input conversion 5.153 Formatted input conversion _____ __________ _________ ********** * sscanf * ********** File name: sscanf.mac Usage sscanf(buf, fmt, pointer(s)) char *buf; /* Output buffer char *fmt; /* Format string */ */ Description sscanf() parses the input string, in buf, according to the indicated format descriptor, storing the results the pointer in arguments. It returns the number of successfully assigned input items. See the description of scanf() for further documentation. Diagnostics Sscanf() returns -1 if the end of the input string was detected and no data was stored. It returns -2 if a palpably incorrect format, such as "%" is encountered. Bugs C Compiler and Library Page 5-195 strcat 5.154 String Concatenate String Concatenate ______ ___________ ********** * strcat * ********** File name: strcat.mac Usage char * strcat(out, in); char *out; char *in; Description Append "in" to "out". Bugs Return out. C Compiler and Library Page 5-196 strchr Find First Instance of a Character in a String 5.155 Find First Instance of a Character in a String ____ _____ ________ __ _ _________ __ _ ______ ********** * strchr * ********** File name: strchr.mac Usage char * strchr(stng, chr) char *stng; char chr; /* String to search in /* Byte to search for */ */ Description If chr is in stng, return a pointer to it. If not, return NULL. strchr(NULL, anything) returns NULL. See also index(). Bugs C Compiler and Library Page 5-197 strcmp 5.156 String Compare String Compare ______ _______ ********** * strcmp * ********** File name: strcmp.mac Usage int strcmp(s1, s2); char *s1; char *s2; Description Compare two strings, returning -1 if s1 < s2 0 if s1 == s2 +1 if s1 > s2 Bugs C Compiler and Library Page 5-198 strcpy 5.157 String copy String copy ______ ____ ********** * strcpy * ********** File name: strcpy.mac Usage char * strcpy(out, in); char *out; char *in; Description Copy "in" to "out". Return out. Bugs It might be more useful if it returned out + strlen(in). (See cpystr()). C Compiler and Library Page 5-199 streq 5.158 String Equality Test String Equality Test ______ ________ ____ ********* * streq * ********* File name: streq.mac Usage streq(a, b); char char *a; *b; Description Return TRUE if the strings are equal. Bugs C Compiler and Library Page 5-200 strlen 5.159 String length String length ______ ______ ********** * strlen * ********** File name: strlen.mac Usage int strlen(s); char *s; Description Return the length of the argument string. Bugs C Compiler and Library Page 5-201 strncat String Concatenate 5.160 String Concatenate ______ ___________ *********** * strncat * *********** File name: strnca.mac Usage char * strncat(out, in, count); char *out; char *in; unsigned int count; Description Append "in" to "out". Return out. At most, "count" bytes are moved from in. not include the trailing null. Bugs Note that "count" does C Compiler and Library Page 5-202 strncmp String Compare With Count 5.161 String Compare With Count ______ _______ ____ _____ *********** * strncmp * *********** File name: strncm.mac Usage int strncmp(s1, s2, char char unsigned int count); *s1; *s2; count; Description Compare at most count strings, returning: -1 if s1 < s2 0 if s1 == s2 +1 if s1 > s2 Bugs bytes between two C Compiler and Library Page 5-203 strncpy String Copy With Count 5.162 String Copy With Count ______ ____ ____ _____ *********** * strncpy * *********** File name: strncp.mac Usage char * strncpy(out, in, count); char *out; char *in; unsigned int count; Description Copy "in" to "out". Return out. At most, "count" bytes are moved from in. Note that "count" includes the trailing null. If strlen(in) is less than count, "out" is null-filled. If strlen(in) is greater than count, the buffer will not be null-trailed. Bugs output C Compiler and Library Page 5-204 strneq String Equality Test With Count 5.163 String Equality Test With Count ________ ____ ____ _____ ______ ********** * strneq * ********** File name: strneq.mac Usage int strneq(s1, s2, count); char *s1; char *s2; unsigned int count; Description Compare at most count bytes between two strings, returning TRUE if the the strings are equal. Bugs C Compiler and Library Page 5-205 strrchr Find Last Instance of a Character in a String 5.164 Find Last Instance of a Character in a String ____ ____ ________ __ _ _________ __ _ ______ *********** * strrchr * *********** File name: strrch.mac Usage char * strrchr(stng, chr) char *stng; char chr; /* String to search in /* Byte to search for */ */ Description If chr is in stng, return a pointer to the last (rightmost) occurrance of it. If not, return NULL. strchr(NULL, chr) returns NULL. Bugs C Compiler and Library Page 5-206 swabb Byte swap (argument is a buffer pointer) 5.165 Byte swap (argument is a buffer pointer) ____ ____ _________ __ _ ______ ________ ********* * swabb * ********* File name: swabb.mac Usage swabb(buffer); char *buffer; Description: Return buffer[0] and buffer[1] as a byte- swapped integer. Buffer or word boundary. Bugs need not be on any particular byte C Compiler and Library Page 5-207 swabi Byte swap, (argument is an integer) 5.166 Byte swap, (argument is an integer) _____ _________ __ __ ________ ********* * swabi * ********* File name: swabi.mac Usage swabi(value); int value; Description Return value byte-swab'ed. Bugs ____ C Compiler and Library Page 5-208 time 5.167 Compute time of day Compute time of day _______ ____ __ ___ ******** * time * ******** File name: time.mac Usage long time(0); long time(tloc); long *tloc; Internal call $$time Description time returns the time of day in seconds. If tloc is non-null, the return value is also stored in the place to which tloc points. The value is the time since midnite, Jan 1, 1970, measured in seconds. Internal $$time is called by time and ftime. It returns the time value in registers r0 and r1, and the number of ticks in the current second in r2. R3 and r4 are modified. On RSX, $$time refreshes $$tick. Bugs The Unix time function returns GMT. This function returns local time. The leap year algorithm is only accurate in the range 1970 <= year < 2100 C Compiler and Library Page 5-209 toascii Convert to 7-bit Ascii 5.168 Convert to 7-bit Ascii _____ *********** * toascii * *********** File name: toasci.mac Usage toascii(c); int c; Description Remove the parity bit from c. Bugs _______ __ _____ C Compiler and Library Page 5-210 tod 5.169 Compute time of day Compute time of day _______ ____ __ ___ ******* * tod * ******* File name: tod.mac Usage long tod(0); long tod(tloc); long *tloc; Description tod() returns the time of day in seconds. If tloc is non-null, the return value is also stored in the place to which tloc points. tod() is fairly fast. time() computes the time" but is much slower and larger. Bugs "Unix C Compiler and Library Page 5-211 tolower Convert upper-case to lower-case 5.170 Convert upper-case to lower-case __________ __ __________ _______ *********** * tolower * *********** File name: tolowe.mac Usage tolower(c); int c; Description If c is a upper-case alphabetic, return it's case equivalent. Bugs Otherwise, return c. lower- C Compiler and Library Page 5-212 toupper Convert lower-case alphabetic to upper-case 5.171 Convert lower-case alphabetic to upper-case _______ __________ __________ __ __________ *********** * toupper * *********** File name: touppe.mac Usage toupper(c); int c; Description If c is a lower-case alphabetic, return it's case equivalent. Bugs Otherwise, return c. upper- C Compiler and Library Page 5-213 trace Profile support entry module (with trace) 5.172 Profile support entry module (with trace) _______ _______ _____ ______ _____ ______ ********* * trace * ********* File name: pcsv.mac Usage #include <stdio.h> extern FILE *$$flow; $$flow = fopen("trace.out", "w"); /* or $$flow = stderr; to trace to the console ... $$flow = NULL; /* Turn off flow trace */ */ Internal jsr .word r5,pcsv$ name ; Pointer to name Where name has the structure: name: .word .asciz 0 /name/ ; Counter ; function name This module is called whenever Description a function that was compiled with the profile option is executed. It that the stack will remain when checks above 600 octal the function executes and optionally prints a flow-trace. If $$flow is set to function a file descriptor, the name, location the function is called from, and the calling environment, are printed on each call to a function compiled with the profile option. The output format is: function_name<TAB>caller<TAB>environment Where function_name is the name of the function being called, caller is the address of the calling program (actually, the return address), and environment is the R5 the argument pointer (for local addressing within C Compiler and Library Page 5-214 trace Profile support entry module (with trace) routine being called). The information will be written to $$flow with a newline before and after. If profiling has been enabled and the program exits via error() or via illegal memory an operating-system trap (such as an reference), a register dump and subroutine trace will be written to stderr. See the description of calltrace() for details. Internal See csv$ for details of the calling environment. When this routine is entered for the first time, it sets up to intercept synchronous system traps, and loads the error exit address and profile pointer. The trap service routines are in the "traps" module. the description there for more information. Bugs See C Compiler and Library Page 5-215 traps Operating system trap handlers 5.173 Operating system trap handlers ______ ____ ________ _________ ********* * traps * ********* File name: traps.mac Usage Internal $$sstt:: ; RSX synchronous trap ; vector $$t410:: ; RT11 Entry after traps ; to vectors 4 and 10 Description This module contains code which is executed after a synchronous trap is detected by the operating system. All such traps are regarded as fatal errors and the program will be terminated. This code is enabled by executing any function, such as main(), for which profiling was enabled when the function was compiled. The following traps are processed: Illegal memory reference (trap through vector 4) Illegal instruction (trap through vector 10) BPT (assuming a debugging aid is not present) IOT Illegal TRAP (this may be a Fortran error) Illegal EMT (RSX only) Floating point exception (RSX only) Memory management violation Before exiting to the operating system, the registers at the time the trap occurred will be written, in octal, to stdout. Note also that a calling sequence traceback will be written to stdout by error(). If a trap occurred, the program will exit the operating system with a "severe error" status. Note that some errors, such as stack overflow or random to C Compiler and Library Page 5-216 traps Operating system trap handlers jumps into the operating system, may cause the C program to be terminated without the C library regaining control. Internal The first call to pcsv$ will initialze trapping. On RSX11-M, the SVTK$ executive service will be called. On RT11, the .tprset monitor request will be executed. As .trpset only traps illegal memory reference (trap to 4) and illegal instruction (trap to 10), the other interesting vectors are initialized by absolute references (.ASECT). Diagnostics Bugs Internal Don't forget it's implemented. to handle floating-point when C Compiler and Library Page 5-217 ungetc Push back a character onto an input file 5.174 Push back a character onto an input file ____ ____ _ _________ ____ __ _____ ____ ********** * ungetc * ********** File name: ungetc.mac Usage ungetc(c, iop); char c; FILE *iop; Description Push one character back on the indicated stream. Bugs C Compiler and Library Page 5-218 unwind 5.175 Execute non-local goto Execute non-local goto _______ _________ ____ ********** * unwind * ********** File name: unwind.mac Usage setexit(); unwind(); Description: These routines are useful for dealing with errors and interrupts encountered in a low-level subroutine of a program. setexit() saves its stack environment in a static place for later use by unwind(). It returns 0. Unwind() restores the environment saved by the last call of setexit(). It then returns in such a way that execution continues as if the call of setexit() had just returned. All accessible data have values as of the time unwind() was called. The return from setexit() will have the value 1. For example: if (setexit()) { /* Unwind called } else { */ /* Setexit setup called */ } The routine that called setexit() must still active when unwind() is called. Bugs Obsolete -- use setjmp/longjmp instead. be C Compiler and Library Page 5-219 wdleng Expensive way to say sizeof(int) 5.176 Expensive way to say sizeof(int) _________ ___ __ ___ ___________ ********** * wdleng * ********** File name: wdleng.mac Usage wdleng() Description Return word length in bits. Bugs Assuming 8-bit bytes, this may be replaced by: #define wdleng() (sizeof (int) * 8) C Compiler and Library Page 5-220 wrapup Dummy routine called on exit 5.177 Dummy routine called on exit _______ ______ __ ____ _____ ********** * wrapup * ********** File name: wrapup.mac Usage wrapup() Description This routine (which does nothing) is called on exit if the user's program does not provide a wrapup() routine. Wrapup will be called only once. Bugs C Compiler and Library Page 5-221 zero 5.178 Clear a block of memory Clear a block of memory _____ _ _____ __ ______ ******** * zero * ******** File name: zero.mac Usage zero(addr, nbytes); char *addr; unsigned int nbytes; Description: Clear the block of core. Bugs No value is returned. CHAPTER 6 LIBRARY HEADER FILES This chapter contains descriptions of the standard header files that are used by C programs and libraries. In addition, descriptions of internal routines are provided. These files are included in your a pre-processor command of the form: #include <filename.h> program source by C Compiler and Library Page 6-2 ctype Character test macros and global definitions 6.1 Character test macros and global definitions _________ ____ ______ ___ ______ ___________ ********* * ctype * ********* File name: NAME: ctype.h ctype -- Character test macros and global definitions SYNOPSIS: #include <ctype.h> DESCRIPTION: This module defines a set of character test and manipulation macros (or, on Decus C, functions) that allow classification and modification of Ascii characters. If the C compiler supports macros with arguments, the following are defined: isupper(c) islower(c) isalpha(c) isdigit(c) isalnum(c) isxdigit(c) isspace(c) ispunct(c) isgraph(c) isprint(c) iscntrl(c) isascii(c) _toupper(c) _tolower(c) toascii(c) /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* Upper case alphabetic Lower case alphabetic Alphabetic in any case Decimal digit Alphabetic or digit Hexadecimal digit Space or tab Punctuation Visible character Printable character Control character 7-bit Ascii character Lower case convert to Upper Upper case convert to Lower Remove eighth (parity) bit */ */ */ */ */ */ */ */ */ */ */ */ */ */ */ Note that _toupper() and _tolower() must not be used with arguments that have side effects, such as _toupper(*ptr++); Use the functions toupper() and tolower() instead. BUGS: C Compiler and Library Page 6-3 fps Bit definitions for the floating point status word 6.2 Bit definitions for the floating point status word ___ ___________ ___ ___ ________ _____ ______ ____ ******* * fps * ******* File name: NAME: fps.h fps -- Bit definitions for the floating point status word SYNOPSIS: #include <fps.h> DESCRIPTION: This module defines common definitions for the FP- 11 floating point status word. FER FID FIUV FIU FIV FIC FD FL FT FN FZ FV FC 0100000 0040000 0004000 0002000 0001000 0000400 0000200 0000100 0000040 0000010 0000004 0000002 0000001 The following are defined: Floating error (sense/reset) Disable all interrupts Interrupt on undefined variable Interrupt on underflow Interrupt on overflow Interrupt on int. conv. error Double precision mode Long integer mode Chop mode Floating negative (sense) Floating zero (sense) Floating overflow (sense) Floating carry (sense) C Compiler and Library Page 6-4 initial Specify Initializers and Finalizers 6.3 Specify Initializers and Finalizers ____________ ___ __________ _______ *********** * initial * *********** File name: NAME: initia.h initial -- Specify Initializers and Finalizers SYNOPSIS: #include <initia.h> INITIAL { initial-code-block }; FINAL { final-code-block }; DESCRIPTION: The macros defined in this module provide a facility for module-specific initialization and finalization code. The code in the initial-code-block is called as a normal C function before main() is called; the final-code-block is called on exit, just after wrapup(). Neither call passes any arguments. Any number of modules in an image may independently declare initializers or finalizers; all of them will be called at startup or exit. to However, it is impossible predict what order the calls will be made in, and programs should not rely on any particular ordering. A typical use of initializers and finalizers is the following: Suppose you have a package that supports access to some on-disk data base; a user of the package will call a lookup and an update function. The file containing the data base must be opened before any operations on it can take place, and it should be closed when the program is finished. (Assume that the package maintains some sort of resident buffer which it must flush.) There are two conventional approaches to solving this problem: Have the lookup and update functions check the file on each call, and open it if necessary which small could be quite expensive if they are very C Compiler and Library Page 6-5 initial Specify Initializers and Finalizers functions, and in any case does not solve the problem of properly closing the file - or have the main program call an initialization and finalization function at the proper time. The problem with this latter approach is lack of modularity - the main program ought not to have to know that the module needs initialization or finalization. The solution using these macros is straightforward. The defining module includes the calls: INITIAL { open-the-data-base }; FINAL { flush-buffers-and-close-the-data-base }; The wrapup() function is treated like a built- in finalizer; however, it is guaranteed to execute before any other finalizers. (The module defining wrapup() may declare an initializer or finalizer if it wishes; it will be treated just like all other initializers and finalizers.) If any finalizer (or wrapup()) calls exit(), the program exits immediately. Notes: Using INITIAL will declare a static function named $init$(), and a (char *) named $init_; similarly, FINAL will declare $finl$() and $finl_. Also, both INITIAL C and FINAL generate dsect commands. Since provides no way to "remember" the current dsect, both macros issue a dsect "" command when they are done, restoring the C default dsect. While it is a poor idea to write code that depends on the order in which initializers and finalizers are executed, this can be useful information to have for debugging. Execution is always in the order that the modules involved were examined by the task builder or linker. When the modules are named explicitly, this will just be the order in which they were named. When the modules come from a library, it will be extremely difficult to predict the order in which they will be extracted and linked in. Warning: While initializers and finalizers provide some modularity to package initialization and finalization, they are not a panacea. For example, if package A calls routines in package B from within its initializers, and package B also declares initializers, the correct functioning of a program that includes both - hence, of any program using package A - will be problematical. C Compiler and Library Page 6-6 initial Specify Initializers and Finalizers INTERNAL: The macros operate by leaving a list of (pointers to) functions to be called in psects $INIT$ and $FINL$. In order to be able to determine the beginning and end of these psects, the psects $INIT, $FINL, $INIT., and $FINL., are also reserved. These psects must not actually contain any data; they exist solely to provide well-defined endpoints to the The names initialization and finalization list. are consecutive in alphabetical sequence, so the Task Builder will place them in order. The RT11 Linker, however - and the Task Builder with the /SQ switch - place psects in the order they are encountered. Since it impossible to predict what order the various modules will be seen by the linking program, it is essential that EVERY module that refers to any of these psects refer to the two related ones as well, and in the correct order. BUGS: Requires the DECUS C dsect commands; hence, very non-portable. It may functionality using be possible to provide the same different techniques; not, what's wrong with your implementation? AUTHOR: Jerry Leichter if C Compiler and Library Page 6-7 rtime Define time buffer structure for $$rtime() 6.4 Define time buffer structure for $$rtime() ______ ____ ______ _________ ___ _________ ********* * rtime * ********* File name: NAME: rtime.h rtime -- Define time buffer structure for $$rtime() SYNOPSIS: #include <rtime.h> ... struct TIME buffer; DESCRIPTION: This header file defines the structure of the time buffer used by the standard library $$rtime() function (which is unique to Decus C). It is defined as follows: struct TIME { int int int int int int int int }; year; month; day; hour; minute; second; tick; tsec; G.TIYR G.TIMO G.TIDA G.TIHR G.TIMI G.TISC G.TICT G.TICP year - 1900 Jan. = 1 00 .. 23 00 .. 59 00 .. 59 00 .. tsec-1 tick/second BUGS: Oboslete, use time() and localtime() instead. C Compiler and Library Page 6-8 setjmp Define buffer for setjump() and longjump() 6.5 Define buffer for setjump() and longjump() ______ ______ ___ _________ ___ __________ ********** * setjmp * ********** File name: NAME: setjmp.h setjmp -- Define buffer for setjump() and longjump() SYNOPSIS: #include <setjmp.h> DESCRIPTION: This defines the jmp_buf array that the setjmp() and longjmp() functions. BUGS: is used for C Compiler and Library Page 6-9 stdio Definitions for standard i/o library 6.6 Definitions for standard i/o library ___________ ___ ________ ___ _______ ********* * stdio * ********* File name: NAME: stdio.h stdio -- Definitions for standard i/o library SYNOPSIS: #include <stdio.h> DESCRIPTION: <stdio.h> should be included in the assembly of all C programs that use the standard i/o library (fopen(), getc(), printf(), etc.) It defines the following: FILE The i/o routines use and return pointers to objects of this type. NULL I/O routines signal "rejection" by returning a null pointer. EOF The get character routine returns this value to signal end of file. TRUE The value 1. FALSE The value 0. EOS The "end of string" marker: '\0'. IO_SUCCESS Normal exit to operating system. IO_WARNING "Warning error" exit to operating system. IO_ERROR "Error" exit to operating system. IO_FATAL "Severe error" exit to operating system. stdin The "standard" input file. Normally the user's terminal; it may be redirected. C Compiler and Library Page 6-10 stdio Definitions for standard i/o library stdout The "standard" output file. Normally the user's terminal; it may be redirected. stderr The "error" output file. to the user's terminal. It will always write DIFFERENCES FROM UNIX: FILE is defined as a "typedef struc", rather than a #define. The i/o structure is considerably different from Unix. It is, however, arranged so that reasonable compatibility may be attained. Specifically, things which have the same name are used for the same purpose, and located in the same place within the I/O structure. ACCESSING THE FDB ON RSX MODES: The FDB (file data block) is the primary means of communication between the C I/O library and the RSX file control services modules. It contains file and record format information as well as pointers and counters for accessing data in the file. It is highly recommended that you do not access this information directly. Should you need to do so, the following may be done: extern char *F_RTYP; /* F.RTYP (char) in fdb */ extern char *F_SEQN; /* F.SEQN (int) in fdb */ ... fd = fopen("file.nam", "r"); /* * Set rtyp to the record type, stored as a * byte at offset F.RTYP */ rtyp = fd->io_fdb[(int) &F_RTYP] & 0377; /* * set seqn to the sequence number (printfile * fixed header), stored as an integer at * offset F.SEQN. */ seqn = *((int *) &fd->io_fdb[(int) &F_SEQN]); The somewhat messy use of casts and addressing allows the program to use the value of F.xxx stored in the RSX system library. BUGS: TRUE, FALSE, and EOS are not present in <stdio.h> on some other C systems. If you compile with the /r switch (-r on RSX modes) or #define rsts before #include <stdio.h>, a native RSTS/E I/O vector will be defined which fully supported nor fully implemented. is neither C Compiler and Library Page 6-11 time Define time buffer structure for localtime() 6.7 Define time buffer structure for localtime() ______ ____ ______ _________ ___ ___________ ******** * time * ******** File name: NAME: time.h time -- Define time buffer structure for localtime() SYNOPSIS: #include <time.h> ... extern struct tm *localtime(); DESCRIPTION: This header file defines the structure of the time buffer used by the standard library localtime() function. It is defined as follows: struct tm { int tm_sec; int tm_min; int tm_hour; int tm_mday; int tm_mon; int tm_year; int tm_wday; int tm_yday; int tm_isdst; }; /* /* /* /* /* /* /* /* /* Seconds Minutes Hours Day in month Month Year Weekday Days since Jan 1 Daylight Savings = 1 */ */ */ */ */ */ */ */ */ extern struct tm *localtime(); BUGS: Unix V7 changed the tm_isday to tm_isdst. Thanks guys. C Compiler and Library Page 6-12 timeb Define timeb buffer structure for ftime() 6.8 Define timeb buffer structure for ftime() ______ _____ ______ _________ ___ _______ ********* * timeb * ********* File name: NAME: timeb.h timeb -- Define timeb buffer structure for ftime() SYNOPSIS: #include <timeb.h> ... extern long ftime(); DESCRIPTION: This header file defines the structure of the timeb buffer used by the standard library ftime() function. It is defined as follows: struct timeb { long unsigned short short }; time; milltim; timezone; dstflag; The time value is identical to the value returned by the time() function. Milltim is the number of milliseconds in the current second. Timezone indicates the number minutes the of past GMT in current time zone (zero for Decus C) and dstflag is set if Daylight Savings Time is in effect. APPENDIX A IMPLEMENTATION A.1 Overview ________ This document describes the Decus C distribution and discusses its implementation on RSTS/E, RSX-11M, RT-11, and VAX/VMS. A.2 Distribution ____________ NOTE The following is in a state of change. strategy is to have several kits: The most likely 1. VMS backup format at 1600 bpi built on a VMS V3.2 system. This will contain both source and compiled images. 2. DOS (FLX) format (source only) on two 1200 foot magtapes at 800 or 1600 bpi. This will contain source files only. 3. RT11 RL02 disk containing a built system and sources stored in "archive" format. 4. RT11 RX01 disk containing built images sources. Suggestions for improvements are welcome. only -- no The master source tape (DOS FLX) was generated on a VAX/VMS system. All files contain readable Ascii text. All executable images were generated by supplied command files. The compiler and run-time library, accounts [5,1] through [5,7], comprise a compiler and run-time system for the C language. The compiler was written by David G. Martin Conroy, and modified by C Compiler and Library Page A-2 Getting on the Air with Decus C Minow, Robert B. Denny, Clifford Geshke, and several others. The run-time libraries for RSX-11M and RT-11 were written by Martin Minow with help from many friends. In addition, there are several executive interface libraries: one for RSX-11M by Robert B. Denny, one for RSTS/E by Jim Burrows, and one for Vax/VMS (for interface with Vax-11 C) by Martin Minow. There is also a portable math library by Fred Fish. The program library, accounts [6,1] through [6,7], offers a collection of tools, games, and other programs, mostly written in C. They are not needed for installation of the compiler (although several programs in the tools account, such as KWIK, are used to build the documentation.) In general, you should be aware that only the tools in [6,1] are tested. The distribution account numbers were originally chosen so as to be identical under RSX-11M (octal) and RSTS/E (decimal). If the C language system is not stored in the above accounts, the implementor on RSTS/E will have to edit command files to define the proper accounts. The GETCMD and BUILD programs be useful in this regard. [5,1] [5,2] [5,3] [5,4] [5,5] [5,6] [5,7] Command procedures, documentation source, etc. Documentation. Compiler and assembler source. Common (non-I/O) library source. I/O library source and command files. Native RSTS/E interface library. Native RSX-11M interface library. [6,1] "Software tools." [6,2] Miscellaneous programs -- games and stuff. may [6,3] [6,4] [6,5] [6,6] [6,7] Cross-assemblers for several micro-computers. Lexical analyser generator. Pieces of a standard library in C Useful subroutines in C. Vax/VMS interface library. The two-tape distribution contains accounts [5,*] on one (full) tape and accounts [6,*] on the second (2/3 full) tape. Each account contains a file named contents For README.nnn describing the of the account. in account [5,1] is named README.501. example, the README file C Compiler and Library Page A-3 Getting on the Air with Decus C A.3 ___________ Command File Conventions _______ ____ Command files used to build the C compiler and run-time library follow the following standard: V????? VAX/VMS indirect command file X????? RSX-11M file for the RSTS/E RSX emulator R????? RT-11 M????? RSX-11M indirect command file T????? RT-11 indirect command file .CMD RSTS/E indirect file for the RSTS/E RT-11 emulator command files, RSX-11M indirect command files, and indirect command files for MAC.TSK and MACRO.SAV. .COM RT-11 or VMS indirect command files .TKB Task-builder indirect command files .ODL Task-builder overlay descriptor commands .EIS [RT11.EIS only] hardware EIS configuration Command files used to build tools and C-language libraries follow the following convention: VN???? Use the native Vax-11C compiler only. VX???? Use Decus-C (RSX compatibilitye) on Vax/VMS. VB???? Use either, selecting the command invocation. RX???? RSTS/E RSX-11M emulation mode. RT???? RSTS/E RT-11 emulation mode. M???? RSX-11M native. compiler at T???? RT-11 native. C Compiler and Library Page A-4 Getting on the Air with Decus C A.4 Distribution Contents in Detail ________ __ ______ ____________ [5,1] [.command] Command Files and Documentation This account contains documentation source files (.rno), kit building command files, and a few things that didn't fit anywhere else. This includes a number of special-purpose command files used to develop the C language system (such as FORK.COM, BATCH.COM, and TOOL.COM) which may serve as models for your own needs. It also contains the source for CRUN.BAS, used on RSTS/E systems to pass arguments to C programs and source for CCN, used to compile and assembler C programs on native RSX-11M. A full build of the Decus C system may be effected by executing RBUILD.CMD on RSTS/E (requires privileges) or VBUILD.COM on VAX/VMS. Either command requires about two hours to complete. At least 2000 free blocks of disk space is necessary on the default (public) disk. Note that the build will abort if the RSX LBR or TKB programs cannot obtain sufficient contiguous disk space. The RGTDOC.CMD or VGTDOC.COM command files build new documentation kit. To build the documentation, proceed as follows: 1. Build the compiler and libraries. a 2. Build the tools. 4. Use GETRNO to create library runoff files -- see VGTDOC.COM or RGTDOC.CMD. 5. Use RNO.TSK to build documentation on RSX-11M or RSTS/E, or use RUNOFF to built the library on VMS V2.0. 6. If on RSTS/E or VMS, execute FIXDOC to repair .DOC files after RNO.TSK or RUNOFF.EXE has finished messing them up. (See the gory details in RGTDOC.CMD and VGTDOC.CMD.) The GETCMD.C and BUILD.C programs were used to build command files for compilation and network file transfer. See the tool documentation or examine some command files for more information. Run- time library command files were built using the RLBCMD.CMD (RSTS/E) or VLBCMD.COM (VMS) command files. Tool command files were built the BTOOLS.COM or RTOOLS.CMD command files. [5,2] RSTS/E only using C Compiler and Library Page A-5 Getting on the Air with Decus C On some distributions (but not the Decus submission), this account contains the running system for RSTS/E and save images for RT-11. It is never needed on VMS. Any file residing in this account has been generated from source stored in other accounts. The VMS kit read/write account [5,2] command procedures reference only to copy documentation to and from magtape. Note that CC.DOC, AS.DOC, CBUGS.DOC, CLIB.DOC, and WIZARD.DOC are in this account on all distribution kits. This account is the only one that may contain binary files. Consequently, the RSX-11M interface library, CX.OLB, is stored here. It is needed only on native RSX-11M systems. RSX-11M users should be warned that CX.OLB was generated on a VAX/VMS system. CX.OLB is built from a command file in [5,7]. Note that some subroutines will not assemble on RSTS/E or early versions of RSX-11M as the associated macros are not present in the system macro library. [5,3] [.comp] Compiler source This account contains the source and build files for the compiler (CC????.MAC), assembler (AS????.MAC), and the compiler support library (L?????.MAC). The support library is a stripped-down variant of a very early version of the standard library, which is conditionally compiled for RSX or RT-11 flavor I/O support. It is not particularily efficient. To build the compiler, edit RSX.MAC and RT11.MAC to suit your particular hardware needs and execute the CC build command file: @ ATPK ATPK @ @ VMAKCC.COM XMAKCC.CMD RMAKCC.CMD MMAKCC.CMD TMAKCC.COM On On On On On VMS RSTS/E RSX mode RSTS/E RT-11 mode RSX native mode RT-11 native mode Then, build the assembler: @ ATPK ATPK @ @ [5,4] [.otscom] VMAKAS.COM XMAKAS.CMD RMAKAS.CMD MMAKAS.CMD TMAKAS.COM Common Library On On On On On VMS RSTS/E RSX mode RSTS/E RT-11 mode RSX native mode RT-11 native mode C Compiler and Library Page A-6 Getting on the Air with Decus C This account contains the "common" run-time library source. These files have no I/O or operating- system dependencies. (Note that a few reference library routines to print error messages.) Several modules are called by direct code generation sequences (e.g., the EIS support routines). Command files are stored in [-.OTSIO] ([5,5]). [5,5] [.otsio] I/O library This account contains I/O dependent run-time library source files. These files conditionally compile to generate code for either system You RSX-11M or RT-11 operating support. should be warned that several modules contain essentially two totally distinct subroutines. Internally-called routines are in IO????.MAC. INIT.MAC contains the run-time startup program, which is very system dependent. also contains some code which is specific to particular operating system releases. To build a library, invoke the appropriate command procedure, using the format described above: @ ATPK ATPK @ @ [5,6] [.rstslb] VMAKLB.COM XMAKLB.CMD RMAKLB.CMD MMAKLB.CMD TMAKLB.COM On On On On On VMS RSTS/E RSX mode RSTS/E RT-11 mode RSX native mode RT-11 native mode RSTS/E Interface Library It RSTS/E operating-system dependent subroutines allowing access to RSTS/E executive services by C programs. Many are written in C. They are not as well documented (or written) as they might be. [5,7] [.rsxlib] RSX-11/M Interface Library An interface library to the RSX-11M executive. It is not known what parts of this library work on VMS or RSTS/E emulation modes. This library will not assemble on RSTS/E V7.0 as the distributed system macro library lacks certain executive service macros. [6,1] [.tools] C Software Tools tools. See [.tools]readme.601 for details. The following command files are provided: V?TOOL.COM Vax/VMS: VNTOOL uses the native compiler VAX-11C; VXTOOL uses Decus C; and VBTOOL allows selection of either. C Compiler and Library Page A-7 Getting on the Air with Decus C R?TOOL.CMD RSTS/E: RXTOOL uses RSX emulation mode, while RTTOOL uses RT11 emulation mode. TTOOL.COM Native RT11. MTOOL.CMD Native RSX-11M. The command files were built by executing BUILD.C for all tools. It is highly recommended that, when you need to recompile a tool, you build the command file using BUILD. For example, to build a command file for GREP on your current operating system, you need only execute: build grep.c >grep.cmd On VMS, the TOOL.COM command file may be used to build a tool by running BUILD to create a command file which is then executed. Note that the RSTS and VMS commands refer to logical devices (BIN:) that, on VMS, are defined externally to the build process. [6,2] [.misc] Toys, Toys and Other Stuff half baked ideas, and other stuff. See [.misc]readme.602 for details. Command files are provided to build COOKIE on RSTS/E and VMS. of these files haven't been touched in years. [6,3] [.cross] Cross Assemblers A variety of cross assemblers. [.cross]readme.603 See Some for details. This account also contains a copy of the 8080 C compiler printed in Dr. Dobbs Journal, March 1980. Again, little recent debugging. Files in this account are stored in archives. To build a cross assembler, you should first extract the relevant files. These have not been extensively tested. [6,4] [.lex] Lexical Analyser A lexical-analyser generator written by Charles Forsyth. The standard build command files will create compiler command files. [6,5] [.libc] Library in C The first pieces of a "standard" library, implemented in C. Currently, the str??? and is??? routines, a few floating-point routines, and some pieces of are present. eventually It is hoped that this account will printf C Compiler and Library Page A-8 Getting on the Air with Decus C replace [.OTSCOM] and most of [.OTSIO] in the future. Note that, in the first Decus C distribution, this account contained a machine-independent microcomputer cross assembler. Those routines are now stored in the "cross assembler" directory in an archive). [6,6] [.useful] Useful subroutines A library of useful subroutines written in C. [6,7] [.vaxlib] VAX/VMS Interface Routines Interface routines for use with Decus C programs which are being transported to the native VMS C program product. This library predated the released version of Vax-11 C and may contain modules that have been superseded by the distributed Vax-11 C run-time library. Decus C tools must be linked together with this library in order to access routines, such as fwild(), that are not present in the Vax-11 C library. Note especially that the fact that a routine exists in this library (or that a tool compiles under Vax-11 C) does not imply that the tool or routine has been tested. If you blindly install this library, you are asking for trouble. A.5 Installation Overview ____________ ________ NOTE WARNING If you already have Decus C, please backup all files and zero all accounts before copying this distribution to disk. Several files that were on the previous Decus distribution are not on this tape. If you are installing C for the first time, you should print all "README.???" files, the compiler and library/support documentation files, NEWS.DOC, CC.DOC and WIZARD.DOC (in [5,2]), RSX.MAC, RT11.MAC, RT11.EIS, and the command files for your operating system. NOTE WARNING The RT11.MAC and RSX.MAC command files, as distributed, assume the existance of the SXT instruction. This instruction is not present on some early models of the PDP-11. If C programs or libraries C Compiler and Library Page A-9 Getting on the Air with Decus C are to run on a PDP-11/20, PDP-11/04, PDP-11/05, or on a PDP-11/40 without EIS, the macro header files must be edited to define C$$SXT = 0 before building the compiler or library. Beware, non-SXT compilation hasn't been tested for quite a while. If your system does not have EIS, you can make "no EIS" standard by editing RSX.MAC and RT11.MAC to set symbol C$$EIS to zero. The native RSX build command file inquires and EIS defaults must be set. A.5.1 Installation on RSTS/E whether SXT ____________ __ ______ This installation procedure presupposes RSTS/E V7.1 or later. If you are running on a V6 release, you will have to edit the command files, converting them to batch control files. You may also need to edit SUPORT.MAC, INIT.MAC, FWILD.MAC, and SBREAK.MAC in the run-time library as these routines presuppose executive services that were added with the V7.0 release. Decus C does not require "large files" or other optional RSTS/E features. While the C compiler and run-time libraries generally do not require privileges, you will need privileges to perform a few installation-support functions: Creating accounts. Copying files to a specific account. Installing CCL's and system-wide logicals. Create the various accounts, [5,1] through [5,8] and [6,1] through [6,7]. The accounts may be created on a private disk. Then, copy the distribution tape to these accounts: PIP disk:[*,*]<40>=tape:[*,*] File CX.OLB may be in some distributions. It is not needed for RSTS/E systems and should be deleted. The system manager should add the following commands to your system startup command file (before executing RBUILD): RUN ADD CCL CCL $UTILTY LOGICAL disk:[account] C XCC-=C:CC.TSK;0 XAS-=C:AS.TSK;0 ! define C logical ! RSX CC compiler ! RSX AS assembler C Compiler and Library Page A-10 Getting on the Air with Decus C CCL CC-=C:CC.SAV;8220 CCL AS-=C:CC.SAV;8220 CCL CRUN-=C:CRUN.*;30000 ! RT-11 CC compiler ! RT-11 AS assembler ! Turn CCL to chain call EXIT where "disk:[account]" is specified to suit your installation's needs. It need not be [1,2]. NOTE C programs will not compile if you haven't added C: as a logical device as they use this logical to locate system-wide header files. The CCL's install CC.SAV and AS.SAV to run in a 28 K- word partition. The parameter value is constructed as "8192+K" where K is the number of K-words the software is to run in. Note that these programs do not dynamically expand memory on RSTS/E. The "tools" build command files also make reference to system-wide logical PUB:. This may be assigned to [1,2] or some other "public library" account. If you do not wish to edit these files, you should add PUB: as a "system-wide logical." Make sure protection codes are set properly in the files in C:. You may also want to add CC.HLP and [6,1]CTOOLS.HLP to the help facility. Their format is compatible with the VMS help facility and must be edited for use on RSTS/E. Installing the entire system using the [5,1]RBUILD.CMD control file requires about two hours on a lightly-loaded 11/70 system. Note that RSTS/E system installation requires system manager privileges in order to install CCL commands, system wide logicals, and to create files in other accounts. No C program requires <232> privileges for its operation. If your system manager installs the RSTS/E feature patch to permit cross-account file creates within the same project and gives you a [5,0] and [6,0] account, it is possible to build Decus C without privileges. be run directly, however. The RBUILD command file cannot C Compiler and Library Page A-11 Getting on the Air with Decus C A.5.2 Installation on VMS ____________ __ ___ This installation procedure presupposes VMS V2.0 or later. If you are running on an earlier release, you will have to edit the command files, replacing account assignments as needed. If you are running on VMS V3.0 or later, you can restore the system from magtape (VAX BACKUP format). If your Decus C distribution was in various account FLX format, create the accounts and copy [5,1] from the magtape to account [.command]: $ create/dir disk:[decusc] $ set default disk:[decusc] The VMS V2.0 file system supports relative directory access as follows: [-.subdirectory] means "move to the parent of the current directory and then down to the indicated subdirectory." This is analogous to the Unix syntax ../subdirectory This is not supported in earlier releases of VMS. If not running under VMS V2.0 or later, you will have to edit .COM files accordingly. In any case, create the following sub-directories ([P,Pn] shows the correspondance between the tape directory and disk subdirectory): [5,1] [5,2] [.command] Command files and documentation [] .DOC files [5,3] [5,4] [5,5] [5,6] [5,7] [.comp] [.otscom] [.otsio] [.rstslb] [.rsxlib] [6,1] [6,2] [6,3] [6,4] [6,5] [6,6] [6,7] [.tools] [.misc] [.cross] [.lex] [.cfloat] [.useful] [.vaxlib] Compiler source Common (no i/o) run-time library I/O run-time library RSTS/E library RSX-11/M library C source for useful programs Various junk Cross-assemblers Lexical analyser Floating point library Useful subroutines Vax native library Set [.command] as your current default and [5,1]VRKIT.COM from the magtape to this account: $ set default [.command] $ mount/foreign mta0: copy C Compiler and Library Page A-12 Getting on the Air with Decus C $ mcr flx sy:=mt0:[5,1]vrkit.com/do Now, edit file VRKIT.COM to suit your needs and execute it. (If your distribution is on 1200 foot magtapes, you should copy VRKIT1.COM, execute it, then mount the second magtape on and The MTA0: execute (after eventual editing) VRKIT2.COM. VRKIT command procedure copies all other files to the disk. Because of the many rewinds, this command requires several hours to complete. An alternate distribution for VMS systems only uses the MCR RMSBCK utility to write each subdirectory in a "container" file. The distribution tape is labelled "C" and contains the following files: README.NOW KIT.DOC BCK.COM RST.COM FILEnn.BCK A short file explaining the process This document The backup command file used A model restore command file Container files To generate a C system from the backup tape, you must first copy RST.COM to disk, edit it to set correct disk and directory designations, then execute it as an indirect command file. After reading the kit, install the system using the VBUILD.COM command procedure. One simple way to do this is by typing the following sequence: $ set default [.command] $ @batch vbuild ! or submit vbuild This builds login a temporary batch control file in your account, submits it to batch, and sends you mail when the process completes. Batch.com requires some cooperation from your login.com file. The compiler, assembler, and run-time library are written to the parent of [.command] (generally [decusc]). The tools are written to logical BIN: which should be defined before starting the build process. (Edit vbuild.com if BIN: is not defined in your login.com file.) [.command]CCHLP.COM is a command file that adds DECUSC.HLP to the system (VMS V2.0) help library. It requires write-access to the help library. It may not be compatible with later help file conventions, nor has it been tested on later releases of VMS. Installation of VBUILD on an VMS V3.0 takes about 90 minutes. unloaded Vax-11/782 running C Compiler and Library Page A-13 Getting on the Air with Decus C A.5.3 Installation on RSX-11M ____________ __ _______ There are command files of the format M?????.CMD. They should require no editing for RSX-11M V3.2. Execute them using the "@" system command, answering the questions as needed. Several routines in the RSX interface library are specific to the V3.2 release and will not assemble on previous releases (or on RSX-11M emulated on RSTS/E). A.5.4 Installation on RT-11 ____________ __ _____ An easy way to build an RT-11 system is to first built a RSTS/E system. Then, use ATPK to execute RTKIT.CMD (after editing) to copy files to an RT-11 format disk. To run the compiler, define logical device C: to refer to the disk containing the "#include <>" files and libraries and off you go. Command procedures of the format T?????.COM are present for "native" RT-11. They are not optimized to minimize disk storage usage. Decus C has been built on 2 RK05 RT11 systems, using one RK05 for system and one for source files. Except for "RT11.MAC", "RT11.EIS", and "RSX.MAC" (which are everywhere identical), there are no known conflicts among compiler and library file names. However, given the size of the C distribution, it would be prudent to use separate disks for the various components of the distribution. The C system runs on diskette-based systems, such as the PDT-150. (and even on a VT103 with two TU58's!) No command files are present to build the system on diskette copy the necessary files to diskette systems. Instead, you should as follows: o Build an RT-11 system containing file transfer utilities, editors, LINK.SAV, and LIBR.SAV. o Copy CC.SAV, AS.SAV, and STDIO.H to this disk (there will be only a few free blocks left). This diskette will be defined as the C: o Initialize a second logical device. diskette and copy CLIB.OBJ and SUPORT.OBJ to it. Your C programs should be created on the second disk. There will be slightly more than 300 blocks free after creating CLIB.OBJ and SUPORT.OBJ. Note that, if you omit some of the file transfer utilities, CLIB.OBJ and SUPORT.OBJ may be stored on the system disk, freeing the second diskette for your C programs. You should attempt to keep C program files using quite short, C Compiler and Library Page A-14 Getting on the Air with Decus C the linker/librarian to build larger entities. For example, the MAZE.C program (in [6,2]) needs over 200 blocks of temporary disk storage for compilation. This is unsatisfactory in many situations. The C language system has not been tested on HT-11. Several of the library routines use RT-11 Version 3 monitor calls that are not supported on HT-11. However, it should not be too difficult to "fix" the library as needed. While all tools have been compiled using Vax-11 C, only a few have been tested in "native C." Note also that there are a few incompatiblities between Decus C and "standard" C, and several incompatibilities between the Decus run-time library and Unix-style standard libraries. A.5.5 Supporting Decus C Decus C is distributed in source format. __________ _____ _ All files are in the public-domain. WIZARD.DOC contains information on compiler data formats and library internal information. This software is made available without any support whatsoever. To support the Decus C language, run-time library, or C programs, you will need to understand and modify Macro and C source code. The authors would appreciate your communicating bug reports (with fixes!) and suggestions. The Decus "Structured Languages Special Interest Group" is the primary focus for communication among users of Decus C. APPENDIX B LIBRARY INDEX The following is a keyword in context index to the standard library. The entry in the left-hand column is the title of the routine in the main library documentation. toascii isascii abort abs fabs qset $$fadd profile rtemt $$cl16 $$flun malloc calloc alloc $$abuf $$falo sbrk isalloc Convert to 7-bit Ascii Test for 7-bit Ascii trap Abort program with a BPT Absolute value Floating absolute value queue Add entries to the RT11 Floating-point add and subtract Print profile data after exit Execute a RT11 EMT after loading r0 Close all I/O channels Allocate a logical unit Allocate and free memory memory Allocate and initialize Allocate memory buffers Allocate memory for i/o subroutines Allocate memory for i/o operating system Allocate memory from a pointer points to allocated memory Check if $$mchk isalpha islower isupper isalnum strcat Concatenate strncat Concatenate Verify memory Test for Test for lower-case Test for upper-case Test for a string onto allocation pointers alphabetic argument alphabetic argument alphabetic argument alphanumeric argument another a string onto another, with strncpy $$ltoa Copy one string to another, with count long to Ascii (any radix) Convert $$fopt fopen/fwild options argument Scan isalpha isalnum iscntrl Test for alphabetic argument Test for alphanumeric argument for control character argument isdigit isgraph islower Test for digit argument Test for graphic argument lower-case alphabetic argument isprint Test for printable argument Test for Test C Compiler and Library Page B-2 Library Index ispunct isupper Test for punctuation argument upper-case alphabetic argument Test for isspace $$fcsi $$dtoa Test for whitespace argument Parse file name argument for fopen/fwild floating point to ASCII Convert ddtoa floating point to ASCII -- dummy Convert atofd $$ctim -- dummy Convert ASCII to floating point $$rtim buffer to Ascii Convert $$c5ta r50toa fgetname itoa itoax Convert Radix-50 to Convert Radix-50 to Convert file name to Convert integer to to hexadecimal Ascii Ascii Ascii Ascii Ascii Convert integer itoa8 integer to octal Ascii Convert toascii isascii $$ltoa ascr50 atod atof ctime ctime Convert to 7-bit Test for 7-bit Convert long to Convert Convert Convert Convert time value to time buffer to Ascii Ascii Ascii Ascii Ascii Ascii ascii ascii (any radix) to Radix-50 to floating point to floating point asctime Convert ctime peek ftime ungetc $$clfu getw putw fget fput msize zero fill abort localtime swabb $$ctim $$utim ctime buffer to ascii asctime Convert time Peek at a location in RSTS/E Compute time of day (augmented) Push back onto an input file Flush last record before closing file file Input a binary integer from a Output a binary integer to a file Input a binary record Output a binary record Get size of a memory block Clear a block of memory character Fill a block of memory with a Abort program with a BPT trap Build time of day buffer Swap bytes in a buffer Convert $$rtim buffer to Ascii Convert $$rtim buffer to Unix time asctime Convert time buffer to ascii $$abuf memory for i/o buffers Allocate $$flsh fflush localtime swabi copy Flush output buffers Flush output buffers Build time of day buffer Byte swap an integer a given number of bytes Copy swabb call Swap bytes in a buffer subroutine from C Call callc subroutine from C (Fortran) Call (Fortran) $$main $$main csv$ $$init error variables C C environment C C Error exit from C library global main program program execution program initialization programs C Compiler and Library Page B-3 Library Index exit csv$ call callc $$qiow wrapup caller Normal exit from restore subroutine from C subroutine from C service Dummy routine name of profiled C programs C register save and Call (Fortran) Call (Fortran) Call RSX executive called on exit caller calltr brk $$cl16 ctype fill Trace path to the pointer Close all I/O type table of memory with a caller Change top of memory channels Character classification character Fill a Return block iscntrl getchar index Test for control character argument Get one character from a file first instance of a character in a stFind strchr first instance of a character in a stFind inchr rindex Find the index of a character in a string last instance of a character in a stFind the the the strrchr last instance of a character in a stFind the putc $$putc $$getc isalloc ctype zero clearerr fclear $$main $$cl16 fclose $$clfu Output one character to a file Output one character to a file Get characters (internal) points to allocated memoryck if a pointer table Character classification type Clear a block of memory flags Clear open file's error flags Clear open file's error $$tick -- Clock interrupt rate Close all I/O channels Close an open file last record before closing file (internal) Flush exit exit iov $$gcmd msg $$exst -- Exit status Exit with status I/O error Parse a message on the code code codes command line command terminal Print strcmp strncmp $$ctim strlen count string Compare Compare Compute Compute strings strings, with day of week length of a time tod ftime strcat strncat concat envsave Compute time of day Compute time of day (augmented) Compute time of day onto another Concatenate a string onto another, with countoncatenate a string Concatenate strings and restore function context iscntrl gettty setcc fprintf sprintf $$tens $$rtim argument Save Test for Get mode only) Trap Formatted Formatted floating point Date and time control character control terminal name Control/C (RSTS/E RT11 Conversion Conversion Conversion table for conversion C Compiler and Library Page B-4 Library Index $$scan fscanf scanf sscanf $$ctim $$utim atofd ascr50 atod atof $$c5ta r50toa fgetname $$dtoa ddtoa itoa itoax itoa8 $$ltoa toupper atoi atol ctime ctime toascii tolower copy strcpy strncpy cpystr strncmp strncat Formatted Formatted Formatted Formatted input input input input conversion conversion conversion conversion Ascii Convert $$rtim buffer to Unix time Convert $$rtim buffer to floating point -- dummyConvert ASCII to Radix-50 Convert Ascii to floating point Convert Ascii to floating point Convert Ascii to Ascii Convert Radix-50 to Ascii Convert Radix-50 to Ascii Convert file name to to ASCII Convert floating point to ASCII -- dummy Convert floating point Convert integer to Ascii hexadecimal Ascii Convert integer to Ascii Convert integer to octal (any radix) Convert long to Ascii upper-case Convert lower-case to integer Convert string to Convert string to long ascii asctime Convert time buffer to ascii Convert time value to Convert to 7-bit Ascii lower-case Convert upper-case to bytes Copy a given number of Copy a string another, with count Copy one string to String copy Compare strings, with count onto another, with countConcatenate a string strncpy to another, with count Copy one string strneq string equality, with count Test $$main profile $$rtim time tod ftime localtime $$ctim $$main $$narg fspool $$scca -- RT-11 Ctrl/C flag Print profile data after exit Date and time conversion Compute time of day Compute time of day Compute time of day (augmented) Build time of day buffer Compute day of week $$uic -- RSX-11M default UIC Define $$narg default for RT11 startup Spool file to default print queue $$narg iov sleep delete fmkdl kbinr kbin for RT11 startup Define $$narg default I/O vector definition of seconds Delay job a given number Delete a named file Mark file for deletion read without waiting Delimiter-free terminal the terminal without delimiters Read from isxdigit isdigit Test for hexadecimal digit Test for digit argument C Compiler and Library Page B-5 Library Index div$li $$div2 wrapup atofd Long division and modulus Unsigned division and modulus exit Dummy routine called on to floating point -- dummy Convert ASCII ddtoa point to ASCII -- dummy Convert floating memdmp eis$i rstsys rtemt $$main eis$i feof $$main qset profile csv$ streq strneq error ferr ferror iov clearerr fclear perror iov rstsys rtemt unwind setjmp csv$ $$qiow exit exit wrapup Execute a RSTS Execute a RT11 $$vms -- Test if VMS EIS Test for $$stnd -- Stack queue Add $$prnl -- Profile C program execution Test strings for Test string programs Test for file Test for file I/O Clear open file's Clear open file's Print library $$ferr -- File loading r0 longjmp -C program Call RSX $$exst -routine called on Dump memory or registers EIS emulator EMT EMT after loading r0 emulation emulator end of file end point entries to the RT11 entry per line environment equality equality, with count Error exit from C error error error codes error flags error flags error message error value Execute a RSTS EMT Execute a RT11 EMT after Execute non-local goto execute non-local goto execution environment executive service Exit status code Exit with status code exit Dummy profile profile data after exit error exit exit iov iov profile Error exit Normal exit $$exst $$ferr $$ferr -- File -- Profile output file Print $$pfil fclose Close an open file from C programs from C programs -- Exit status code -- File error value error value delete $$clfu Delete a named file record before closing file Flush last getchar one character from a file Get getw binary integer from a file fopen putw Open or reopen a file a binary integer to a file a Output puts putc Output a string to a file one character to a file Output ungetc back onto an input file Push fgets feof Read a string from a file Test for end of file Input C Compiler and Library Page B-6 Library Index frec if record-oriented file $$putc one character to a file (internal) Test Output ferr ferror fmkdl rewind ftty isatty $$fcsi fgetname $$fopa fwild fseek ftell fspool clearerr fclear fill maxmin maxmin maxmin maxmin index strchr inchr rindex strrchr index strchr $$main Test for file error Test for file error Mark file for deletion Rewind a file for re-reading Test if a file is a terminal Test if a file is a terminal fopen/fwild Parse file name argument for Convert file name to Ascii Open or reopen a file on RT11 Wild-card file open Reposition file pointer (seek) subsequent seek Get file position for queue Spool file to default print Clear open file's error flags Clear open file's error flags with a character Fill a block of memory numbers Find maximum of two unsigned numbers Find maximum of two numbers Find minimum of two unsigned numbers Find minimum of two of a character in a stringd the first instance of a character in a stringd the first instance character in a string Find the index of a of a character in a stringd the last instance of a character in a stringd the last instance character in aFind the first instance of a character in aFind the first instance of a -- RT-11 Ctrl/C flag $$scca clearerr open file's error flags fclear open file's error flags Clear Clear iov fabs $$tens atod atof atofd fps $$dtoa ddtoa $$fadd $$fmul I/O system internal flags and vectors Floating absolute value Conversion table for floating point Convert Ascii to floating point Convert Ascii to floating point Convert ASCII to floating point -- dummy (FPS) Set floating point status Convert floating point to ASCII -- dummy Convert floating point to ASCII subtract Floating-point add and multiply/divide Floating-point $$fsav $$clfu $$flsh fflush $$fcsi routines closing file Floating-point support Flush last record before Flush output buffers Flush output buffers name argument for fopen/fwild Parse $$fopt fprintf sprintf $$scan fscanf scanf argument file conversion conversion conversion Scan fopen/fwild options Formatted Conversion Formatted Conversion Formatted input Formatted input Formatted input C Compiler and Library Page B-7 Library Index sscanf $$prnt printf call callc fps conversion Formatted input Formatted output Formatted output Call (Fortran) subroutine from Call (Fortran) subroutine from point status (FPS) Set C C floating malloc envsave envsave irand rand $$get $$getc gettty ftell fileno flun getchar msize copy sleep $$main unwind setjmp Allocate and Save and restore Multi-level Random number Random number (internal) name subsequent seek file block Copy a Delay job a C library Execute non-local -- execute non-local free memory function context function return generator generator Get a record (internal) Get characters Get control terminal Get file position for Get logical unit number Get logical unit number Get one character from a Get size of a memory given number of bytes given number of seconds global variables goto goto longjmp isgraph traps itoax isxdigit $$cl16 iov screen iov iov $$abuf $$falo $$main Test for Operating system trap Convert integer to Test for Close all Screen flags and vectors Allocate memory for Allocate memory for -- Operating system graphic argument handlers hexadecimal Ascii hexadecimal digit I/O channels I/O error codes I/O primitives I/O system internal I/O vector definition i/o buffers i/o subroutines id. $$opsy $$main $$main $$main ftty isatty isalloc frec wdleng inchr $$pos -- Test if P/OS (Professional) $$rsts -- Test if RSTS/E $$vms -- Test if VMS emulation Test if a file is a terminal Test if a file is a terminal allocated memory Check if a pointer points to Test if record-oriented file Machine independent sizeof(int) a string Find the index of a character in $$init calloc getw fget fread $$scan fscanf scanf sscanf C program initialization Allocate and initialize memory from a file Input a binary integer Input a binary record Input a record Formatted input conversion Formatted input conversion Formatted input conversion Formatted input conversion C Compiler and Library Page B-8 Library Index ungetc index strchr rindex strrchr swabi atoi asl$li asr$u in in in in a a a a Push back onto an strFind the first strFind the first striFind the last striFind the last Byte swap an Convert string to Shift long by shift unsigned by input file instance of instance of instance of instance of integer integer integer integer a a a a character character character character right getw itoa putw itoax itoa8 iov $$get $$getc $$putc Input a binary integer from a file Convert integer to Ascii Output a binary integer to a file Ascii Convert integer to hexadecimal Convert integer to octal Ascii vectors I/O system internal flags and Get a record (internal) Get characters (internal) character to a file (internal) Output $$main ftty isatty sleep rindex strrchr $$clfu strlen perror $$main profile $$tick -- Clock Test if a file Test if a file seconds Delay character in aFind the character in aFind the closing file Flush Compute Print C -- Profile entry per one interrupt rate is a terminal is a terminal job a given number of last instance of a last instance of a last record before length of a string library error message library global variables line $$prnl $$gcmd gets $$link rtemt Parse command Read a Print memory a RT11 EMT after peek $$put $$flun fileno flun div$li atol mul$l asl$l asl$li mul$l Peek at a Write a Allocate a Get Get line line from stdin list loading r0 Execute modulus Convert string to Multiply long by shift long by Shift Multiply location in RSTS/E logical record logical unit logical unit number logical unit number Long division and long long long long by integer long by long asl$l $$ltoa setjmp shift long by long radix) Convert long to Ascii (any -- save state for longjmp setjmp tolower islower toupper wdleng $$main fmkdl non-local goto Convert upper-case to argument Test for Convert sizeof(int) C setjmp longjmp -- execute lower-case lower-case alphabetic lower-case to upper-case Machine independent main program Mark file for deletion C Compiler and Library Page B-9 Library Index maxmin maxmin alloc malloc calloc Find Find Allocate Allocate and free and initialize numbers maximum of two numbers maximum of two unsigned memory memory memory Allocate isalloc points to allocated memory Check if a pointer zero realloc $$mchk msize $$abuf $$falo sbrk $$link memdmp brk fill perror msg maxmin maxmin setcc Clear a block of Reallocate pointers Verify Get size of a Allocate subroutines Allocate system Allocate Print Dump Change top of Fill a block of Print library error terminal Print a Find numbers Find (RSTS/E RT11 memory memory memory allocation memory block memory for i/o buffers memory for i/o memory from operating memory list memory or registers memory pointer memory with a character message message on the command minimum of two numbers minimum of two unsigned mode only) Trap trace div$li $$div2 envsave mul$l $$fmul $$main Profile support Long division and Unsigned division and return gettty $$fcsi caller fgetname delete $$narg unwind setjmp exit $$prmt fileno flun irand rand copy Get control terminal name fopen/fwild Parse file name argument for Return name of profiled caller Convert file name to Ascii Delete a named file startup Define $$narg default for RT11 Execute non-local goto longjmp -- execute non-local goto programs Normal exit from C Null prompt pointer Get logical unit number Get logical unit number Random number generator Random number generator Copy a given number of bytes Control/C module (with trace) modulus modulus Multi-level function Multiply long by long Floating-point multiply/divide -- RSX-11M task name $$task sleep maxmin maxmin Delay job a given number of seconds Find maximum of two numbers of two unsigned numbers Find maxmin maxmin Find minimum of two numbers of two unsigned numbers maximum Find minimum itoa8 getchar putc $$putc strncpy Convert integer to file Get Output (internal) Output with count Copy octal Ascii one character one character one character one string to from a to a file to a file another, C Compiler and Library Page B-10 Library Index setcc (RSTS/E RT11 mode only) Trap Control/C ungetc strcat strncat fopen $$fopa fwild fclose clearerr fclear $$main traps sbrk $$main $$main $$fopt memdmp fopen $$fopa putw fput fwrite puts putc $$putc $$prnt printf $$flsh fflush profile $$main $$gcmd $$fcsi calltr peek profile Push back onto an input file Concatenate a string onto another Concatenate a string onto another, with count Open or reopen a file RT11 Open or reopen a file on Wild-card file open Close an open file Clear open file's error flags Clear open file's error flags $$opsy -- Operating system id. handlers Operating system trap Allocate memory from operating system variables Operating-system unique id. $$opsy -- Operating system Scan fopen/fwild options argument Dump memory or registers Open or reopen a file Open or reopen a file on RT11 to a file Output a binary integer Output a binary record Output a record file Output a string to a a file Output one character to a file (internal) Output one character to Formatted output Formatted output Flush output buffers Flush output buffers $$pfil -- Profile output file $$pos -- Test if P/OS (Professional) Parse command line for fopen/fwild Parse file name argument Trace path to the caller RSTS/E Peek at a location in -- Profile entry per line profile $$main $$tens file $$pfil -- Profile output $$stnd -- Stack end point table for floating point $$prnl Conversion atod Ascii to floating point atof Ascii to floating point atofd ASCII to floating point -- dummy Convert Convert Convert fps $$dtoa ddtoa brk $$prmt fseek isalloc $$mchk Set floating Convert floating Convert floating Change top of memory Null prompt Reposition file allocated meCheck if a memory allocation point status (FPS) point to ASCII point to ASCII -- dummy pointer pointer pointer (seek) pointer points to pointers isalloc $$main ftell screen memoCheck if a pointer points to allocated (Professional) $$pos -- Test if P/OS seek Get file position for subsequent Screen I/O primitives Verify C Compiler and Library Page B-11 Library Index msg perror $$link profile fspool isprint profile $$main command terminal message Print a message on the Print library error Print memory list exit Print profile data after Spool file to default print queue Test for printable argument per line $$prnl -- Profile entry -- Test if P/OS (Professional) profile profile trace profile caller $$main csv$ $$init abort error exit $$prmt ispunct ungetc qset $$prnl -- Profile entry per line $$pfil -- Profile output file (with trace) Profile support module Print profile data after exit Return name of profiled caller C main program environment C program execution C program initialization Abort program with a BPT trap Error exit from C programs Normal exit from C programs Null prompt pointer Test for punctuation argument file Push back onto an input entries to the RT11 queue $$pos Add fspool file to default print queue rtemt EMT after loading r0 Spool Execute a RT11 $$svr1 $$ltoa Save registers r1-r5 on the stack long to Ascii (any radix) ascr50 $$c5ta r50toa irand rand $$main Convert Ascii to Radix-50 Convert Radix-50 to Ascii Convert Radix-50 to Ascii Random number generator Random number generator -- Clock interrupt rate Convert $$tick rewind gets fgets kbin kbinr Rewind a file for re-reading Read a line from stdin file Read a string from a without delimiters Read from the terminal terminal read withouDelimiter- free realloc fread fget Reallocate memory Input a record Input a binary record fwrite fput $$put $$get $$clfu frec csv$ memdmp $$svr1 fopen $$fopa fseek csv$ Output a Output a binary Write a logical Get a file Flush last Test if restore C Dump memory or stack Save Open or Open or (seek) C register save and record record record record (internal) record before closing record-oriented file register save and registers registers r1-r5 on the reopen a file reopen a file on RT11 Reposition file pointer restore C Compiler and Library Page B-12 Library Index envsave caller envsave rewind asr$u wrapup $$fsav Save and restore function context caller Return name of profiled Multi-level function return re-reading Rewind a file for integer right shift unsigned by Dummy routine called on exit support routines Floating- rstsys $$main $$main peek setcc $$qiow $$main $$main $$main $$fopa Execute a RSTS EMT $$rsts -- Test if RSTS/E $$rsts -- Test if RSTS/E Peek at a location in RSTS/E Trap Control/C (RSTS/E RT11 mode only) Call RSX executive service $$uic -- RSX-11M default UIC $$task -- RSX-11M task name $$scca -- RT-11 Ctrl/C flag or reopen a file on RT11 point Open rtemt setcc r0 Execute a RT11 EMT after loading Control/C (RSTS/E RT11 mode only) Trap qset $$narg Add entries to the RT11 queue $$narg default for RT11 startup Define $$ctim $$utim envsave $$svr1 csv$ setjmp $$fopt $$main screen sleep Convert $$rtim buffer to Ascii Convert $$rtim buffer to Unix time function context Save and restore the stack Save registers r1-r5 on C register save and restore setjmp -- save state for longjmp argument Scan fopen/fwild options flag $$scca -- RT-11 Ctrl/C Screen I/O primitives job a given number of seconds Delay ftell for subsequent seek Get file position fseek file pointer (seek) Reposition $$qiow fps setjmp asl$li asl$l asr$u msize wdleng Call RSX executive service status (FPS) Set floating point longjmp setjmp -- save state for Shift long by integer shift long by long integer right shift unsigned by Get size of a memory block Machine independent sizeof(int) fspool $$main $$svr1 print queue Spool file to default $$stnd -- Stack end point r1-r5 on the stack Save registers $$narg default for RT11 startup Define $$narg setjmp fps exit exit gets $$main cpystr strlen strcpy setjmp -- save state for longjmp Set floating point status (FPS) $$exst -- Exit status code Exit with status code Read a line from stdin $$stnd -- Stack end point String copy Compute length of a string Copy a string C Compiler and Library Page B-13 Library Index index of a character in a stFind the first strchr of a character in a stFind the first inchr of a character in a string rindex of a character in a strFind the last strrchr of a character in a strFind the last instance instance Find the index instance instance strneq fgets strcat strncat puts strncpy atoi atol strcmp concat streq strncmp call callc $$falo count Test Read a Concatenate a with counConcatenate a Output a count Copy one Convert Convert Compare Concatenate Test Compare Call (Fortran) Call (Fortran) memory for i/o string equality, with string from a file string onto another string onto another, string to a file string to another, with string to integer string to long strings strings strings for equality strings, with count subroutine from C subroutine from C subroutines Allocate ftell $$fadd Get file position for subsequent seek add and subtract Floating- point trace $$fsav swabb swabi sbrk trace) Profile support module (with Floating-point support routines Swap bytes in a buffer Byte swap an integer memory from operating system $$main iov traps ctype $$opsy -- Operating system id. and vectors I/O system internal flags Operating system trap handlers classification type table Allocate Character $$tens $$main $$main msg name Conversion table for floating point $$task -- RSX-11M task $$task -- RSX-11M task name on the command terminal Print a message ftty isatty gettty Test if a file is a terminal Test if a file is a terminal Get control terminal name kbinr kbin isascii isalpha isalnum iscntrl isdigit feof ferr ferror isgraph isxdigit islower isprint ispunct isupper waiting Delimiter-free terminal read without delimiterRead from the terminal without Test for 7-bit Ascii argument Test for alphabetic argument Test for alphanumeric character argument Test for control Test for digit argument Test for end of file Test for file error Test for file error argument Test for graphic digit Test for hexadecimal alphabetic argument Test for lower-case argument Test for printable argument Test for punctuation alphabetic argument Test for upper-case C Compiler and Library Page B-14 Library Index isspace $$main $$main $$main ftty isatty frec strneq streq $$main $$utim argument Test (Professional)$$pos -- Test $$rsts -- Test $$vms -- Test terminal Test terminal Test file Test with count Test equality Test rate $$tick $$rtim buffer to Unix time for whitespace if P/OS if RSTS/E if VMS emulation if a file is a if a file is a if record-oriented string equality, strings for -- Clock interrupt Convert ctime $$rtim time tod ftime localtime ctime brk calltr trace asctime Convert Date and Compute Compute Compute Build Convert Change time buffer to ascii time conversion time of day time of day time of day (augmented) time of day buffer time value to ascii top of memory pointer Trace path to the caller support module (with trace) Profile setcc abort RT11 mode only) Trap Control/C (RSTS/E program with a BPT trap Abort traps maxmin maxmin maxmin maxmin ctype Operating system Find maximum of Find minimum of Find maximum of Find minimum of classification trap handlers two numbers two numbers two unsigned numbers two unsigned numbers type table Character $$main -- RSX-11M default UIC $$uic $$main $$main $$flun fileno flun $$utim UIC $$uic -- RSX-11M default Operating-system unique variables Allocate a logical unit Get logical unit number Get logical unit number $$rtim buffer to Unix time $$div2 asr$u maxmin maxmin toupper isupper modulus Convert right shift Find maximum of two Find minimum of two Convert lower-case to argument Test for Unsigned division and unsigned by integer unsigned numbers unsigned numbers upper-case upper-case alphabetic tolower iov abs fabs ctime $$main $$main Convert $$ferr -- File error Absolute Floating absolute Convert time C library global unique upper-case to lower-case value value value value to ascii variables variablesOperating- system iov iov I/O vector definition internal flags and vectors I/O system $$mchk $$main $$main pointers Verify memory allocation $$vms -- Test if VMS emulation emulation $$vms -- Test if VMS C Compiler and Library Page B-15 Library Index kbinr terminal read without waiting Delimiter- free $$ctim isspace kbin Compute day of week Test for whitespace argument from the terminal without delimiters Read kbinr terminal read without waiDelimiter- free $$put Write a logical record
* Your assessment is very important for improving the work of artificial intelligence, which forms the content of this project
advertisement