|
|
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.