|
|
1.1 ! root 1: misc/Read_me 10/11/90 ! 2: ! 3: libmisc.a is a collection of miscellaneous useful user functions ! 4: which can be used by C programmers to increase productivity. ! 5: ! 6: misc.h ! 7: Is a header file with externs and #define's for the ! 8: various functions in libmisc.a ! 9: ! 10: larges.h ! 11: Is a header file for model independent assembler with some ! 12: nice macros like Enter() and Leave. memxch is a good example ! 13: of a user. ! 14: ! 15: char * alloc(n) unsigned n; ! 16: malloc() n bytes and zero them, or put out a fatal error message. ! 17: ! 18: int approx(a, b) double a, b; ! 19: If a and b are within epsilon return 1 else 0. epsilon ! 20: is a visable double. ! 21: ! 22: char * ask(reply, msg, ...) char *reply *msg; ! 23: Puts out msg as a printf style format string using any ! 24: trailing arguments. Gets a line from stdin with gets() ! 25: and returns the address of reply. For example ! 26: sscanf(ask(buff, "%d numbers", 3), &a, &b, &c); ! 27: puts out the message "Enter: 3 numbers " gets a reply ! 28: in buff and hands that to sscanf(). ! 29: ! 30: void banner(word, pad) char *word; int pad; ! 31: Prints word as a banner on stdout preceeded by pad ! 32: spaces. Each letter of the banner is composed of ! 33: occurances of itself. ! 34: ! 35: unsigned short crc16(p) char *p; ! 36: Takes the crc16 of the string p and returns it. Fast ! 37: and perfect for hash tables, diff algorithms etc. ! 38: ! 39: void fatal(msg, ...) char *msg; ! 40: Prints the msg as a printf style format string using ! 41: any trailing arguments. This is preceeded by ! 42: "\nfatal". fatal() then does exit(1). ! 43: ! 44: char * getline(ifp, lineno) FILE *ifp; int *lineno; ! 45: Function to get lines from an input file. ! 46: Returns the address of the line, or NULL for eof. ! 47: ! 48: lineno should usually be started at 1. lineno will ! 49: be incremented by the number of lines in the previous call. ! 50: Thus lineno will be the number of the line just gotten. ! 51: ! 52: # to end of line is passed. ! 53: \ whitespace through end of line is passed. ! 54: \n newline ! 55: \p # ! 56: \a alarm ! 57: \b backspace ! 58: \r carrage return ! 59: \f form feed ! 60: \t tab ! 61: \\ backslash ! 62: \ddd octal number ! 63: all other \ sequences are errors and reported on stderr. ! 64: ! 65: void splitter(ofp, line, limit) FILE *ofp; char *line; int limit; ! 66: Output line to ofp splitting it into chunks less than ! 67: limit. Inserts \ between chunks and attempts to do this ! 68: on whitespace boundarys. Splitter will produce a long line ! 69: rather than split on non whitespace. If line does not end in ! 70: \n splitter will add one. ! 71: ! 72: int is_fs(special) char *special; ! 73: Checks if a special file is a well formed file system. ! 74: Users should never put file systems on /dev/ram1 but ! 75: For multi system software like compress it is smart ! 76: to test. ! 77: ! 78: Return values: ! 79: -1 Not a device, cannot open, read or seek failed. ! 80: 0 No filesystem. ! 81: 1 Legal filesystem. ! 82: ! 83: char * lcase(str) char *str; ! 84: Converts str to lower case. ! 85: ! 86: char * match(string, pattern, fin) char *string, *pattern, **fin; ! 87: Like pnmatch() except match returns the address of the ! 88: pattern matched. fin is aimed past the end of the ! 89: pattern found. That is match finds a pattern and tells ! 90: you where it is. ! 91: ! 92: void memxch(s1, s2, len) char *s1, *s2; ! 93: Exchanges s1 and s2 for len. Fast and in assembler. ! 94: ! 95: char * newcpy(str) char* str; ! 96: Creates a NUL terminated copy of str on the heap. ! 97: It calls fatal if there is no space. ! 98: ! 99: char * pathn(name, envpath, deflpath, access) ! 100: char *name, *envpath, *deflpath, *access; ! 101: example: pathn("helpfile", "LIBPATH", "/lib", "r") ! 102: Looks for helpfile using the environmental variable ! 103: LIBPATH if that isn't set, or the second parm is NULL ! 104: it uses the default path "/lib". The file found must ! 105: have read permission. pathn() returns the full path ! 106: to the file found. ! 107: ! 108: double picture (dble, format, output ) ! 109: double dble; /* the number to format */ ! 110: char *format; /* the format mask */ ! 111: char *output; /* the output area. At least as large as format */ ! 112: ! 113: The picture() function gives C users far better ! 114: numeric formatting ability than COBOL and BASIC users. ! 115: ! 116: 9 Provides a slot for a number. ! 117: 5.000 passed through a mask of '999 CR' gives '005 ' ! 118: -5.000 passed through a mask of '999 CR' gives '005 CR' ! 119: Note: C & R are not special to picture. Trailing non special ! 120: characters print only if the number is negitave ! 121: ! 122: Z Provides a slot for a number but supresses lead zeros. ! 123: 1034.000 passed through a mask of 'ZZZ,ZZZ' gives ' 1,034' ! 124: Note: comma is not special to picture. Imbeded non special ! 125: characters print only if preceeded by significant digits ! 126: ! 127: J Provides a slot for a number but shrinks out lead zeros. ! 128: 1034.000 passed through a mask of 'JJJ,JJJ' gives '1,034' ! 129: ! 130: K Provides a slot for a number but shrinks out any zeros. ! 131: 70884.000 passed through a mask of 'K9/K9/K9' gives '7/8/84' ! 132: ! 133: $ Floats a dollar sign to the front of the displayed number. ! 134: 105.000 passed through a mask of '$ZZZ,ZZZ' gives ' $105' ! 135: ! 136: . Separates the number between decimal and integer portions. ! 137: 105.670 passed through a mask of 'Z,ZZZ.999' gives ' 105.670' ! 138: ! 139: T Provides a slot for a number but supresses trailing zeros. ! 140: 105.670 passed through a mask of 'Z,ZZ9.9TT' gives ' 105.67 ' ! 141: ! 142: S Provides a slot for a number but shrinks out trailing zeros. ! 143: 105.670 passed through a mask of 'Z,ZZ9.9SS' gives ' 105.67' ! 144: ! 145: - Floats a - in front of negitive numbers ! 146: 105.000 passed through a mask of '-Z,ZZZ' gives ' 105' ! 147: -105.000 passed through a mask of '-Z,ZZZ' gives ' -105' ! 148: ! 149: ( Acts like - but prints a ( ! 150: 105.000 passed through a mask of '(ZZZ)' gives ' 105 ' ! 151: -5.000 passed through a mask of '(ZZZ)' gives ' (5)' ! 152: ! 153: + Floats a + or - infront of the number depending on its sign ! 154: 5.000 passed through a mask of '+ZZZ' gives ' +5' ! 155: -5.000 passed through a mask of '+ZZZ' gives ' -5' ! 156: ! 157: * Fills all lead spaces to its right ! 158: 104.100 passed through a mask of '*ZZZ,ZZZ.99' gives '*****104.10' ! 159: 104.100 passed through a mask of '*$ZZZ,ZZZ.99' gives '*****$104.10' ! 160: ! 161: Any overflow is returned by picture as a double precision number. ! 162: -1234.000 passed through a mask of '(ZZZ)' gives '(234)' ! 163: With an overflow of -1.0 ! 164: 123.400 passed through a mask of '99' gives '23' ! 165: With an overflow of 1.0 ! 166: 1200.000 passed through a mask of 'ZZ' gives '00' ! 167: With an overflow of 12.0 ! 168: ! 169: qsort(data, n, size, comp) char *data; int n, size, (*comp)(); ! 170: Is your qsort() strangely slow. There are pathological cases ! 171: which cause qsort to act badly. Example: 1000 items whose ! 172: keys are all 7 and 8; a large array split into two halves ! 173: both of which are already in order. This qsort() detects ! 174: pathological conditions and adjusts. ! 175: ! 176: long randl() ! 177: Returns a long random number uniformly distributed in ! 178: 1..2147483562. This comes from CACM V. 31 N 6. And is ! 179: the best algorithm I know as of this writing. ! 180: see srandl() in this section. ! 181: ! 182: char * replace(s1, pat, s3, all, matcher) char *s1, *pat, *s3, (matcher)(); ! 183: Replaces one or all occurances of pat in s1 by s3 and ! 184: returns the result. The definition of match is set by matcher. ! 185: This calls the user defined function matcher(sw, pat, &fin). The ! 186: matcher must return the address of the pattern match and ! 187: it's end in &fin. match() is a valid example of matcher. ! 188: It replaces the first occurance, or all occurances of the ! 189: pattern and returns the new pattern. The new pattern has been ! 190: alloc()ed (see alloc). ! 191: ! 192: showflag(data, flags, output) long data; char *flags, *output; ! 193: Turns the bits in data to the flags in flags or '-' ! 194: in the string output which must be as long as flags. ! 195: ! 196: char * skip(s1, matcher, fin) char *s1, **fin; int (*matcher)(); ! 197: Skip one or more characters not matching some criterion ! 198: such as isdigit(). Returns the first character skipped ! 199: points fin at the character after the skip. ! 200: ! 201: char * span(s1, matcher, fin) char *s1, **fin; int (*matcher)(); ! 202: Span one or more characters matching some criterion ! 203: such as isdigit(). Returns the first character spanned ! 204: points fin at the character after the span. ! 205: ! 206: srandl(seed1, seed2) long seed1, seed2; ! 207: randl() needs two seeds this sets them. Used only ! 208: if you need to repeat a random number sequence. ! 209: ! 210: strchtr(from, to, c, def) char *from, *to; int c, def; ! 211: Look up the char c on the string from, return the corresponding ! 212: char on the string to if it is found otherwise return the char ! 213: def. example: strchr("ab", "xy", c, d); if c == 'a' return ! 214: 'x', if c == 'b' return 'y' otherwise return 'd'. ! 215: ! 216: strcmpl(s1, s2) ! 217: Case insensative string compare. ! 218: ! 219: #define strlcpy(to, from) memcpy(to, from, sizeof(to)) ! 220: ! 221: ucase(s) char *s; ! 222: Convert a string to upper case. ! 223: ! 224: char * trim(s) char *s; ! 225: Remove trailing whitespace from string s. ! 226: ! 227: usage(s) char *s; ! 228: Put out a usage: message and exit(1) ! 229: ! 230: xdump(p, length) char *p; ! 231: Make a vertical hex dump of p for length on stdout. This ! 232: is a usefull debugging tool. Vertical hex prints as 3 lines ! 233: The top line is the display character or . if it's not ! 234: cleanly displayable. The next two lines are the hex digit. ! 235: The data is blocked in groups of four bytes. ! 236: ! 237: xopen(filename, acs) ! 238: Like fopen() but it calls fatal() if the open fails. ! 239: ! 240: yn(question, ...) char *question; ! 241: Ask a question with any trailing parms printf style and ! 242: get a y or n answer. Returns a 1 for 'Y' or 'y' a 0 ! 243: for 'n' or 'N', reasks otherwise. ! 244: ! 245: The following are part of a user virtual memory system for ! 246: Coherent. Sometimes users port programs such as compress to ! 247: Coherent which have a small number of very large arrays. Since ! 248: Coherent is a small model operating system changes need to be ! 249: made. The following functions are intended to expedite these ! 250: changes. ! 251: ! 252: void vinit(filename, ram) char *filename; unsigned ram; ! 253: Init the virtual system using filename for work ! 254: this may be a raw device such as /dev/rram1. ram ! 255: is the amount of buffer space to give the system ! 256: the more the better. ! 257: ! 258: void vshutdown() ! 259: Shut the virtual system, and make it restartable. ! 260: ! 261: unsigned vopen(amt) unsigned long amt; ! 262: Set up a virtual object. Say you want to emulate having ! 263: a 100000 byte array and a 50000 byte array. use ! 264: vid1 = vopen(100000L); vid2 = vopen(50000L); ! 265: This does some checking and tells the system that any ! 266: reference to vid2 will be between 100000 and 150000 ! 267: on the virtual file. ! 268: ! 269: char *vfind(vid, disp, dirty) unsigned vid, dirty; unsigned long disp; ! 270: Find a character on the virtual system mark the blocks ! 271: dirty bit if the access is to write. Given the example in ! 272: vopen, if you want to find the 1000 th byte in vdi1 ! 273: c = vfind(vdi1, 1000L, 0); ! 274: To change the 2000 th byte in vid2 to d. ! 275: *(vfind(vid2, 2000L, 1)) = d; ! 276: Note the dirty indicator tells the system of the change so ! 277: that the block will be written back before it is read over. ! 278: Blocks are 512 bytes long so int's or long's can be read ! 279: or written without multiple accesses to vfind.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.