/*
+ * $Id: file.c,v 1.12 2009-10-14 02:24:05 didg Exp $
+ *
* Copyright (c) 1990,1994 Regents of The University of Michigan.
* All Rights Reserved. See COPYRIGHT.
*/
-#include <sys/syslog.h>
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+#include <atalk/logger.h>
#include <sys/param.h>
#include <stdio.h>
#include <stdlib.h>
#include "file.h"
-markline( start, stop, pf )
- char **start, **stop;
- struct papfile *pf;
+/*
+*/
+int markline( struct papfile *pf, char **start, int *linelength, int *crlflength )
{
char *p;
- if ( PF_BUFSIZ( pf ) == 0 && ( pf->pf_state & PF_EOF )) {
+ if ( pf->pf_datalen == 0 && ( pf->pf_state & PF_EOF )) {
return( 0 );
}
+ *start = pf->pf_data;
+
/* get a line */
- for ( p = pf->pf_cur; p < pf->pf_end; p++ ) {
- if ( *p == '\n' || *p == '\r' ) {
+ for ( *linelength=0; *linelength < pf->pf_datalen; (*linelength)++) {
+ if (pf->pf_data[*linelength] == '\n' ||
+ pf->pf_data[*linelength] == '\r') {
break;
}
}
- if ( p >= pf->pf_end ) {
+
+ if ( *linelength >= pf->pf_datalen ) {
if ( pf->pf_state & PF_EOF ) {
- APPEND( pf, "\n", 1 );
- } else {
+ append( pf, "\n", 1 );
+ } else if (*linelength < 1024) {
return( -1 );
}
}
- *start = pf->pf_cur;
- *stop = p;
- if ( *stop == *start ) {
- return( 1 ); /* don't return len 0 lines */
- } else {
- return( *stop - *start );
- }
-}
+ p = pf->pf_data + *linelength;
-consumetomark( start, stop, pf )
- char *start, *stop;
- struct papfile *pf;
-{
- if ( start != pf->pf_cur || pf->pf_cur > stop || stop > pf->pf_end ) {
- abort();
+ *crlflength=0;
+ while(*crlflength < pf->pf_datalen-*linelength &&
+ (p[*crlflength]=='\r' || p[*crlflength]=='\n')) {
+ (*crlflength)++;
}
-
- pf->pf_cur = stop + 1; /* past the stop char */
- if ( pf->pf_cur > pf->pf_end ) {
- abort();
- }
- if ( pf->pf_cur == pf->pf_end ) {
- pf->pf_cur = pf->pf_end = pf->pf_buf;
+
+ if (!*crlflength) {
+ /* line is way too long, something fishy is going on, give up */
+ LOG(log_error, logtype_papd, "markline: no crlf in comment, give up" );
+ return( -2 );
}
- return;
+ /* success, return 1 */
+ return( 1 );
}
-morespace( pf, data, len )
- struct papfile *pf;
- char *data;
- int len;
+void morespace(struct papfile *pf, const char *data, int len)
{
char *nbuf;
int nsize;
- if ( pf->pf_cur != pf->pf_buf ) { /* pull up */
- bcopy( pf->pf_cur, pf->pf_buf, PF_BUFSIZ( pf ));
- pf->pf_end = pf->pf_buf + PF_BUFSIZ( pf );
- pf->pf_cur = pf->pf_buf;
+ if ( pf->pf_data != pf->pf_buf ) { /* pull up */
+ bcopy( pf->pf_data, pf->pf_buf, pf->pf_datalen);
+ pf->pf_data = pf->pf_buf;
}
- if ( pf->pf_end + len > pf->pf_buf + pf->pf_len ) { /* make more space */
- nsize = (( pf->pf_len + len ) / PF_MORESPACE +
- (( pf->pf_len + len ) % PF_MORESPACE != 0 )) * PF_MORESPACE;
+ if ( pf->pf_datalen + len > pf->pf_bufsize ) { /* make more space */
+ nsize = (( pf->pf_bufsize + len ) / PF_MORESPACE +
+ (( pf->pf_bufsize + len ) % PF_MORESPACE != 0 )) * PF_MORESPACE;
if ( pf->pf_buf ) {
- if (( nbuf = (char *)realloc( pf->pf_buf, nsize )) == 0 ) {
+ if (( nbuf = (char *)realloc( pf->pf_buf, nsize )) == NULL ) {
exit( 1 );
}
} else {
- if (( nbuf = (char *)malloc( nsize )) == 0 ) {
+ if (( nbuf = (char *)malloc( nsize )) == NULL ) {
exit( 1 );
}
}
- pf->pf_len = nsize;
- pf->pf_end = nbuf + ( pf->pf_end - pf->pf_buf );
- pf->pf_cur = nbuf + ( pf->pf_cur - pf->pf_buf );
+ pf->pf_bufsize = nsize;
+ pf->pf_data = nbuf + ( pf->pf_data - pf->pf_buf );
pf->pf_buf = nbuf;
}
- bcopy( data, pf->pf_end, len );
- pf->pf_end += len;
+ bcopy( data, pf->pf_data + pf->pf_datalen, len );
+ pf->pf_datalen += len;
+}
+
+
+void append(struct papfile *pf, const char *data, int len)
+{
+ if ((pf->pf_data + pf->pf_datalen + len) >
+ (pf->pf_buf + pf->pf_bufsize)) {
+ morespace(pf, data, len);
+ } else {
+ memcpy(pf->pf_data + pf->pf_datalen, data, len);
+ pf->pf_datalen += len;
+ }
}
-spoolerror( out, str )
- struct papfile *out;
- char *str;
+
+void spoolerror(struct papfile *out, char *str)
{
char *pserr1 = "%%[ Error: ";
char *pserr2 = " ]%%\n";
str = "Spooler error.";
}
- APPEND( out, pserr1, strlen( pserr1 ));
- APPEND( out, str, strlen( str ));
- APPEND( out, pserr2, strlen( pserr2 ));
+ append( out, pserr1, strlen( pserr1 ));
+ append( out, str, strlen( str ));
+ append( out, pserr2, strlen( pserr2 ));
}