version 1.32, 2011/04/20 22:28:39 |
version 1.33, 2011/09/28 19:27:18 |
|
|
jmp_buf env; |
jmp_buf env; |
int use_arc4 = 1; |
int use_arc4 = 1; |
extern int pairstack[]; |
extern int pairstack[]; |
|
extern Awkfloat srand_seed; |
|
|
Node *winner = NULL; /* root of parse tree */ |
Node *winner = NULL; /* root of parse tree */ |
Cell *tmps; /* free temporary cells for execution */ |
Cell *tmps; /* free temporary cells for execution */ |
|
|
ap->sval = (char *) makesymtab(NSYMTAB); |
ap->sval = (char *) makesymtab(NSYMTAB); |
|
|
n = 0; |
n = 0; |
|
if (arg3type == REGEXPR && strlen((char*)((fa*)a[2])->restr) == 0) { |
|
/* split(s, a, //); have to arrange that it looks like empty sep */ |
|
arg3type = 0; |
|
fs = ""; |
|
sep = 0; |
|
} |
if (*s != '\0' && (strlen(fs) > 1 || arg3type == REGEXPR)) { /* reg expr */ |
if (*s != '\0' && (strlen(fs) > 1 || arg3type == REGEXPR)) { /* reg expr */ |
fa *pfa; |
fa *pfa; |
if (arg3type == REGEXPR) { /* it's ready already */ |
if (arg3type == REGEXPR) { /* it's ready already */ |
|
|
Cell *x, *y; |
Cell *x, *y; |
Awkfloat u; |
Awkfloat u; |
int t; |
int t; |
|
Awkfloat tmp; |
char *p, *buf; |
char *p, *buf; |
Node *nextarg; |
Node *nextarg; |
FILE *fp; |
FILE *fp; |
static Awkfloat old_seed = 1; |
|
|
|
t = ptoi(a[0]); |
t = ptoi(a[0]); |
x = execute(a[1]); |
x = execute(a[1]); |
|
|
u = (Awkfloat) (random() % RAND_MAX) / RAND_MAX; |
u = (Awkfloat) (random() % RAND_MAX) / RAND_MAX; |
break; |
break; |
case FSRAND: |
case FSRAND: |
u = old_seed; |
|
if (isrec(x)) /* no argument provided, want arc4random() */ |
if (isrec(x)) /* no argument provided, want arc4random() */ |
use_arc4 = 1; |
use_arc4 = 1; |
else { |
else { |
old_seed = getfval(x); |
|
srandom((unsigned int) old_seed); |
|
use_arc4 = 0; |
use_arc4 = 0; |
|
u = getfval(x); |
|
tmp = u; |
|
srandom((unsigned int) u); |
|
u = srand_seed; |
|
srand_seed = tmp; |
} |
} |
break; |
break; |
case FTOUPPER: |
case FTOUPPER: |
|
|
FILE *fp; |
FILE *fp; |
const char *fname; |
const char *fname; |
int mode; /* '|', 'a', 'w' => LE/LT, GT */ |
int mode; /* '|', 'a', 'w' => LE/LT, GT */ |
} files[FOPEN_MAX] ={ |
} *files; |
{ NULL, "/dev/stdin", LT }, /* watch out: don't free this! */ |
|
{ NULL, "/dev/stdout", GT }, |
|
{ NULL, "/dev/stderr", GT } |
|
}; |
|
|
|
|
int nfiles; |
|
|
void stdinit(void) /* in case stdin, etc., are not constants */ |
void stdinit(void) /* in case stdin, etc., are not constants */ |
{ |
{ |
files[0].fp = stdin; |
nfiles = FOPEN_MAX; |
files[1].fp = stdout; |
files = calloc(nfiles, sizeof(*files)); |
files[2].fp = stderr; |
if (files == NULL) |
|
FATAL("can't allocate file memory for %u files", nfiles); |
|
files[0].fp = stdin; |
|
files[0].fname = "/dev/stdin"; |
|
files[0].mode = LT; |
|
files[1].fp = stdout; |
|
files[1].fname = "/dev/stdout"; |
|
files[1].mode = GT; |
|
files[2].fp = stderr; |
|
files[2].fname = "/dev/stderr"; |
|
files[2].mode = GT; |
} |
} |
|
|
FILE *openfile(int a, const char *us) |
FILE *openfile(int a, const char *us) |
|
|
|
|
if (*s == '\0') |
if (*s == '\0') |
FATAL("null file name in print or getline"); |
FATAL("null file name in print or getline"); |
for (i=0; i < FOPEN_MAX; i++) |
for (i=0; i < nfiles; i++) |
if (files[i].fname && strcmp(s, files[i].fname) == 0) { |
if (files[i].fname && strcmp(s, files[i].fname) == 0) { |
if (a == files[i].mode || (a==APPEND && files[i].mode==GT)) |
if (a == files[i].mode || (a==APPEND && files[i].mode==GT)) |
return files[i].fp; |
return files[i].fp; |
|
|
if (a == FFLUSH) /* didn't find it, so don't create it! */ |
if (a == FFLUSH) /* didn't find it, so don't create it! */ |
return NULL; |
return NULL; |
|
|
for (i=0; i < FOPEN_MAX; i++) |
for (i=0; i < nfiles; i++) |
if (files[i].fp == 0) |
if (files[i].fp == 0) |
break; |
break; |
if (i >= FOPEN_MAX) |
if (i >= nfiles) { |
FATAL("%s makes too many open files", s); |
struct files *nf; |
|
int nnf = nfiles + FOPEN_MAX; |
|
nf = realloc(files, nnf * sizeof(*nf)); |
|
if (nf == NULL) |
|
FATAL("cannot grow files for %s and %d files", s, nnf); |
|
memset(&nf[nfiles], 0, FOPEN_MAX * sizeof(*nf)); |
|
nfiles = nnf; |
|
files = nf; |
|
} |
fflush(stdout); /* force a semblance of order */ |
fflush(stdout); /* force a semblance of order */ |
m = a; |
m = a; |
if (a == GT) { |
if (a == GT) { |
|
|
{ |
{ |
int i; |
int i; |
|
|
for (i = 0; i < FOPEN_MAX; i++) |
for (i = 0; i < nfiles; i++) |
if (fp == files[i].fp) |
if (fp == files[i].fp) |
return files[i].fname; |
return files[i].fname; |
return "???"; |
return "???"; |
|
|
x = execute(a[0]); |
x = execute(a[0]); |
getsval(x); |
getsval(x); |
stat = -1; |
stat = -1; |
for (i = 0; i < FOPEN_MAX; i++) { |
for (i = 0; i < nfiles; i++) { |
if (files[i].fname && strcmp(x->sval, files[i].fname) == 0) { |
if (files[i].fname && strcmp(x->sval, files[i].fname) == 0) { |
if (ferror(files[i].fp)) |
if (ferror(files[i].fp)) |
WARNING( "i/o error occurred on %s", files[i].fname ); |
WARNING( "i/o error occurred on %s", files[i].fname ); |
|
|
{ |
{ |
int i; |
int i; |
|
|
for (i = 0; i < FOPEN_MAX; i++) |
for (i = 0; i < nfiles; i++) |
if (files[i].fp) |
if (files[i].fp) |
fflush(files[i].fp); |
fflush(files[i].fp); |
} |
} |