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

Diff for /src/usr.bin/sed/main.c between version 1.14 and 1.15

version 1.14, 2008/10/09 10:58:32 version 1.15, 2008/10/16 16:34:32
Line 46 
Line 46 
 #include <ctype.h>  #include <ctype.h>
 #include <errno.h>  #include <errno.h>
 #include <fcntl.h>  #include <fcntl.h>
   #include <limits.h>
 #include <regex.h>  #include <regex.h>
 #include <stddef.h>  #include <stddef.h>
 #include <stdio.h>  #include <stdio.h>
Line 159 
Line 160 
  * together.  Empty strings and files are ignored.   * together.  Empty strings and files are ignored.
  */   */
 char *  char *
 cu_fgets(char **outbuf, size_t *outlen)  cu_fgets(char **outbuf, size_t *outsize)
 {  {
         static enum {ST_EOF, ST_FILE, ST_STRING} state = ST_EOF;          static enum {ST_EOF, ST_FILE, ST_STRING} state = ST_EOF;
         static FILE *f;         /* Current open file */          static FILE *f;         /* Current open file */
Line 168 
Line 169 
         size_t len;          size_t len;
         char *p;          char *p;
   
           if (*outbuf == NULL)
                   *outsize = 0;
   
 again:  again:
         switch (state) {          switch (state) {
         case ST_EOF:          case ST_EOF:
Line 196 
Line 200 
         case ST_FILE:          case ST_FILE:
                 if ((p = fgetln(f, &len)) != NULL) {                  if ((p = fgetln(f, &len)) != NULL) {
                         linenum++;                          linenum++;
                         if (len >= *outlen) {                          if (len >= *outsize) {
                                 do {  
                                         *outlen *= 2;  
                                 } while (len >= *outlen);  
                                 free(*outbuf);                                  free(*outbuf);
                                 *outbuf = xmalloc(*outlen);                                  *outsize = ROUNDLEN(len + 1);
                                   *outbuf = xmalloc(*outsize);
                         }                          }
                         memcpy(*outbuf, p, len);                          memcpy(*outbuf, p, len);
                         (*outbuf)[len] = '\0';                          (*outbuf)[len] = '\0';
Line 217 
Line 219 
                 if (linenum == 0 && s[0] == '#' && s[1] == 'n')                  if (linenum == 0 && s[0] == '#' && s[1] == 'n')
                         nflag = 1;                          nflag = 1;
                 p = *outbuf;                  p = *outbuf;
                 len = *outlen;                  len = *outsize;
                 for (;;) {                  for (;;) {
                         if (len-- <= 1) {                          if (len <= 1) {
                                 *outbuf = xrealloc(*outbuf, *outlen * 2);                                  *outbuf = xrealloc(*outbuf,
                                 p = *outbuf + *outlen - len - 1;                                      *outsize + _POSIX2_LINE_MAX);
                                 len += *outlen;                                  p = *outbuf + *outsize - len;
                                 *outlen *= 2;                                  len += _POSIX2_LINE_MAX;
                                   *outsize += _POSIX2_LINE_MAX;
                         }                          }
                         switch (*s) {                          switch (*s) {
                         case '\0':                          case '\0':
Line 245 
Line 248 
                                 return (*outbuf);                                  return (*outbuf);
                         default:                          default:
                                 *p++ = *s++;                                  *p++ = *s++;
                                   len--;
                         }                          }
                 }                  }
         }          }

Legend:
Removed from v.1.14  
changed lines
  Added in v.1.15