[BACK]Return to run.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / awk

Diff for /src/usr.bin/awk/run.c between version 1.32 and 1.33

version 1.32, 2011/04/20 22:28:39 version 1.33, 2011/09/28 19:27:18
Line 68 
Line 68 
 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 */
Line 1243 
Line 1244 
         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 */
Line 1474 
Line 1481 
         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]);
Line 1581 
Line 1588 
                         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:
Line 1684 
Line 1693 
         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)
Line 1705 
Line 1722 
   
         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;
Line 1715 
Line 1732 
         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) {
Line 1747 
Line 1772 
 {  {
         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 "???";
Line 1762 
Line 1787 
         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 );
Line 1806 
Line 1831 
 {  {
         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);
 }  }

Legend:
Removed from v.1.32  
changed lines
  Added in v.1.33