|
@@ -1454,14 +1454,20 @@ Cell *bltin(Node **a, int n) /* builtin functions. a[0] is type, a[1] is arg lis
|
|
|
char mbc[50];
|
|
|
Node *nextarg;
|
|
|
FILE *fp;
|
|
|
+ void flush_all(void);
|
|
|
|
|
|
t = ptoi(a[0]);
|
|
|
x = execute(a[1]);
|
|
|
nextarg = a[1]->nnext;
|
|
|
switch (t) {
|
|
|
case FLENGTH:
|
|
|
- p = getsval(x);
|
|
|
- u = (Awkfloat) countposn(p, strlen(p)); break;
|
|
|
+ if (isarr(x))
|
|
|
+ u = ((Array *) x->sval)->nelem; /* GROT. should be function*/
|
|
|
+ else {
|
|
|
+ p = getsval(x);
|
|
|
+ u = (Awkfloat) countposn(p, strlen(p));
|
|
|
+ }
|
|
|
+ break;
|
|
|
case FLOG:
|
|
|
u = errcheck(log(getfval(x)), "log"); break;
|
|
|
case FINT:
|
|
@@ -1518,7 +1524,10 @@ Cell *bltin(Node **a, int n) /* builtin functions. a[0] is type, a[1] is arg lis
|
|
|
free(buf);
|
|
|
return x;
|
|
|
case FFLUSH:
|
|
|
- if ((fp = openfile(FFLUSH, getsval(x))) == NULL)
|
|
|
+ if (isrec(x) || strlen(getsval(x)) == 0) {
|
|
|
+ flush_all(); /* fflush() or fflush("") -> all */
|
|
|
+ u = 0;
|
|
|
+ } else if ((fp = openfile(FFLUSH, getsval(x))) == NULL)
|
|
|
u = EOF;
|
|
|
else
|
|
|
u = fflush(fp);
|
|
@@ -1713,6 +1722,15 @@ void closeall(void)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+void flush_all(void)
|
|
|
+{
|
|
|
+ int i;
|
|
|
+
|
|
|
+ for (i = 0; i < FOPEN_MAX; i++)
|
|
|
+ if (files[i].fp)
|
|
|
+ fflush(files[i].fp);
|
|
|
+}
|
|
|
+
|
|
|
void backsub(char **pb_ptr, char **sptr_ptr);
|
|
|
|
|
|
Cell *sub(Node **a, int nnn) /* substitute command */
|