73 |
|
struct field *outfmt = NULL; /* output record structure */ |
74 |
|
struct strvar *svhead = NULL; /* string variables */ |
75 |
|
|
76 |
+ |
long incnt = 0; /* limit number of input records? */ |
77 |
+ |
long outcnt = 0; /* limit number of output records? */ |
78 |
+ |
|
79 |
|
int blnkeq = 1; /* blanks compare equal? */ |
80 |
|
int igneol = 0; /* ignore end of line? */ |
81 |
|
int passive = 0; /* passive mode (transmit unmatched input) */ |
160 |
|
nbicols = 0; |
161 |
|
readfmt(argv[++i], 0); |
162 |
|
break; |
163 |
+ |
case 'n': |
164 |
+ |
incnt = atol(argv[++i]); |
165 |
+ |
break; |
166 |
|
case 'a': |
167 |
|
itype = 'a'; |
168 |
|
nbicols = 0; |
203 |
|
otype = 'a'; |
204 |
|
readfmt(argv[++i], 1); |
205 |
|
break; |
206 |
+ |
case 'n': |
207 |
+ |
outcnt = atol(argv[++i]); |
208 |
+ |
break; |
209 |
|
case 'a': |
210 |
|
otype = 'a'; |
211 |
|
break; |
332 |
|
putout(); |
333 |
|
++nout; |
334 |
|
} |
335 |
+ |
if (incnt && nrecs >= incnt) |
336 |
+ |
break; |
337 |
+ |
if (outcnt && nout >= outcnt) |
338 |
+ |
break; |
339 |
|
} |
340 |
|
fclose(fp); |
341 |
|
} |
814 |
|
static void |
815 |
|
putrec(void) /* output a record */ |
816 |
|
{ |
817 |
< |
char fmt[32]; |
817 |
> |
char fmt[32], typ[16]; |
818 |
|
int n; |
819 |
|
struct field *f; |
820 |
|
int adlast, adnext; |
821 |
+ |
double dv, av; |
822 |
|
|
823 |
|
adlast = 0; |
824 |
|
for (f = outfmt; f != NULL; f = f->next) { |
849 |
|
break; |
850 |
|
case T_NUM: |
851 |
|
n = f->type & F_WID; |
852 |
+ |
dv = evalue(f->f.ne); |
853 |
+ |
av = fabs(dv); |
854 |
+ |
if (n <= 9) |
855 |
+ |
strcpy(typ, "g"); |
856 |
+ |
else |
857 |
+ |
sprintf(typ, ".%de", n-5); |
858 |
+ |
if (av < 1L<<31) { |
859 |
+ |
long iv = (int)(av + .5); |
860 |
+ |
if (iv && fabs(av-iv) <= av*1e-14) |
861 |
+ |
strcpy(typ, ".0f"); |
862 |
+ |
} |
863 |
|
if (adlast && adnext) |
864 |
< |
strcpy(fmt, "%g"); |
864 |
> |
sprintf(fmt, "%%%s", typ); |
865 |
|
else if (adlast) |
866 |
< |
sprintf(fmt, "%%-%dg", n); |
866 |
> |
sprintf(fmt, "%%-%d%s", n, typ); |
867 |
|
else |
868 |
< |
sprintf(fmt, "%%%dg", n); |
869 |
< |
printf(fmt, evalue(f->f.ne)); |
868 |
> |
sprintf(fmt, "%%%d%s", n, typ); |
869 |
> |
printf(fmt, dv); |
870 |
|
adlast = 1; |
871 |
|
break; |
872 |
|
} |