Annotation of coherent/g/usr/lib/misc/Read_me, revision 1.1.1.1

1.1       root        1: 
                      2: libmisc.a is a miscellaneous collection of useful functions
                      3: for C programmers.
                      4: 
                      5: misc.h A header file with externs and #define's for the
                      6:        various functions in libmisc.a
                      7: 
                      8: char * alloc(n) unsigned n;
                      9:        malloc() n bytes and zero them, or put out a fatal error message.
                     10: 
                     11: int approx(a, b) double a, b;
                     12:        If a and b are within epsilon, then return 1; else return 0. epsilon
                     13:        is a visible double.
                     14: 
                     15: char * ask(reply, msg, ...) char *reply *msg;
                     16:        Print msg as a printf-style format string using any
                     17:        trailing arguments. Gets a line from stdin with gets()
                     18:        and returns the address of reply. For example:
                     19: 
                     20:        sscanf(ask(buff, "%d numbers", 3), &a, &b, &c);
                     21: 
                     22:        puts out the message "Enter: 3 numbers ", gets a reply,
                     23:        write it into buff, and hands that to sscanf().
                     24: 
                     25: void banner(word, pad) char *word; int pad;
                     26:        Prints word as a banner on stdout preceeded by pad
                     27:        spaces.  Each letter of the banner consists of multiple
                     28:        occurrences of itself.  You can use this to make your listings
                     29:        just the ones used by the mainframe professionals ...
                     30: 
                     31: int copyd(outfile, infile, length) FILE *outfile, *infile; unsigned long length;
                     32:        Copy data from one file to another for a length.
                     33:        Returns 1 on success, 0 on failure.
                     34:        If copyd cannot read the length given it will write all it can read.
                     35:        copyd usses buffers for efficiency.
                     36: 
                     37: unsigned short crc16(p) char *p;
                     38:        Takes the crc16 of the string p and returns it. Fast
                     39:        and perfect for hash tables, diff algorithms etc.
                     40: 
                     41: void fatal(msg, ...) char *msg;
                     42:        Prints msg as a printf-style format string using
                     43:        any trailing arguments.  This is proceeded by
                     44:        "\nfatal".  fatal() then calls exit(1).
                     45: 
                     46: getargs(argc, argv, optstring) int argc; char *argv[]; char *optstring;
                     47:        This is an improved form of getopt. If an option is followed
                     48:        by an ! it has an optional argument.
                     49:                while(EOF != (c = getargs(argc, argv, "xyf:g!")))
                     50:        Is a call of getargs from its test section. The x and y
                     51:        options take no arguments. The f option takes a mandidory
                     52:        argument, -f arg, and -farg, are both legal forms. The g option
                     53:        takes an optional argument which if present must be connected
                     54:        -garg. Additional arguments are returned as if they were preceeded
                     55:        by an option of '\0'. This allows programs such as ld and as to
                     56:        process mixed options and file names.
                     57: 
                     58: char * getline(ifp, lineno) FILE *ifp; int *lineno;
                     59:        Get lines from an input file.  Returns the address of the line,
                     60:        or NULL for eof.
                     61: 
                     62:        lineno should usually be started at 1. lineno will
                     63:        be incremented by the number of lines in the previous call.
                     64:        Thus lineno will be the number of the line just gotten.
                     65: 
                     66:        # to end of line is passed. This for comments.
                     67:        \ whitespace through end of line is passed. This is for long
                     68:          lines.
                     69:        \n newline
                     70:        \p #
                     71:        \a alarm
                     72:        \b backspace
                     73:        \r carrage return
                     74:        \f form feed
                     75:        \t tab
                     76:        \\ backslash
                     77:        \ddd octal number
                     78:        all other \ sequences are errors and reported on stderr.
                     79: 
                     80: int  getpseudotty(char *newtty, char *newpty) char *newtty, *newpty;
                     81:        Claim a pseudo-tty.
                     82:        Takes pointers to buffers for the names of the newly claimed pair
                     83:        and returns a file descriptor on the open pty.
                     84: 
                     85:        Returns -1 on any sort of failure.  errno will be set to ENXIO
                     86:        if there were no more ptys.
                     87: 
                     88: int select(nfd, *rfds, *wfds, *xfds, *to)
                     89:        int nfd, fd_set *rfds, *wfds, *xfds, struct timeval *to
                     90:        Simulate BSD select() system call with poll().
                     91: 
                     92: void splitter(ofp, line, limit) FILE *ofp; char *line; int limit;
                     93:        Output line to ofp, splitting it into chunks less than
                     94:        limit. Inserts \ between chunks and attempts to do this
                     95:        on whitespace boundaries.  splitter produces a long line
                     96:        rather than split on non-whitespace. If line does not end in
                     97:        \n, splitter adds one.
                     98: 
                     99: int if_COHERENT();
                    100:        Returns 1 if Coherent else 0.
                    101: 
                    102: int is_fs(special) char *special;
                    103:        Checks if a special file is a well-formed file system.
                    104:        Users should never put file systems on /dev/ram1 but
                    105:        for multi-system software, like compress, it is smart
                    106:        to test.
                    107: 
                    108:        Return values:
                    109:        -1      Not a device, cannot open, read or seek failed.
                    110:         0      No filesystem.
                    111:         1      Legal filesystem.
                    112: 
                    113: char * lcase(str) char *str;
                    114:        Converts str to lower case.
                    115: 
                    116: char * match(string, pattern, fin) char *string, *pattern, **fin;
                    117:        Like pnmatch(), except match returns the address of the
                    118:        pattern matched. fin is aimed past the end of the
                    119:        pattern found - that is, match finds a pattern and tells
                    120:        you where it is.
                    121: 
                    122: char *metaphone(char * word)
                    123:        Translates word to a short phonetic equivalent (4 characters
                    124:        controlled by a #define). Charles becomes XRLS. Good for looking
                    125:        up names.
                    126: 
                    127: char * newcpy(str) char* str;
                    128:        Create a NUL-terminated copy of str on the heap.
                    129:        It calls fatal if there is no space.
                    130: 
                    131: char * pathn(name, envpath, deflpath, access)
                    132:     char *name, *envpath, *deflpath, *access;
                    133:        example: pathn("helpfile", "LIBPATH", "/lib", "r")
                    134:        Look for helpfile using the environmental variable
                    135:        LIBPATH.  If that isn't set, or the second parm is NULL,
                    136:        it uses the default path "/lib".  The file found must
                    137:        have read permission.  pathn() returns the full path
                    138:        to the file found.
                    139: 
                    140: double picture (dble, format, output )
                    141:     double dble;    /* the number to format */
                    142:     char  *format;  /* the format mask */
                    143:     char  *output;  /* the output area. At least as large as format */
                    144: 
                    145:        Perform numeric formatting.  This function is superior
                    146:        to anything available under BASIC or COBOL.
                    147: 
                    148:        9    Provide a slot for a number.
                    149:             5.000 passed through a mask of '999 CR' gives '005   '
                    150:            -5.000 passed through a mask of '999 CR' gives '005 CR'
                    151:         Note: C & R are not special to picture. Trailing non-special
                    152:               characters print only if the number is negative
                    153: 
                    154:        Z    Provide a slot for a number but suppress leading zeros.
                    155:             1034.000 passed through a mask of 'ZZZ,ZZZ' gives '  1,034'
                    156:             Note: comma is not special to picture. Embedded non-special
                    157:             characters print only if preceeded by significant digits
                    158:        
                    159:        J    Provide a slot for a number but shrink out lead zeros.
                    160:             1034.000 passed through a mask of 'JJJ,JJJ' gives '1,034'
                    161:        
                    162:        K    Provide a slot for a number but shrink out any zeros.
                    163:             70884.000 passed through a mask of 'K9/K9/K9' gives '7/8/84'
                    164:        
                    165:        $    Float a dollar sign to the front of the displayed number.
                    166:             105.000 passed through a mask of '$ZZZ,ZZZ' gives '    $105'
                    167:        
                    168:        .    Separate the number between decimal and integer portions.
                    169:             105.670 passed through a mask of 'Z,ZZZ.999' gives '  105.670'
                    170:        
                    171:        T    Provide a slot for a number but supresse trailing zeros.
                    172:             105.670 passed through a mask of 'Z,ZZ9.9TT' gives '  105.67 '
                    173:        
                    174:        S    Provide a slot for a number but shrink out trailing zeros.
                    175:             105.670 passed through a mask of 'Z,ZZ9.9SS' gives '  105.67'
                    176:        
                    177:        -    Float a - in front of negative numbers
                    178:             105.000 passed through a mask of '-Z,ZZZ' gives '   105'
                    179:            -105.000 passed through a mask of '-Z,ZZZ' gives '  -105'
                    180:        
                    181:        (    Act like - but prints a (
                    182:             105.000 passed through a mask of '(ZZZ)' gives ' 105 '
                    183:            -5.000 passed through a mask of '(ZZZ)' gives '  (5)'
                    184:        
                    185:        +    Float a + or - in front of the number depending on its sign
                    186:             5.000 passed through a mask of '+ZZZ' gives '  +5'
                    187:            -5.000 passed through a mask of '+ZZZ' gives '  -5'
                    188:        
                    189:        *    Fill all lead spaces to its right
                    190:             104.100 passed through a mask of '*ZZZ,ZZZ.99' gives '*****104.10'
                    191:             104.100 passed through a mask of '*$ZZZ,ZZZ.99' gives '*****$104.10'
                    192:        
                    193:        Any overflow is returned by picture as a double-precision number.
                    194:            -1234.000 passed through a mask of '(ZZZ)' gives '(234)'
                    195:             With an overflow of -1.0
                    196:             123.400 passed through a mask of '99' gives '23'
                    197:             With an overflow of 1.0
                    198:             1200.000 passed through a mask of 'ZZ' gives '00'
                    199:             With an overflow of 12.0
                    200: 
                    201: tm_t* jday_to_tm(jd) jday_t jd;
                    202:        Turn Julian date structure to time date structure.
                    203: 
                    204: time_t jday_to_time(jd) jday_t jd;
                    205:        Turn Julian date structure to COHERENT time.
                    206: 
                    207: void bedaemon()
                    208:        Make the caller a daemon.
                    209: 
                    210:        [From "The New Hacker's Dictionary":]
                    211:        daemon: /day'mn/ or /dee'mn/
                    212: 
                    213:        n.  A program that is not invoked explicitly, but lies dormant
                    214:        waiting for some condition(s) to occur.  The idea is that the
                    215:        perpetrator of the condition need not be aware that a daemon is
                    216:        lurking (though often a program will commit an action only because
                    217:        it knows that it will implicitly invoke a daemon.)...
                    218: 
                    219:        For example, when you submit a program to be
                    220:        printed with 'hpr', your file is copied to
                    221:        /usr/spool/hpd, and then the printer daemon,
                    222:        '/usr/bin/hpd' is notified that there is another
                    223:        file to print.  The advantage is that the user
                    224:        program, 'hpr', need not compete with other user
                    225:        programs for access to the printer--'/usr/bin/hpd'
                    226:        handles all access to the printer.
                    227: 
                    228:        Another example of a daemon in /etc/crond (or
                    229:        /etc/cron).  It spends most of its time waiting.
                    230:        When the time comes about for the next job from
                    231:        crontab, the daemon wakes up and starts the job.
                    232: 
                    233:        As a general rule, anything that does not interact
                    234:        directly with users can be classified as a daemon.
                    235:        Daemons do not generally generate output to a
                    236:        user's terminal.
                    237: 
                    238:        Any time you have a resource, like a printer or
                    239:        database, to which access should be controlled,
                    240:        you can use a daemon.  
                    241: 
                    242: long randl()
                    243:        Return a long random number uniformly distributed in
                    244:        1..2147483562.  This comes from "Communications of the
                    245:        ACM", vol. 31, number 6. It is the best algorithm we know
                    246:        as of this writing.
                    247:        see srandl() in this section.
                    248: 
                    249: char * replace(s1, pat, s3, all, matcher) char *s1, *pat, *s3, (matcher)();
                    250:        Replace one or all occurrences of pat in s1 by s3 and
                    251:        returns the result.  The definition of match is set by matcher.
                    252:        This calls the user-defined function matcher(sw, pat, &fin). The
                    253:        matcher must return the address of the pattern match; e.g.,
                    254:        its end in &fin. match() is a valid example of matcher.
                    255:        It replaces the first occurrence, or all occurrences of the
                    256:        pattern and returns the new pattern. The new pattern has been
                    257:        alloc()ed (see alloc).
                    258: 
                    259: showflag(data, flags, output) long data; char *flags, *output;
                    260:        Turns the bits in data to the flags in flags or '-'
                    261:        in the string output which must be as long as flags.
                    262: 
                    263: char * skip(s1, matcher, fin) char *s1, **fin; int (*matcher)();
                    264:        Skip one or more characters not matching some criterion
                    265:        such as isdigit().  Returns the first character skipped
                    266:        points fin at the character after the skip.
                    267: 
                    268: char * span(s1, matcher, fin) char *s1, **fin; int (*matcher)();
                    269:        Span one or more characters matching some criterion
                    270:        such as isdigit().  Returns the first character spanned
                    271:        points fin at the character after the span.
                    272: 
                    273: srandl(seed1, seed2) long seed1, seed2;
                    274:        randl() needs two seeds this sets them.  Used only
                    275:        if you need to repeat a random number sequence.
                    276: 
                    277: strchtr(from, to, c, def) char *from, *to; int c, def;
                    278:        Look up the char c on the string from, return the corresponding
                    279:        char on the string to if it is found otherwise return the char
                    280:        def. example: strchr("ab", "xy", c, d); if c == 'a' return
                    281:        'x', if c == 'b' return 'y' otherwise return 'd'.
                    282: 
                    283: strcmpl(s1, s2)
                    284:        Case-insensitive string compare.
                    285: 
                    286: #define strlcpy(to, from) memcpy(to, from, sizeof(to))
                    287: 
                    288: jday_t time_to_jday(CoherentTime) time_t CoherentTime;
                    289:        Turn COHERENT time to Julian date structure. This has days
                    290:        form 1/1/4713 BC.
                    291: 
                    292: jday_t tm_to_jday(tm) tm_t *tm;
                    293:        Turn tm structured date to Julian date.
                    294: 
                    295: void tocont()
                    296:        Prints the message "Enter <NL> to continue " and then waits for
                    297:        a new line.
                    298: 
                    299: ucase(s) char *s;
                    300:        Convert a string to upper case.
                    301: 
                    302: char * trim(s) char *s;
                    303:        Remove trailing whitespace from string s.
                    304: 
                    305: usage(s) char *s;
                    306:        Put out a usage: message and exit(1)
                    307: 
                    308: xdump(p, length) char *p;
                    309:        Make a vertical hex dump of p for length on stdout. This
                    310:        is a useful debugging tool. Vertical hex prints as 3 lines
                    311:        The top line is the display character or . if it's not
                    312:        cleanly displayable. The next two lines are the hex digit.
                    313:        The data is blocked in groups of four bytes.
                    314: 
                    315: xopen(filename, acs)
                    316:        Like fopen() but it calls fatal() if the open fails.
                    317: 
                    318: yn(question, ...) char *question;
                    319:        Ask a question with any trailing parms printf style and
                    320:        get a y or n answer. Returns a 1 for 'Y' or 'y' a 0
                    321:        for 'n' or 'N', reasks otherwise.
                    322: 
                    323: For an egrep style regular expression analizer see regsub.doc
                    324: 
                    325: The following are part of a user virtual-memory system for
                    326: COHERENT.  Sometimes users port programs such as compress to
                    327: COHERENT, which have a small number of very large arrays. Since
                    328: COHERENT is a SMALL-model operating system changes need to be
                    329: made. The following functions are intended to expedite these
                    330: changes.
                    331: 
                    332: void vinit(filename, ram) char *filename; unsigned ram;
                    333:        Init the virtual system using filename for work
                    334:        this may be a raw device such as /dev/rram1. ram
                    335:        is the amount of buffer space to give the system
                    336:        the more the better.
                    337: 
                    338: void vshutdown()
                    339:        Shut the virtual system, and make it restartable.
                    340: 
                    341: unsigned vopen(amt) unsigned long amt;
                    342:        Set up a virtual object.  For example, if you want to emulate having
                    343:        a 100,000-byte array and a 50,000 byte array, use
                    344:        vid1 = vopen(100000L); vid2 = vopen(50000L);
                    345:        This does some checking and tells the system that any
                    346:        reference to vid2 will be between 100000 and 150000
                    347:        on the virtual file.
                    348: 
                    349: char *vfind(vid, disp, dirty) unsigned vid, dirty; unsigned long disp;
                    350:        Find a character on the virtual system, mark the blocks
                    351:        dirty bit if the access is to write.  Given the example in
                    352:        vopen, if you want to find the 1000 th byte in vdi1
                    353:        c = vfind(vdi1, 1000L, 0);
                    354:        To change the 2000 th byte in vid2 to d.
                    355:        *(vfind(vid2, 2000L, 1)) = d;
                    356:        Note the dirty indicator tells the system of the change so
                    357:        that the block will be written back before it is read over.
                    358:        Blocks are 512 bytes long so int's or long's can be read
                    359:        or written without multiple accesses to vfind.

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.