1 #include <stdio.h>
2 #ifdef macintosh
3 #include <unix.h>
4 #include <unistd.h>
5 #else
6 #if defined(WIN32) && ! defined(__CYGWIN__)
7 #include <io.h>
8 #else
9 #include <sys/types.h>
10 #endif
11 #include <sys/stat.h>
12 #endif
13 #include <fcntl.h>
14 #include "lt-defs.h"
15 #include "string16.h"
16 #include "lt-comment.h"
17 #include "lt-safe.h"
18
19 #ifdef HAVE_LIBZ
20 #include "zlib.h"
21 #endif
22
23 #include <errno.h>
24
25 /* to avoid applications having to know about errno, or use libg++ */
26 /* Why aren't we using strerror(errno)????*/
strErr(void)27 const char *strErr( void ) {
28 #ifdef macintosh
29 return "Macs don't have sys_errlist";
30 #elif defined(__CYGWIN__)
31 return strerror(errno);
32 #else
33 return sys_errlist[errno];
34 #endif
35 }
36
37 /* Open a filename */
38
s_open(const char * path,int flags,int mode)39 int s_open(const char *path,int flags,int mode) {
40 int val;
41 #ifdef macintosh
42 /* then the three argument form of open cannot be used
43 have to settle for ignoring mode.
44 */
45 val=(flags&O_CREAT) ?open(path,flags):open(path,flags);
46 #else
47 val=(flags&O_CREAT)?open(path,flags,mode):open(path,flags);
48 #endif
49 if (val==EOF) {
50 LT_ERROR2(LEFILE,"Couldn't open file %s: %s\n",
51 path,strErr());
52 };
53 return val;
54 }
55
sfopen(const char * name,const char * mode)56 FILE *sfopen(const char *name,const char *mode) {
57 FILE *filep;
58
59 if((filep=fopen(name,mode))==NULL) {
60 LT_ERROR2(LEFILE,"Couldn't open file %s: %s\n",
61 name,strErr());
62 };
63 return filep;
64 }
65
stdsfopen(const char * filename,const char * mode)66 FILE *stdsfopen(const char *filename,const char *mode) {
67 FILE *filep;
68 int length;
69 #ifndef HAVE_LIBZ
70 #ifdef HAVE_POPEN
71 char string[MAXFILENAMELEN+20];
72 #endif
73 #endif
74
75 if (filename==NULL) {
76 LT_ERROR(LENULA,"Call to stdsfopen made without instantiated filename.\n");
77 return NULL;
78 };
79 if (mode==NULL) {
80 LT_ERROR(LENULA,"Call to stdsfopen made without instantiated mode.\n");
81 return NULL;
82 };
83
84 length=strlen8(filename);
85
86 if(strcmp8(filename,"stdin")==0)
87 return stdin;
88 if(strcmp8(filename,"stdout")==0)
89 return stdout;
90 if(strcmp8(filename,"stderr")==0)
91 return stderr;
92
93 #ifndef HAVE_LIBZ
94 if (((length>2) && (!strcmp8(filename+length-2,".Z"))) ||
95 ((length>3) && (!strcmp8(filename+length-3,".gz")))) {
96 #ifdef HAVE_POPEN
97 if(mode[0] == 'r') {
98 sprintf(string,"gunzip -c %s",filename);
99 filep=popen(string, "r");
100 } else if (mode[0] == 'w') {
101 sprintf(string,"gzip -c > %s", filename);
102 filep=popen(string,"w");
103 } else {
104 #endif /* HAVE_POPEN */
105 LT_ERROR2(LEFILE,"Couldn't deal with %s (compressed) in mode %s\n",
106 filename,mode);
107 return NULL;
108 #ifdef HAVE_POPEN
109 };
110 if (!filep) {
111 LT_ERROR1(LESYSE,"Couldn't open pipe: %s\n",string);
112 return NULL;
113 };
114 #endif /* HAVE_POPEN */
115 }
116 else
117 #endif /* HAVE_LIBZ*/
118 if ((!strcmp8(filename,"")) || (!strcmp8(filename,"-"))) {
119 if(mode[0] == 'r')
120 filep=stdin;
121 else if(mode[0] == 'w')
122 filep=stdout;
123 else {
124 LT_ERROR1(LEFILE,"FATAL: std*** implied in illegal mode %s\n",mode);
125 return NULL;
126 };
127 }
128 else {
129 filep=fopen(filename,mode);
130 };
131
132 if(filep==NULL) {
133 LT_ERROR2(LEFILE,"Couldn't open file %s: %s\n", filename, strErr());
134 };
135
136 return filep;
137 }
138
file_len(int fd)139 int file_len(int fd) {
140 struct stat stat_buf;
141 if(fstat(fd, &stat_buf) != -1) {
142 return(stat_buf.st_size);
143 };
144 LT_ERROR1(LEFILE,"Couldn't stat file: %s",strErr());
145 return -1;
146 }
147
file_length(const FILE * fd)148 int file_length(const FILE *fd) {
149 #ifdef HAVE_FILENO
150 return file_len(fileno((FILE *)fd));
151 #else
152 LT_ERROR(LEFILE,"fileno not supported by this architecture\n");
153 return 0;
154 #endif
155 }
156
slseek(int fd,off_t offset,int whence,const char * filename)157 off_t slseek(int fd, off_t offset, int whence, const char *filename) {
158 off_t val;
159 if ((val=lseek(fd, offset, whence))==EOF) {
160 LT_ERROR2(LEFILE,"Unable to seek %s: %s",filename,strErr());
161 };
162 return val;
163 }
164
sftell(const FILE * f,const char * filename)165 off_t sftell(const FILE *f,const char *filename) {
166 off_t val;
167 if ((val=ftell((FILE*)f))==EOF) {
168 LT_ERROR2(LEFILE,"Unable to ftell %s: %s",filename,strErr());
169 };
170 return val;
171 }
172
sfseek(FILE * f,off_t pos,const char * filename)173 off_t sfseek(FILE *f,off_t pos,const char *filename) {
174 off_t val;
175 if ((val=fseek(f,pos,SEEK_SET))==EOF) {
176 LT_ERROR2(LEFILE,"Unable to fseek %s: %s",filename,strErr());
177 };
178 return val;
179 }
180
sfflush(FILE * filep)181 int sfflush(FILE *filep) {
182 if (fflush(filep)==EOF) {
183 LT_ERROR1(LEWRTF,"fflush failed: %s\n",strErr());
184 return EOF;
185 };
186 return 0;
187 }
188
sfclose(FILE * filep)189 int sfclose(FILE *filep) {
190 if (fclose(filep)==EOF) {
191 LT_ERROR1(LEWRTF,"fclose failed: %s\n",strErr());
192 return EOF;
193 };
194 return 0;
195 }
196
stdfclose(FILE * filep)197 int stdfclose(FILE *filep) {
198 if(filep==stdin || filep==stdout || filep==stderr) {
199 return sfflush(filep);
200 }
201 else {
202 return sfclose(filep);
203 };
204 }
205
sfdopen(int fd,const char * mode)206 FILE *sfdopen(int fd, const char *mode) {
207 #ifdef HAVE_FDOPEN
208 FILE *file;
209
210 if((file=fdopen(fd,(char *)mode))==NULL) {
211 /* not clear if fdopen failures set ERRNO */
212 LT_ERROR1(LEFILE,"Failed to assign stream to file %d\n",fd);
213 };
214
215 return file;
216 #else
217 LT_ERROR(LEFILE,"sfdopen not supported for this architecture %d\n");
218 return 0;
219 #endif
220 }
221
sread(int fd,char * buf,int nbyte)222 int sread(int fd, char *buf, int nbyte) {
223 int val;
224 if ((val=read(fd,buf,nbyte))==EOF) {
225 LT_ERROR1(LERDF,"read failed: %s\n",strErr());
226 return EOF;
227 }
228 else {
229 return val;
230 };
231 }
232
sputc(char c,FILE * stream)233 int sputc(char c, FILE *stream) {
234 if (putc(c,stream)==EOF) {
235 LT_ERROR1(LEWRTF,"putc failed: %s\n",strErr());
236 return EOF;
237 }
238 else {
239 return c;
240 };
241 }
242
sfputs(const char * s,FILE * stream)243 int sfputs(const char *s, FILE *stream) {
244 int val;
245 if ((val=(fputs(s,stream)))==EOF) {
246 LT_ERROR1(LEWRTF,"puts failed: %s\n",strErr());
247 };
248 return val;
249 }
250
sputw(int w,FILE * stream)251 int sputw(int w, FILE *stream) {
252 #ifdef HAVE_PUTW
253 if (putw(w,stream)) {
254 #else
255 if (fwrite(&w,sizeof(int),1,stream) != 1) {
256 #endif
257 /* putw returns 1 on failure */
258 LT_ERROR(LEWRTF,"sputw failed\n");
259 return EOF;
260 } else {
261 return 0;
262 }
263 }
264
265 int sfwrite(const void* ptr, int size, int nitems, FILE* stream) {
266 int val;
267
268 if ((val=fwrite(ptr, size, nitems, stream))==0 &&
269 (size>0) &&
270 (nitems>0)) {
271 LT_ERROR1(LEWRTF,"sfwrite failed: %s\n",strErr());
272 return EOF;
273 }
274 else {
275 return val;
276 };
277 }
278
279 int sfprintf(FILE *stream, const char *format, ...) {
280 va_list args;
281 int retval;
282
283 va_start(args, format);
284 retval = vfprintf(stream, format, args);
285 va_end(args);
286 if(retval == EOF) {
287 LT_ERROR1(LEWRTF,"sfprintf failed: %s\n",strErr());
288 }
289 return retval;
290 }
291
292 int sFprintf(FILE16 *stream, const char *format, ...) {
293 va_list args;
294 int retval;
295
296 va_start(args, format);
297 retval = Vfprintf(stream, format, args);
298 va_end(args);
299 if(retval == EOF) {
300 LT_ERROR1(LEWRTF,"sFprintf failed: %s\n",strErr());
301 }
302 return retval;
303 }
304
305 int sFflush(FILE16 *filep) {
306 if (Fflush(filep)==EOF) {
307 LT_ERROR1(LEWRTF,"fflush failed: %s\n",strErr());
308 return EOF;
309 };
310 return 0;
311 }
312
313 /* XXX improve these!!! */
314
315 int sPutc(Char c, FILE16 *stream)
316 {
317 Char buf[2];
318 buf[0] = c; buf[1] = 0;
319 return sFprintf(stream, "%S", buf);
320 }
321
322 int sFputs(const Char *s, FILE16 *stream)
323 {
324 return sFprintf(stream, "%S", s);
325 }
326
327