|
|
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.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.