--- ray/src/cal/lam.c 2014/02/11 17:05:00 1.13 +++ ray/src/cal/lam.c 2016/03/24 19:00:54 1.16 @@ -1,5 +1,5 @@ #ifndef lint -static const char RCSid[] = "$Id: lam.c,v 1.13 2014/02/11 17:05:00 greg Exp $"; +static const char RCSid[] = "$Id: lam.c,v 1.16 2016/03/24 19:00:54 greg Exp $"; #endif /* * lam.c - simple program to laminate files. @@ -19,6 +19,8 @@ static const char RCSid[] = "$Id: lam.c,v 1.13 2014/02 #define MAXLINE 65536 /* maximum input line */ +long incnt = 0; /* limit number of records? */ + FILE *input[MAXFILE]; int bytsiz[MAXFILE]; char *tabc[MAXFILE]; @@ -32,6 +34,7 @@ int argc; char *argv[]; { int unbuff = 0; + int binout = 0; int i; char *curtab; int curbytes; @@ -51,6 +54,9 @@ char *argv[]; break; case 'i': switch (argv[i][2]) { + case 'n': + incnt = atol(argv[++i]); + break; case 'f': curbytes = sizeof(float); break; @@ -79,8 +85,10 @@ char *argv[]; fputs(": input size too big\n", stderr); exit(1); } - if (curbytes) + if (curbytes) { curtab = ""; + ++binout; + } break; case '\0': tabc[nfiles] = curtab; @@ -128,13 +136,20 @@ char *argv[]; exit(1); } } - puteol = 0; /* check for ASCII output */ + if (binout) /* binary output? */ + SET_FILE_BINARY(stdout); +#ifdef getc_unlocked /* avoid lock/unlock overhead */ for (i = nfiles; i--; ) + flockfile(input[i]); + flockfile(stdout); +#endif + puteol = 0; /* any ASCII output at all? */ + for (i = nfiles; i--; ) if (!bytsiz[i] || isprint(tabc[i][0]) || tabc[i][0] == '\t') { puteol++; break; } - for ( ; ; ) { /* main loop */ + do { /* main loop */ for (i = 0; i < nfiles; i++) { if (bytsiz[i]) { /* binary file */ if (fread(buf, bytsiz[i], 1, input[i]) < 1) @@ -157,6 +172,6 @@ char *argv[]; putchar('\n'); if (unbuff) fflush(stdout); - } + } while (--incnt); return(0); }