/*
- * $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 )) {
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 },
};