]> arthur.barton.de Git - netatalk.git/blob - etc/papd/magics.c
dea2c009ab0f8db842e8fd796107bcc4e397fa49
[netatalk.git] / etc / papd / magics.c
1 /*
2  * Copyright (c) 1990,1994 Regents of The University of Michigan.
3  * All Rights Reserved.  See COPYRIGHT.
4  */
5
6 #include <sys/syslog.h>
7 #include <sys/param.h>
8 #include <stdio.h>
9 #include <string.h>
10
11 #include "file.h"
12 #include "comment.h"
13
14 ps( infile, outfile )
15     struct papfile      *infile, *outfile;
16 {
17     char                        *start, *stop;
18     struct comment              *comment;
19
20     for (;;) {
21         if ( comment = compeek()) {
22             switch( (*comment->c_handler)( infile, outfile )) {
23             case CH_DONE :
24                 continue;
25
26             case CH_MORE :
27                 return( CH_MORE );
28
29             default :
30                 return( CH_ERROR );
31             }
32
33         } else {
34             switch ( markline( &start, &stop, infile )) {
35             case 0 :
36                 /* eof on infile */
37                 outfile->pf_state |= PF_EOF;
38                 lp_close();
39                 return( 0 );
40
41             case -1 :
42                 return( 0 );
43             }
44
45             if ( infile->pf_state & PF_BOT ) {
46                 if (( comment = commatch( start, stop, magics )) != NULL ) {
47                     compush( comment );
48                     continue;   /* top of for (;;) */
49                 }
50                 infile->pf_state &= ~PF_BOT;
51
52                 /* set up spool file */
53                 if ( lp_open( outfile ) < 0 ) {
54                     syslog( LOG_ERR, "lp_open failed" );
55                     spoolerror( outfile, "Ignoring job." );
56                 }
57             }
58
59             /* write to file */
60             *stop = '\n';
61             lp_write( start, stop - start + 1 );
62             consumetomark( start, stop, infile );
63         }
64     }
65 }
66
67 cm_psquery( in, out )
68     struct papfile      *in, *out;
69 {
70     struct comment      *comment;
71     char                *start, *stop;
72
73     for (;;) {
74         switch ( markline( &start, &stop, in )) {
75         case 0 :
76             /* eof on infile */
77             out->pf_state |= PF_EOF;
78             compop();
79             return( CH_DONE );
80
81         case -1 :
82             return( CH_MORE );
83         }
84
85         if ( in->pf_state & PF_BOT ) {
86             in->pf_state &= ~PF_BOT;
87         } else {
88             if (( comment = commatch( start, stop, queries )) != NULL ) {
89                 compush( comment );
90                 return( CH_DONE );
91             }
92         }
93
94         consumetomark( start, stop, in );
95     }
96 }
97
98 cm_psadobe( in, out )
99     struct papfile      *in, *out;
100 {
101     char                *start, *stop;
102     struct comment      *comment = compeek();
103
104     for (;;) {
105         switch ( markline( &start, &stop, in )) {
106         case 0 :
107             /* eof on infile */
108             out->pf_state |= PF_EOF;
109             compop();
110             return( CH_DONE );
111
112         case -1 :
113             return( CH_MORE );
114         }
115
116         if ( in->pf_state & PF_BOT ) {
117             in->pf_state &= ~PF_BOT;
118             if ( lp_open( out ) < 0 ) {
119                 syslog( LOG_ERR, "lp_open failed" );
120                 spoolerror( out, "Ignoring job." );
121             }
122         } else {
123             if (( comment = commatch( start, stop, headers )) != NULL ) {
124                 compush( comment );
125                 return( CH_DONE );
126             }
127         }
128
129         *stop = '\n';
130         lp_write( start, stop - start + 1 );
131         consumetomark( start, stop, in );
132     }
133 }
134
135 char    *Query = "Query";
136
137 cm_psswitch( in, out )
138     struct papfile      *in, *out;
139 {
140     char                *start, *stop, *p;
141     struct comment      *comment = compeek();
142
143     switch ( markline( &start, &stop, in )) {
144     case 0 :
145         /* eof on infile */
146         out->pf_state |= PF_EOF;
147         compop();
148         return( 0 );
149
150     case -1 :
151         return( CH_MORE );
152     }
153
154     for ( p = start; p < stop; p++ ) {
155         if ( *p == ' ' || *p == '\t' ) {
156             break;
157         }
158     }
159     for ( ; p < stop; p++ ) {
160         if ( *p != ' ' && *p != '\t' ) {
161             break;
162         }
163     }
164
165     if ( stop - p >= strlen( Query ) &&
166             strncmp( p, Query, strlen( Query )) == 0 ) {
167         if ( comswitch( magics, cm_psquery ) < 0 ) {
168             syslog( LOG_ERR, "cm_psswitch: can't find psquery!" );
169             exit( 1 );
170         }
171     } else {
172         if ( comswitch( magics, cm_psadobe ) < 0 ) {
173             syslog( LOG_ERR, "cm_psswitch: can't find psadobe!" );
174             exit( 1 );
175         }
176     }
177     return( CH_DONE );
178 }
179
180 struct comment  magics[] = {
181     { "%!PS-Adobe-3.0 Query",   0,                      cm_psquery, C_FULL },
182     { "%!PS-Adobe-3.0",         0,                      cm_psadobe, C_FULL },
183     { "%!PS-Adobe-",            0,                      cm_psswitch,    0 },
184     { 0 },
185 };