]> arthur.barton.de Git - netatalk.git/blobdiff - etc/papd/headers.c
Remove bdb env on exit
[netatalk.git] / etc / papd / headers.c
index dfeea498f48d7e3b4a1abb88dcb3133f12a76d8f..dd315396c16cf226077ccaadb42de66b54f0b90d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: headers.c,v 1.7 2001-06-19 18:04:40 rufustfirefly Exp $
+ * $Id: headers.c,v 1.14 2009-10-29 13:38:15 didg Exp $
  *
  * Copyright (c) 1990,1994 Regents of The University of Michigan.
  * All Rights Reserved.  See COPYRIGHT.
 #include "config.h" 
 #endif /* HAVE_CONFIG_H */
 
-#include <sys/syslog.h>
 #include <sys/param.h>
+#include <string.h>
 #include <stdio.h>
+#include <stdlib.h>
 
 #include <netatalk/at.h>
+#include <atalk/logger.h>
 
 #include "file.h"
 #include "comment.h"
 #include "lp.h"
 
 int ch_title( struct papfile *, struct papfile * );
+int ch_for( struct papfile *, struct papfile * );
 
-int ch_title( in, out )
-    struct papfile     *in, *out;
+static char *get_text(char *start, int linelength)
 {
-    char               *start, *stop, *p, *q, c;
+    char *p, *q;
+    char *t, *ret;
+    char *stop;
+    
+    /* 1023 is arbitrary 255 max for comment but some may be escape \xxx and space and keyword */
+
+    if (linelength > 1023)
+        return NULL;
+
+    t = ret = calloc(1, linelength +1);
+
+    if (!ret)
+        return NULL;
+
+    stop = start + linelength;
+    for ( p = start; p < stop; p++ ) {
+        if ( *p == ':' ) {
+            p++;
+            break;
+        }
+    }
+    
+    for ( ; p < stop; p++ ) {
+        if (*p != ' ' && *p != '\t') {
+            break;
+        }
+    }
+
+    if ( p < stop && *p == '(' ) {
+        int count;
+        /* start with ( then it's a <text> */ 
+        p++;
+        for ( q = p, count = 1; q < stop; q++, t++ ) {
+            if (*q == '(') {
+              count++;
+            }
+            else if ( *q == ')' ) {
+                count--;
+                if (!count) {
+                    break;
+                }
+            }
+            *t = *q;
+        }
+    }
+    else {
+        /* it's a textline */
+        for ( q = p; q < stop; q++, t++ ) {
+            *t = *q;
+        }
+    }
+    return ret;
+}
+
+int ch_for( struct papfile *in, struct papfile *out _U_)
+{
+    char                *start, *cmt;
+    int                 linelength, crlflength;
+
+    switch ( markline( in, &start, &linelength, &crlflength )) {
+    case 0 :
+        return( 0 );
+
+    case -1 :
+        return( CH_MORE );
+
+    case -2 :
+        return( CH_ERROR );
+    }
+
+    cmt = get_text(start, linelength);
+
+    if ( cmt ) {
+       lp_for ( cmt );
+       free(cmt);
+    }
+
+    in->pf_state |= PF_TRANSLATE;
+    lp_write( in, start, linelength + crlflength );
+    in->pf_state &= ~PF_TRANSLATE;
+    compop();
+    CONSUME( in, linelength + crlflength );
+    return( CH_DONE );
+}
+
+int ch_title( struct papfile *in, struct papfile *out _U_)
+{
+    char               *start, *cmt;
     int                        linelength, crlflength;
 
     switch ( markline( in, &start, &linelength, &crlflength )) {
@@ -33,45 +122,209 @@ int ch_title( in, out )
 
     case -1 :
        return( CH_MORE );
-    }
 
-    stop = start + linelength;
-    for ( p = start; p < stop; p++ ) {
-       if ( *p == ':' ) {
-           break;
-       }
+    case -2 :
+        return( CH_ERROR );
     }
 
-    for ( ; p < stop; p++ ) {
-       if ( *p == '(' ) {
-           break;
-       }
+#ifdef DEBUG
+    LOG(log_debug9, logtype_papd, "Parsing %%Title");
+#endif
+
+    cmt = get_text(start, linelength);
+
+    if ( cmt ) {
+       lp_job( cmt );
+       free(cmt);
     }
 
-    for ( q = p; q < stop; q++ ) {
-       if ( *q == ')' ) {
-           break;
-       }
+    in->pf_state |= PF_TRANSLATE;
+    lp_write( in, start, linelength + crlflength );
+    in->pf_state &= ~PF_TRANSLATE;
+    compop();
+    CONSUME( in, linelength + crlflength );
+    return( CH_DONE );
+}
+
+static int guess_creator ( char *creator )
+{
+       if (strstr(creator, "LaserWriter"))
+               return 1;
+       if (strstr(creator, "cgpdftops"))
+               return 2;
+
+       return 0;
+}
+
+
+int ch_creator( struct papfile *in, struct papfile *out _U_)
+{
+    char               *start, *cmt;
+    int                        linelength, crlflength;
+
+    switch ( markline( in, &start, &linelength, &crlflength )) {
+    case 0 :
+       return( 0 );
+
+    case -1 :
+       return( CH_MORE );
+
+    case -2 :
+        return( CH_ERROR );
     }
 
-    if ( q < stop && p < stop ) {
-       p++;
-       c = *q;
-       *q = '\0';
-       lp_job( p );
-       *q = c;
+    cmt = get_text(start, linelength);
+
+    if ( cmt ) {
+       in->origin = guess_creator ( cmt );
+       free(cmt);
+       lp_origin(in->origin);
     }
 
-    lp_write( start, linelength + crlflength );
+    in->pf_state |= PF_TRANSLATE;
+    lp_write( in, start, linelength + crlflength );
+    in->pf_state &= ~PF_TRANSLATE;
     compop();
     CONSUME( in, linelength + crlflength );
     return( CH_DONE );
 }
 
+int ch_endcomm( struct papfile *in, struct papfile *out _U_)
+{
+    char                *start;
+    int                 linelength, crlflength;
+
+#ifdef DEBUG
+    LOG(log_debug9, logtype_papd, "End Comment");
+#endif
+    in->pf_state |= PF_STW;
+
+    switch ( markline( in, &start, &linelength, &crlflength )) {
+    case 0 :
+       return( 0 );
+
+    case -1 :
+       return( CH_MORE );
+
+    case -2 :
+        return( CH_ERROR );
+    }
+
+    in->pf_state |= PF_TRANSLATE;
+    lp_write( in, start, linelength + crlflength );
+    in->pf_state &= ~PF_TRANSLATE;
+    compop();
+    CONSUME( in, linelength + crlflength );
+    return ( CH_DONE);
+}
+
+int ch_starttranslate( struct papfile *in, struct papfile *out _U_)
+{
+    char                *start;
+    int                 linelength, crlflength;
+
+#ifdef DEBUG
+    LOG(log_debug9, logtype_papd, "Start translate");
+#endif
+
+    switch ( markline( in, &start, &linelength, &crlflength )) {
+    case 0 :
+        return( 0 );
+
+    case -1 :
+        return( CH_MORE );
+
+    case -2 :
+        return( CH_ERROR );
+    }
+
+    in->pf_state |= PF_TRANSLATE;
+    lp_write( in, start, linelength + crlflength );
+    compop();
+    CONSUME( in, linelength + crlflength );
+    return ( CH_DONE);
+}
+
+int ch_endtranslate(struct papfile *in, struct papfile *out _U_)
+{
+    char                *start;
+    int                 linelength, crlflength;
+
+#ifdef DEBUG
+    LOG(log_debug9, logtype_papd, "EndTranslate");
+#endif
+
+    switch ( markline( in, &start, &linelength, &crlflength )) {
+    case 0 :
+        return( 0 );
+
+    case -1 :
+        return( CH_MORE );
+
+    case -2 :
+        return( CH_ERROR );
+    }
+
+    lp_write( in, start, linelength + crlflength );
+    in->pf_state &= ~PF_TRANSLATE;
+    compop();
+    CONSUME( in, linelength + crlflength );
+    return ( CH_DONE);
+}
+
+int ch_translateone( struct papfile *in, struct papfile *out _U_)
+{
+    char                *start;
+    int                 linelength, crlflength;
+
+#ifdef DEBUG
+    LOG(log_debug9, logtype_papd, "TranslateOne");
+#endif
+
+    switch ( markline( in, &start, &linelength, &crlflength )) {
+    case 0 :
+        return( 0 );
+
+    case -1 :
+        return( CH_MORE );
+
+    case -2 :
+        return( CH_ERROR );
+    }
+
+    in->pf_state |= PF_TRANSLATE;
+    lp_write( in, start, linelength + crlflength );
+    in->pf_state &= ~PF_TRANSLATE;
+    compop();
+    CONSUME( in, linelength + crlflength );
+    return ( CH_DONE);
+}
+
+
+
+
 /*
  * "Header" comments.
  */
 struct papd_comment    headers[] = {
-    { "%%Title:",                      0,              ch_title,       0 },
-    { 0 },
+    { "%%Title:",                      NULL,           ch_title,       0 },
+    { "%%For:",                                NULL,           ch_for,         0 },
+    { "%%Creator:",                    NULL,           ch_creator,     0 },
+    { "%%EndComments",                 NULL,           ch_endcomm,     0 },
+    { "%%BeginFeature",                        NULL,           ch_starttranslate,  0 },
+    { "%%EndFeature",                  NULL,           ch_endtranslate,  0 },
+    { "%%BeginPageSetup",              NULL,           ch_starttranslate, 0 },
+    { "%%EndPageSetup",                        NULL,           ch_endtranslate, 0 },
+#if 0
+    { "%%BeginSetup",                  NULL,           ch_translateone,  0 },
+    { "%%EndSetup",                    NULL,           ch_translateone,  0 },
+    { "%%BeginProlog",                 NULL,           ch_translateone,  0 },
+    { "%%EndProlog",                   NULL,           ch_translateone,  0 },
+    { "%%Page:",                       NULL,           ch_translateone, 0 },
+    { "%%PageTrailer",                 NULL,           ch_translateone, 0 },
+    { "%%Trailer",                     NULL,           ch_translateone, 0 },
+    { "%%EOF",                         NULL,           ch_translateone, 0 },
+#endif
+    { "%%",                            NULL,           ch_translateone, 0 },
+    { NULL,                            NULL,           NULL,           0 },
 };