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