|
|
1.1 root 1: /* Copyright 1990, AT&T Bell Labs */
2: #include <stdio.h>
3:
4: typedef unsigned char uchar;
5: typedef unsigned short len_t;
6:
7: /* A record header is immediately followed by its data,
8: dlen bytes long. According to variable "keyed", a
9: key of len klen follows, or is superposed on, the data.
10: All comparisons are strictly lexicographic. */
11:
12: struct rec {
13: struct rec *next;
14: len_t len[2]; /* lengths of data and key strings */
15: /* len[0] bytes of data follow */
16: /* then len[1] (often 0) bytes of key */
17: };
18:
19: #define dlen len[0] /* (virtual field) length of data string */
20: #define klen len[1] /* (virtual field) length of key string */
21: #define MAXREC 0xffff /* bound on dlen or klen */
22: #define MINREC (10*sizeof(struct rec)) /* initial elbow room */
23:
24: #define data(/*struct rec* */r) ((uchar*)((r)+1))
25: #define key(/*struct rec* */r) (data(r)+(r)->dlen)
26:
27: #define succ(/*struct rec* */r) ((struct rec*)(data(r) + ((r)->dlen \
28: + (r)->klen + (sizeof(r)-1))/sizeof(r)*sizeof(r)))
29:
30: struct list {
31: struct rec *head; /* pointer to first record */
32: struct rec *tail; /* pointer to last record */
33: };
34:
35: struct pos {
36: short fieldno;
37: short charno;
38: };
39:
40: /* describes a field of the key
41: coder(dataptr, keyptr, len, fieldptr) encodes
42: data of specified length into a key, observing
43: parameters of the field */
44:
45: struct field {
46: int (*coder)(uchar*, uchar*, int, struct field*);
47: uchar *trans; /* translation table */
48: uchar *keep; /* deletion table */
49: uchar rflag; /* sort in reverse order */
50: uchar bflag; /* skip initial blanks */
51: uchar eflag; /* bflag on end posn */
52: uchar style; /* -k or +pos -pos */
53: struct pos begin; /* where the key begins */
54: struct pos end; /* where it ends */
55: };
56:
57: extern struct list *stack;
58: extern struct list *stackmax;
59: extern struct rec *buffer;
60: extern uchar *bufmax;
61: extern struct rec endfile; /* dummy location with a */
62: #define ENDFILE &endfile /* distinctive pointer value */
63:
64: #define NF 30 /* NF-1 = max number of field specs */
65: #define NP 30 /* NP-1 is largest permitted field number */
66: extern struct field fields[NF];
67: extern int nfields;
68: extern struct field accum[NF];
69: extern int naccum;
70: extern int nmerge;
71:
72: extern char *oname; /* output file name */
73: extern char *tname[]; /* possible temporary directories */
74: extern char **files; /* names of input files */
75: extern int nfiles; /* number of input files */
76: extern int nextfile; /* number of intermediate files */
77:
78: extern int keyed; /* key is separate from data */
79: extern int simplekeyed; /* key not separate but not trivial */
80: extern int aflag;
81: extern int cflag;
82: extern int mflag;
83: extern int uflag;
84: extern int rflag;
85: extern int sflag;
86: extern int signedrflag; /* 1 or -1 for fields[0].rflag 0 or 1*/
87: extern int tab; /* tab char for -t */
88:
89: /* translation and deletion tables */
90: extern uchar ident[];
91: extern uchar fold[];
92: extern uchar all[];
93: extern uchar dict[];
94: extern uchar ascii[];
95:
96: /* key-making functions and room function, which provides
97: a bound on how much space the key will take given the
98: length of the data. Room for Mcode is 1,
99: for tcode 2*len+1, for ncode (len+5)/2.
100: Virtual function would be nice here */
101:
102: extern int tcode(uchar*, uchar*, int, struct field*);
103: extern int Mcode(uchar*, uchar*, int, struct field*);
104: extern int ncode(uchar*, uchar*, int, struct field*);
105: extern int gcode(uchar*, uchar*, int, struct field*);
106: extern int acode(uchar*, uchar*, int, struct field*);
107: #define room(len) (2*(len)+2)
108:
109: extern struct rec *getline(struct rec*, FILE*);
110: extern void printout(struct rec*, FILE*, char*);
111: extern void sort(struct list*, int);
112: extern void merge(int);
113: extern void check(char*);
114: extern int fieldarg(char*, char*);
115: extern int fieldcode(uchar*, uchar*, int, uchar*, struct field*, int);
116: extern void fieldwrapup(void);
117: extern void tabinit(void);
118: extern void tabfree(void);
119: extern void optiony(char*);
120: extern void optionk(char*, struct field*, int*);
121: extern void warn(char*, char*, int);
122: extern void fatal(char*, char*, int);
123: extern FILE *fileopen(char*, char*);
124: extern void fileclose(FILE*, char*);
125: extern char *filename(int);
126: extern int overwrite(int);
127: extern void cleanup(int);
128: extern void setsigs(void(*)(int));
129: extern struct rec* listaccum(struct rec*, struct rec*);
130: extern int doaccum(struct rec*, struct rec*);
131: extern void chkaccum(struct field*);
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.