]> arthur.barton.de Git - netatalk.git/blob - etc/papd/file.c
Initial revision
[netatalk.git] / etc / papd / file.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 <stdlib.h>
10 #include <string.h>
11
12 #include "file.h"
13
14 markline( start, stop, pf )
15     char                **start, **stop;
16     struct papfile      *pf;
17 {
18     char                *p;
19
20     if ( PF_BUFSIZ( pf ) == 0 && ( pf->pf_state & PF_EOF )) {
21         return( 0 );
22     }
23
24     /* get a line */
25     for ( p = pf->pf_cur; p < pf->pf_end; p++ ) {
26         if ( *p == '\n' || *p == '\r' ) {
27             break;
28         }
29     }
30     if ( p >= pf->pf_end ) {
31         if ( pf->pf_state & PF_EOF ) {
32             APPEND( pf, "\n", 1 );
33         } else {
34             return( -1 );
35         }
36     }
37
38     *start = pf->pf_cur;
39     *stop = p;
40     if ( *stop == *start ) {
41         return( 1 );                    /* don't return len 0 lines */
42     } else {
43         return( *stop - *start );
44     }
45 }
46
47 consumetomark( start, stop, pf )
48     char                *start, *stop;
49     struct papfile      *pf;
50 {
51     if ( start != pf->pf_cur || pf->pf_cur > stop || stop > pf->pf_end ) {
52         abort();
53     }
54
55     pf->pf_cur = stop + 1;              /* past the stop char */
56     if ( pf->pf_cur > pf->pf_end ) {
57         abort();
58     }
59     if ( pf->pf_cur == pf->pf_end ) {
60         pf->pf_cur = pf->pf_end = pf->pf_buf;
61     }
62
63     return;
64 }
65
66 morespace( pf, data, len )
67     struct papfile      *pf;
68     char                *data;
69     int                 len;
70 {
71     char                *nbuf;
72     int                 nsize;
73
74     if ( pf->pf_cur != pf->pf_buf ) {                   /* pull up */
75         bcopy( pf->pf_cur, pf->pf_buf, PF_BUFSIZ( pf ));
76         pf->pf_end = pf->pf_buf + PF_BUFSIZ( pf );
77         pf->pf_cur = pf->pf_buf;
78     }
79
80     if ( pf->pf_end + len > pf->pf_buf + pf->pf_len ) { /* make more space */
81         nsize = (( pf->pf_len + len ) / PF_MORESPACE +
82                 (( pf->pf_len + len ) % PF_MORESPACE != 0 )) * PF_MORESPACE;
83         if ( pf->pf_buf ) {
84             if (( nbuf = (char *)realloc( pf->pf_buf, nsize )) == 0 ) {
85                 exit( 1 );
86             }
87         } else {
88             if (( nbuf = (char *)malloc( nsize )) == 0 ) {
89                 exit( 1 );
90             }
91         }
92         pf->pf_len = nsize;
93         pf->pf_end = nbuf + ( pf->pf_end - pf->pf_buf );
94         pf->pf_cur = nbuf + ( pf->pf_cur - pf->pf_buf );
95         pf->pf_buf = nbuf;
96     }
97
98     bcopy( data, pf->pf_end, len );
99     pf->pf_end += len;
100 }
101
102 spoolerror( out, str )
103     struct papfile      *out;
104     char                *str;
105 {
106     char        *pserr1 = "%%[ Error: ";
107     char        *pserr2 = " ]%%\n";
108
109     if ( str == NULL ) {
110         str = "Spooler error.";
111     }
112
113     APPEND( out, pserr1, strlen( pserr1 ));
114     APPEND( out, str, strlen( str ));
115     APPEND( out, pserr2, strlen( pserr2 ));
116 }