1/* 2 * $Id: file.c,v 1.12 2009-10-14 02:24:05 didg Exp $ 3 * 4 * Copyright (c) 1990,1994 Regents of The University of Michigan. 5 * All Rights Reserved. See COPYRIGHT. 6 */ 7 8#ifdef HAVE_CONFIG_H 9#include "config.h" 10#endif /* HAVE_CONFIG_H */ 11 12#include <atalk/logger.h> 13#include <sys/param.h> 14#include <stdio.h> 15#include <stdlib.h> 16#include <string.h> 17 18#include "file.h" 19 20/* 21*/ 22int markline( struct papfile *pf, char **start, int *linelength, int *crlflength ) 23{ 24 char *p; 25 26 if ( pf->pf_datalen == 0 && ( pf->pf_state & PF_EOF )) { 27 return( 0 ); 28 } 29 30 *start = pf->pf_data; 31 32 /* get a line */ 33 for ( *linelength=0; *linelength < pf->pf_datalen; (*linelength)++) { 34 if (pf->pf_data[*linelength] == '\n' || 35 pf->pf_data[*linelength] == '\r') { 36 break; 37 } 38 } 39 40 if ( *linelength >= pf->pf_datalen ) { 41 if ( pf->pf_state & PF_EOF ) { 42 append( pf, "\n", 1 ); 43 } else if (*linelength < 1024) { 44 return( -1 ); 45 } 46 } 47 48 p = pf->pf_data + *linelength; 49 50 *crlflength=0; 51 while(*crlflength < pf->pf_datalen-*linelength && 52 (p[*crlflength]=='\r' || p[*crlflength]=='\n')) { 53 (*crlflength)++; 54 } 55 56 if (!*crlflength) { 57 /* line is way too long, something fishy is going on, give up */ 58 LOG(log_error, logtype_papd, "markline: no crlf in comment, give up" ); 59 return( -2 ); 60 } 61 62 /* success, return 1 */ 63 return( 1 ); 64} 65 66void morespace(struct papfile *pf, const char *data, int len) 67{ 68 char *nbuf; 69 int nsize; 70 71 if ( pf->pf_data != pf->pf_buf ) { /* pull up */ 72 bcopy( pf->pf_data, pf->pf_buf, pf->pf_datalen); 73 pf->pf_data = pf->pf_buf; 74 } 75 76 if ( pf->pf_datalen + len > pf->pf_bufsize ) { /* make more space */ 77 nsize = (( pf->pf_bufsize + len ) / PF_MORESPACE + 78 (( pf->pf_bufsize + len ) % PF_MORESPACE != 0 )) * PF_MORESPACE; 79 if ( pf->pf_buf ) { 80 if (( nbuf = (char *)realloc( pf->pf_buf, nsize )) == NULL ) { 81 exit( 1 ); 82 } 83 } else { 84 if (( nbuf = (char *)malloc( nsize )) == NULL ) { 85 exit( 1 ); 86 } 87 } 88 pf->pf_bufsize = nsize; 89 pf->pf_data = nbuf + ( pf->pf_data - pf->pf_buf ); 90 pf->pf_buf = nbuf; 91 } 92 93 bcopy( data, pf->pf_data + pf->pf_datalen, len ); 94 pf->pf_datalen += len; 95} 96 97 98void append(struct papfile *pf, const char *data, int len) 99{ 100 if ((pf->pf_data + pf->pf_datalen + len) > 101 (pf->pf_buf + pf->pf_bufsize)) { 102 morespace(pf, data, len); 103 } else { 104 memcpy(pf->pf_data + pf->pf_datalen, data, len); 105 pf->pf_datalen += len; 106 } 107} 108 109 110void spoolerror(struct papfile *out, char *str) 111{ 112 char *pserr1 = "%%[ Error: "; 113 char *pserr2 = " ]%%\n"; 114 115 if ( str == NULL ) { 116 str = "Spooler error."; 117 } 118 119 append( out, pserr1, strlen( pserr1 )); 120 append( out, str, strlen( str )); 121 append( out, pserr2, strlen( pserr2 )); 122} 123