rse         98/03/04 04:08:49

  Modified:    src      CHANGES
               src/main util.c
               .        STATUS
  Log:
  The Line Contunuation feature (take 4):
  
  Same as the voted take 3 but I've replaced the *(cp-N) syntax with cp[-N]
  because most of us like this one more.
  
  Submitted by: Ralf S. Engelschall
  Reviewed by:  Jim Jagielski, Dean Gaudet, Martin Kraemer,
                Dirk-Willem van Gulik, Ralf S. Engelschall
  
  Revision  Changes    Path
  1.683     +7 -0      apache-1.3/src/CHANGES
  
  Index: CHANGES
  ===================================================================
  RCS file: /export/home/cvs/apache-1.3/src/CHANGES,v
  retrieving revision 1.682
  retrieving revision 1.683
  diff -u -r1.682 -r1.683
  --- CHANGES   1998/03/04 10:58:06     1.682
  +++ CHANGES   1998/03/04 12:08:45     1.683
  @@ -1,5 +1,12 @@
   Changes with Apache 1.3b6
   
  +  *) Now all configuration files support Unix-style line-continuation via 
  +     the trailing backslash ("\") character. This enables us to write down
  +     complex or just very long directives in a more readable way.  The
  +     backslash character has to be really the last character before the
  +     newline and it has not been prefixed by another (escaping) backslash.
  +     [Ralf S. Engelschall]
  +
     *) When using ProxyPass the ?querystring was not passed correctly.
        [Joel Truher <[EMAIL PROTECTED]>]
   
  
  
  
  1.97      +58 -3     apache-1.3/src/main/util.c
  
  Index: util.c
  ===================================================================
  RCS file: /export/home/cvs/apache-1.3/src/main/util.c,v
  retrieving revision 1.96
  retrieving revision 1.97
  diff -u -r1.96 -r1.97
  --- util.c    1998/03/04 09:45:38     1.96
  +++ util.c    1998/03/04 12:08:47     1.97
  @@ -756,9 +756,49 @@
       /* If a "get string" function is defined, use it */
       if (cfp->getstr != NULL) {
        char *src, *dst;
  -     ++cfp->line_number;
  -     if (cfp->getstr(buf, bufsize, cfp->param) == NULL)
  -         return 1;
  +     char *cp;
  +     char *cbuf = buf;
  +     size_t cbufsize = bufsize;
  +
  +     while (1) {
  +         ++cfp->line_number;
  +         if (cfp->getstr(cbuf, cbufsize, cfp->param) == NULL)
  +             return 1;
  +
  +         /*
  +          *  check for line continuation,
  +          *  i.e. match [^\\]\\[\r]\n only
  +          */
  +         cp = cbuf;
  +         while (cp < cbuf+cbufsize && *cp != '\0')
  +             cp++;
  +         if (cp > cbuf && cp[-1] == LF) {
  +             cp--;
  +             if (cp > cbuf && cp[-1] == CR)
  +                 cp--;
  +             if (cp > cbuf && cp[-1] == '\\') {
  +                 cp--;
  +                 if (!(cp > cbuf && cp[-1] == '\\')) {
  +                     /*
  +                      * line continuation requested -
  +                      * then remove backslash and continue
  +                      */
  +                     cbuf = cp;
  +                     cbufsize -= (cp-cbuf);
  +                     continue;
  +                 }
  +                 else {
  +                     /* 
  +                      * no real continuation because escaped -
  +                      * then just remove escape character
  +                      */
  +                     for ( ; cp < cbuf+cbufsize && *cp != '\0'; cp++)
  +                         cp[0] = cp[1];
  +                 }   
  +             }
  +         }
  +         break;
  +     }
   
        /* Compress the line, reducing all blanks and tabs to one space.
         * Leading and trailing white space is eliminated completely
  @@ -820,6 +860,21 @@
                ++cfp->line_number;
            }
            if (c == EOF || c == 0x4 || c == LF || i >= (bufsize - 2)) {
  +             /* 
  +              *  check for line continuation
  +              */
  +             if (i > 0 && buf[i-1] == '\\') {
  +                 i--;
  +                 if (!(i > 0 && buf[i-1] == '\\')) {
  +                     /* line is continued */
  +                     c = cfp->getch(cfp->param);
  +                     continue;
  +                 }
  +                 /* else nothing needs be done because
  +                  * then the backslash is escaped and
  +                  * we just strip to a single one
  +                  */
  +             }
                /* blast trailing whitespace */
                while (i > 0 && isspace(buf[i - 1]))
                    --i;
  
  
  
  1.173     +1 -10     apache-1.3/STATUS
  
  Index: STATUS
  ===================================================================
  RCS file: /export/home/cvs/apache-1.3/STATUS,v
  retrieving revision 1.172
  retrieving revision 1.173
  diff -u -r1.172 -r1.173
  --- STATUS    1998/03/04 09:59:47     1.172
  +++ STATUS    1998/03/04 12:08:48     1.173
  @@ -65,18 +65,9 @@
       * back out USE_PTHREAD_SERIALIZED_ACCEPT for solaris
       * Ken's abstraction of SERVER_{BUILT,VERSION}
       * Ken's fix for os/unix/os.h and the new -DHIDE functionality
  +    * Ralf's Config File Line Continuation
   
   Available Patches:
  -
  -    * Ralf's [PATCH] Config File Line Continuation (take 3)
  -        <[EMAIL PROTECTED]>
  -        (this version uses strict matching of the backslash, i.e.  no 
trailing
  -        spaces are allowed - this should be now avoid problems)
  -        Status: Ralf +1
  -                Martin +1 (on concept)
  -                Dean +1 (on concept, but -1? because of RAW_ARGS issues?)
  -             Dirk-Willem van Gulik +1
  -             Jim +1
   
       * M.D.Parker's [PATCH] mod_status/1448: Status Information have version
        <[EMAIL PROTECTED]>
  
  
  

Reply via email to