/* * $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. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif /* HAVE_CONFIG_H */ #include #include #include #include #include #include #include "file.h" #include "comment.h" #include "lp.h" int ch_title( struct papfile *, struct papfile * ); int ch_for( struct papfile *, struct papfile * ); static char *get_text(char *start, int linelength) { 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 */ 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 0 : return( 0 ); case -1 : return( CH_MORE ); case -2 : return( CH_ERROR ); } #ifdef DEBUG LOG(log_debug9, logtype_papd, "Parsing %%Title"); #endif cmt = get_text(start, linelength); if ( cmt ) { lp_job( 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 ); } 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 ); } cmt = get_text(start, linelength); if ( cmt ) { in->origin = guess_creator ( cmt ); free(cmt); lp_origin(in->origin); } 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:", 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 }, };