]> arthur.barton.de Git - netatalk.git/blobdiff - etc/papd/file.c
Remove bdb env on exit
[netatalk.git] / etc / papd / file.c
index 63f08a06c6738304920dcf825d4af2de4c8cd921..068b5d71634418e09f884d0e86e09e2f0df1171b 100644 (file)
@@ -1,9 +1,15 @@
 /*
+ * $Id: file.c,v 1.12 2009-10-14 02:24:05 didg Exp $
+ *
  * Copyright (c) 1990,1994 Regents of The University of Michigan.
  * All Rights Reserved.  See COPYRIGHT.
  */
 
-#include <sys/syslog.h>
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+#include <atalk/logger.h>
 #include <sys/param.h>
 #include <stdio.h>
 #include <stdlib.h>
 
 #include "file.h"
 
-markline( start, stop, pf )
-    char               **start, **stop;
-    struct papfile     *pf;
+/* 
+*/
+int markline( struct papfile *pf, char **start, int *linelength, int *crlflength )
 {
     char               *p;
 
-    if ( PF_BUFSIZ( pf ) == 0 && ( pf->pf_state & PF_EOF )) {
+    if ( pf->pf_datalen == 0 && ( pf->pf_state & PF_EOF )) {
        return( 0 );
     }
 
+    *start = pf->pf_data;
+
     /* get a line */
-    for ( p = pf->pf_cur; p < pf->pf_end; p++ ) {
-       if ( *p == '\n' || *p == '\r' ) {
+    for ( *linelength=0; *linelength < pf->pf_datalen; (*linelength)++) {
+       if (pf->pf_data[*linelength] == '\n' ||
+           pf->pf_data[*linelength] == '\r') {
            break;
        }
     }
-    if ( p >= pf->pf_end ) {
+
+    if ( *linelength >= pf->pf_datalen ) {
        if ( pf->pf_state & PF_EOF ) {
-           APPEND( pf, "\n", 1 );
-       } else {
+           append( pf, "\n", 1 );
+       } else if (*linelength < 1024) {
            return( -1 );
        }
     }
 
-    *start = pf->pf_cur;
-    *stop = p;
-    if ( *stop == *start ) {
-       return( 1 );                    /* don't return len 0 lines */
-    } else {
-       return( *stop - *start );
-    }
-}
+    p = pf->pf_data + *linelength;
 
-consumetomark( start, stop, pf )
-    char               *start, *stop;
-    struct papfile     *pf;
-{
-    if ( start != pf->pf_cur || pf->pf_cur > stop || stop > pf->pf_end ) {
-       abort();
+    *crlflength=0;
+    while(*crlflength < pf->pf_datalen-*linelength && 
+    (p[*crlflength]=='\r' || p[*crlflength]=='\n')) {
+       (*crlflength)++;
     }
-
-    pf->pf_cur = stop + 1;             /* past the stop char */
-    if ( pf->pf_cur > pf->pf_end ) {
-       abort();
-    }
-    if ( pf->pf_cur == pf->pf_end ) {
-       pf->pf_cur = pf->pf_end = pf->pf_buf;
+    
+    if (!*crlflength) {
+        /* line is way too long, something fishy is going on, give up */
+        LOG(log_error, logtype_papd, "markline: no crlf in comment, give up" );
+        return( -2 );
     }
 
-    return;
+    /* success, return 1 */
+    return( 1 );
 }
 
-morespace( pf, data, len )
-    struct papfile     *pf;
-    char               *data;
-    int                        len;
+void morespace(struct papfile *pf, const char *data, int len)
 {
     char               *nbuf;
     int                        nsize;
 
-    if ( pf->pf_cur != pf->pf_buf ) {                  /* pull up */
-       bcopy( pf->pf_cur, pf->pf_buf, PF_BUFSIZ( pf ));
-       pf->pf_end = pf->pf_buf + PF_BUFSIZ( pf );
-       pf->pf_cur = pf->pf_buf;
+    if ( pf->pf_data != pf->pf_buf ) {                 /* pull up */
+       bcopy( pf->pf_data, pf->pf_buf, pf->pf_datalen);
+       pf->pf_data = pf->pf_buf;
     }
 
-    if ( pf->pf_end + len > pf->pf_buf + pf->pf_len ) {        /* make more space */
-       nsize = (( pf->pf_len + len ) / PF_MORESPACE +
-               (( pf->pf_len + len ) % PF_MORESPACE != 0 )) * PF_MORESPACE;
+    if ( pf->pf_datalen + len > pf->pf_bufsize ) {     /* make more space */
+       nsize = (( pf->pf_bufsize + len ) / PF_MORESPACE +
+               (( pf->pf_bufsize + len ) % PF_MORESPACE != 0 )) * PF_MORESPACE;
        if ( pf->pf_buf ) {
-           if (( nbuf = (char *)realloc( pf->pf_buf, nsize )) == 0 ) {
+           if (( nbuf = (char *)realloc( pf->pf_buf, nsize )) == NULL ) {
                exit( 1 );
            }
        } else {
-           if (( nbuf = (char *)malloc( nsize )) == 0 ) {
+           if (( nbuf = (char *)malloc( nsize )) == NULL ) {
                exit( 1 );
            }
        }
-       pf->pf_len = nsize;
-       pf->pf_end = nbuf + ( pf->pf_end - pf->pf_buf );
-       pf->pf_cur = nbuf + ( pf->pf_cur - pf->pf_buf );
+       pf->pf_bufsize = nsize;
+       pf->pf_data = nbuf + ( pf->pf_data - pf->pf_buf );
        pf->pf_buf = nbuf;
     }
 
-    bcopy( data, pf->pf_end, len );
-    pf->pf_end += len;
+    bcopy( data, pf->pf_data + pf->pf_datalen, len );
+    pf->pf_datalen += len;
+}
+
+
+void append(struct papfile *pf, const char *data, int len)
+{
+    if ((pf->pf_data + pf->pf_datalen + len) >
+       (pf->pf_buf + pf->pf_bufsize)) {
+               morespace(pf, data, len);
+    } else {
+       memcpy(pf->pf_data + pf->pf_datalen, data, len);
+       pf->pf_datalen += len;
+    }
 }
 
-spoolerror( out, str )
-    struct papfile     *out;
-    char               *str;
+
+void spoolerror(struct papfile *out, char *str)
 {
     char       *pserr1 = "%%[ Error: ";
     char       *pserr2 = " ]%%\n";
@@ -110,7 +116,7 @@ spoolerror( out, str )
        str = "Spooler error.";
     }
 
-    APPEND( out, pserr1, strlen( pserr1 ));
-    APPEND( out, str, strlen( str ));
-    APPEND( out, pserr2, strlen( pserr2 ));
+    append( out, pserr1, strlen( pserr1 ));
+    append( out, str, strlen( str ));
+    append( out, pserr2, strlen( pserr2 ));
 }