| 31 |  |  | 
| 32 |  | #define  MAXLINE        2048 | 
| 33 |  |  | 
| 34 | + | extern time_t           timegm(struct tm *tm); | 
| 35 | + |  | 
| 36 |  | const char  HDRSTR[] = "#?";            /* information header magic number */ | 
| 37 |  |  | 
| 38 |  | const char  FMTSTR[] = "FORMAT=";       /* format identifier */ | 
| 43 |  | static gethfunc mycheck; | 
| 44 |  |  | 
| 45 |  |  | 
| 46 | < | extern void | 
| 46 | > | void | 
| 47 |  | newheader(              /* identifying line of information header */ | 
| 48 | < | char  *s, | 
| 48 | > | const char  *s, | 
| 49 |  | FILE  *fp | 
| 50 |  | ) | 
| 51 |  | { | 
| 55 |  | } | 
| 56 |  |  | 
| 57 |  |  | 
| 58 | < | extern int | 
| 58 | > | int | 
| 59 |  | headidval(                      /* get header id (return true if is id) */ | 
| 60 |  | char  *r, | 
| 61 | < | char    *s | 
| 61 | > | const char      *s | 
| 62 |  | ) | 
| 63 |  | { | 
| 64 |  | const char  *cp = HDRSTR; | 
| 71 |  | } | 
| 72 |  |  | 
| 73 |  |  | 
| 74 | < | extern int | 
| 74 | > | int | 
| 75 |  | dateval(                /* convert capture date line to UTC */ | 
| 76 |  | time_t  *tloc, | 
| 77 | < | char    *s | 
| 77 | > | const char      *s | 
| 78 |  | ) | 
| 79 |  | { | 
| 80 |  | struct tm       tms; | 
| 97 |  | } | 
| 98 |  |  | 
| 99 |  |  | 
| 100 | < | extern int | 
| 100 | > | int | 
| 101 |  | gmtval(                 /* convert GMT date line to UTC */ | 
| 102 |  | time_t  *tloc, | 
| 103 | < | char    *s | 
| 103 | > | const char      *s | 
| 104 |  | ) | 
| 105 |  | { | 
| 106 |  | struct tm       tms; | 
| 122 |  | } | 
| 123 |  |  | 
| 124 |  |  | 
| 125 | < | extern void | 
| 125 | > | void | 
| 126 |  | fputdate(               /* write out the given time value (local & GMT) */ | 
| 127 |  | time_t  tv, | 
| 128 |  | FILE    *fp | 
| 143 |  | } | 
| 144 |  |  | 
| 145 |  |  | 
| 146 | < | extern void | 
| 146 | > | void | 
| 147 |  | fputnow(                        /* write out the current time */ | 
| 148 |  | FILE    *fp | 
| 149 |  | ) | 
| 154 |  | } | 
| 155 |  |  | 
| 156 |  |  | 
| 157 | < | extern void | 
| 157 | > | void | 
| 158 |  | printargs(              /* print arguments to a file */ | 
| 159 |  | int  ac, | 
| 160 |  | char  **av, | 
| 168 |  | } | 
| 169 |  |  | 
| 170 |  |  | 
| 171 | < | extern int | 
| 171 | > | int | 
| 172 |  | formatval(                      /* get format value (return true if format) */ | 
| 173 | < | char  *r, | 
| 174 | < | char  *s | 
| 173 | > | char  fmt[MAXFMTLEN], | 
| 174 | > | const char  *s | 
| 175 |  | ) | 
| 176 |  | { | 
| 177 |  | const char  *cp = FMTSTR; | 
| 178 | + | char  *r = fmt; | 
| 179 |  |  | 
| 180 |  | while (*cp) if (*cp++ != *s++) return(0); | 
| 181 |  | while (isspace(*s)) s++; | 
| 183 |  | if (r == NULL) return(1); | 
| 184 |  | do | 
| 185 |  | *r++ = *s++; | 
| 186 | < | while(*s && !isspace(*s)); | 
| 186 | > | while (*s && !isspace(*s) && r-fmt < MAXFMTLEN-1); | 
| 187 |  | *r = '\0'; | 
| 188 |  | return(1); | 
| 189 |  | } | 
| 190 |  |  | 
| 191 |  |  | 
| 192 | < | extern void | 
| 192 | > | void | 
| 193 |  | fputformat(             /* put out a format value */ | 
| 194 | < | char  *s, | 
| 194 | > | const char  *s, | 
| 195 |  | FILE  *fp | 
| 196 |  | ) | 
| 197 |  | { | 
| 201 |  | } | 
| 202 |  |  | 
| 203 |  |  | 
| 204 | < | extern int | 
| 204 | > | int | 
| 205 |  | getheader(              /* get header from file */ | 
| 206 |  | FILE  *fp, | 
| 207 |  | gethfunc *f, | 
| 208 |  | void  *p | 
| 209 |  | ) | 
| 210 |  | { | 
| 211 | + | int   rtotal = 0; | 
| 212 |  | char  buf[MAXLINE]; | 
| 213 | + | int   firstc = fgetc(fp); | 
| 214 |  |  | 
| 215 | + | if (!isprint(firstc)) | 
| 216 | + | return(-1);                             /* messed up */ | 
| 217 | + | ungetc(firstc, fp); | 
| 218 |  | for ( ; ; ) { | 
| 219 | + | int     rval = 0; | 
| 220 |  | buf[MAXLINE-2] = '\n'; | 
| 221 |  | if (fgets(buf, MAXLINE, fp) == NULL) | 
| 222 |  | return(-1); | 
| 223 | < | if (buf[0] == '\n') | 
| 224 | < | return(0); | 
| 216 | < | #ifdef MSDOS | 
| 217 | < | if (buf[0] == '\r' && buf[1] == '\n') | 
| 218 | < | return(0); | 
| 219 | < | #endif | 
| 223 | > | if (buf[buf[0]=='\r'] == '\n')          /* end of header? */ | 
| 224 | > | return(rtotal); | 
| 225 |  | if (buf[MAXLINE-2] != '\n') { | 
| 226 |  | ungetc(buf[MAXLINE-2], fp);     /* prevent false end */ | 
| 227 |  | buf[MAXLINE-2] = '\0'; | 
| 228 |  | } | 
| 229 | < | if (f != NULL && (*f)(buf, p) < 0) | 
| 229 | > | if (f != NULL && (rval = (*f)(buf, p)) < 0) | 
| 230 |  | return(-1); | 
| 231 | + | rtotal += rval; | 
| 232 |  | } | 
| 233 |  | } | 
| 234 |  |  | 
| 235 |  |  | 
| 236 |  | struct check { | 
| 237 |  | FILE    *fp; | 
| 238 | < | char    fs[64]; | 
| 238 | > | char    fs[MAXFMTLEN]; | 
| 239 |  | }; | 
| 240 |  |  | 
| 241 |  |  | 
| 245 |  | void  *cp | 
| 246 |  | ) | 
| 247 |  | { | 
| 248 | < | if (!formatval(((struct check*)cp)->fs, s) | 
| 249 | < | && ((struct check*)cp)->fp != NULL) { | 
| 250 | < | fputs(s, ((struct check*)cp)->fp); | 
| 251 | < | } | 
| 248 | > | struct check    *scp = (struct check *)cp; | 
| 249 | > |  | 
| 250 | > | if (!formatval(scp->fs, s) && scp->fp != NULL) | 
| 251 | > | fputs(s, scp->fp); | 
| 252 | > |  | 
| 253 |  | return(0); | 
| 254 |  | } | 
| 255 |  |  | 
| 256 |  |  | 
| 257 | < | extern int | 
| 257 | > | int | 
| 258 |  | globmatch(                      /* check for match of s against pattern p */ | 
| 259 | < | char    *p, | 
| 260 | < | char    *s | 
| 259 | > | const char      *p, | 
| 260 | > | const char      *s | 
| 261 |  | ) | 
| 262 |  | { | 
| 263 |  | int     setmatch; | 
| 271 |  | case '*':                       /* match any string */ | 
| 272 |  | while (p[1] == '*') p++; | 
| 273 |  | do | 
| 274 | < | if ( (p[1]=='?' || p[1]==*s) && | 
| 274 | > | if ( (p[1]=='?') | (p[1]==*s) && | 
| 275 |  | globmatch(p+1,s) ) | 
| 276 |  | return(1); | 
| 277 |  | while (*s++); | 
| 284 |  | if (!*p) | 
| 285 |  | return(0); | 
| 286 |  | if (*p == '-') { | 
| 287 | < | setmatch += p[-1] <= *s && *s <= p[1]; | 
| 287 | > | setmatch += (p[-1] <= *s && *s <= p[1]); | 
| 288 |  | if (!*++p) | 
| 289 |  | break; | 
| 290 |  | } else | 
| 291 | < | setmatch += *p == *s; | 
| 291 | > | setmatch += (*p == *s); | 
| 292 |  | } | 
| 293 |  | if (!setmatch) | 
| 294 |  | return(0); | 
| 322 |  | * if fout is not NULL. | 
| 323 |  | */ | 
| 324 |  |  | 
| 325 | < | extern int | 
| 325 | > | int | 
| 326 |  | checkheader( | 
| 327 |  | FILE  *fin, | 
| 328 | < | char  *fmt, | 
| 328 | > | char  fmt[MAXFMTLEN], | 
| 329 |  | FILE  *fout | 
| 330 |  | ) | 
| 331 |  | { |