/* (void) pass1(Line *ttl) pass1() passes through the data and defines: struct varsdf vars[MAXVARS] int numvar int maxlinelength int first_dta_line_no int title_trouble For variable i, i=0,...,numvar-1: vars[i].col starting column # vars[i].w width of variable vars[i].name name of variable vars[i].vt 'b' or 's' At this point, full details of the variable's type are not known; 'b' indicates that it is numeric and 's' that it is string. ('b' indicates byte, the "lowest" numerical type, and thus sets up pass2 for promoting types.) Copyright (c) 1992 by CRC */ #include "creatdct.h" /* Forward references */ static void p1_preproc() ; static void p1_upmask() ; static void extend_mask_to() ; static void promote_mask() ; static void demote_mask() ; static void set_initial_vars() ; static void set_varnames() ; static void edit_varnames() ; static int edit_varname() ; static int chkname() ; static void copy_to_t() ; static void pass1_debug() ; void pass1(ttl) Line *ttl ; { int t_numvar ; Mask mask ; Line line ; initline((Line *) &mask) ; (void) getnbline(&line) ; first_dta_line_no = input_line_no() ; eof_okay = 1 ; do { p1_preproc(&line) ; p1_upmask(&mask,&line,0) ; } while(getdtaline(&line) != EndOfFile) ; promote_mask(&mask) ; /* save mask in line */ memcpy((char *)&line, (char *) &mask, sizeof(Line)) ; p1_upmask(&mask,ttl,1) ; demote_mask(&mask) ; set_initial_vars(&mask) ; set_varnames(&mask,ttl) ; edit_varnames() ; copy_to_t() ; t_numvar = numvar ; /* bring mask back */ memcpy((char *) &mask, (char *) &line, sizeof(Line)) ; set_initial_vars(&mask) ; if (t_numvar != numvar) { /* problems .. */ copy_to_t() ; /* use the data */ set_varnames(&mask,ttl) ; /* !! */ edit_varnames() ; title_trouble = 1 ; } else title_trouble = 0 ; if (options.debug) pass1_debug(&mask) ; maxlinelength = mask.n ; } /* --------------------------------------------------------------------- */ /* Internal utilities */ /* (void) p1_preproc(Line *l) ; Line l is converted to NumMarker everywhere something can be converted to a numeric. Double-quoted fields are converted to A's. */ static void p1_preproc(l) Line *l ; { int i ; char *s ; char tok[MAXWIDTH] ; for(s=skipblnk(l->s);*s!='\0';s=skipblnk(s)) { cpytok(tok, s) ; if (tok[0]=='\"' || tok[0]=='\'') { for (i=0;tok[i];i++) *(s+i) = 'A' ; } else if (chkifdbl(tok)==0) { for (i=0;tok[i];i++) *(s+i) = NumMarker ; } s += strlen(tok) ; } } /* Update table Mask is: 9 A ' ' ------------------------------------- Line char is NumMarker 9 A 9 letter A A A blank 9 A ' ' */ static void p1_upmask(mask,l,partial_flg) Mask *mask ; Line *l ; int partial_flg ; { int i ; extend_mask_to(mask,l) ; for (i=0; i < l->n; i++) { if (l->s[i] == NumMarker) { if (mask->s[i]!='A') mask->s[i]='9' ; } else if (l->s[i]!=' ') { if (partial_flg) { if (mask->s[i]==' ') mask->s[i]='A' ; } else mask->s[i]='A' ; } } } static void extend_mask_to(m, l) Mask *m ; Line *l ; { extend_line((Line *) m, l->n) ; } static void demote_mask(m) Mask *m ; { int i ; char *s ; char tok[MAXWIDTH] ; char c ; for(s=skipblnk(m->s);*s!='\0';s=skipblnk(s)) { cpytok(tok, s) ; c = (haschar(tok,'9') ? '9' : 'A') ; for (i=0;tok[i];i++) *(s+i) = c ; s += strlen(tok) ; } } static void promote_mask(m) Mask *m ; { int i ; char *s ; char tok[MAXWIDTH] ; char c ; for(s=skipblnk(m->s);*s!='\0';s=skipblnk(s)) { cpytok(tok, s) ; c = (haschar(tok,'A') ? 'A' : '9') ; for (i=0;tok[i];i++) *(s+i) = c ; s += strlen(tok) ; } } static void set_initial_vars(mask) Mask *mask ; { int vn ; char *s, *s0 ; char tok[MAXWIDTH] ; vn = 0 ; s0 = mask->s ; for(s=skipblnk(mask->s);*s!='\0';s=skipblnk(s)) { cpytok(tok, s) ; if (vn>=MAXVARS) { fprintf(stderr, "%s: too many variables\n",progname) ; exit(BADINPUT_ERROR) ; /*NOTREACHED*/ } vars[vn].vt = (tok[0]=='9' ? TYPE_BYTE : TYPE_STR) ; vars[vn].col= s-s0 ; vars[vn].w = strlen(tok) ; s += vars[vn].w ; vn++ ; } numvar = vn ; } static void set_varnames(mask,ttl) Mask *mask ; Line *ttl ; { int i ; char tok[MAXWIDTH] ; char *s ; extend_line(ttl, mask->n) ; for (i=0;i?/|")<0 && ( (*s=='_')|| (*s>='a' && *s<='z') || (*s>='A' && *s<='Z') ) ? 0 : 1 ) ; } static void copy_to_t() { int i ; for (i=0;in) ; printf("%s\n",mask->s) ; printf("numvar = %d\n",numvar) ; for (i=0;i