Annotation of researchv10no/cmd/sort/fsort.h, revision 1.1.1.1

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*);

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.