home *** CD-ROM | disk | FTP | other *** search
- /*
- * Copyright (C) 1993, 1994 Marc Parmet.
- * This file is part of the Macintosh port of GNU Emacs.
- *
- * GNU Emacs is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- */
-
- #if defined(THINK_C)
- #include <MacHeaders>
- #else
- #include <Types.h>
- #include <Memory.h>
- #include <Quickdraw.h>
- #include <Windows.h>
- #endif
-
- #include <stdarg.h>
- #include "stdio.h"
- #include "errno.h"
- #include "sys/file.h"
- #include "sys/stat.h"
-
- extern int errno;
-
- void
- vprintf(char *fmt,va_list ap)
- {
- vfprintf(stdout,fmt,ap);
- }
-
- void
- vsprintf(char *dest,char *fmt,va_list ap)
- {
- FILE f;
-
- f.cnt = 0;
- f.base = (unsigned char *)dest;
- f.fd = -1;
- f.flag = _WRITE;
- f.err = 0;
- f.buflen = 0x7fffffff;
- f.havepushback = 0;
- f.havespec = 0;
- vfprintf(&f,fmt,ap);
- f.base[f.cnt] = '\0';
- }
-
- void
- fprintf(FILE *fp,char *fmt,...)
- {
- va_list ap;
-
- va_start(ap,fmt);
- vfprintf(fp,fmt,ap);
- va_end(ap);
- }
-
- void
- printf(char *fmt,...)
- {
- va_list ap;
-
- va_start(ap,fmt);
- vfprintf(stdout,fmt,ap);
- va_end(ap);
- }
-
- void
- sprintf(char *s,char *fmt,...)
- {
- va_list ap;
-
- va_start(ap,fmt);
- vsprintf(s,fmt,ap);
- va_end(ap);
- }
-
- void
- fdopen_internal(int fd,char *mode,FILE *fp)
- {
- int i;
-
- if (*mode != 'w' && *mode != 'r' && *mode != 'a') {
- fprintf(stderr,"Illegal mode %s in fopen or fdopen.\012",mode);
- return;
- }
-
- fp->fd = fd;
- fp->base = (unsigned char *)NewPtr(BUFSIZ);
- fp->external_base = 0;
- fp->flag = (*mode == 'r' ? _READ : _WRITE);
- fp->cnt = 0;
- fp->buflen = BUFSIZ;
- fp->err = 0;
- fp->havespec = 0;
- }
-
- FILE *
- fdopen(int fd,char *mode)
- {
- int i;
- FILE *fp;
-
- for (i = 0; i<_NFILE; ++i)
- if (_iob(i)->flag == 0)
- break;
-
- if (i == _NFILE) { errno = EUNDOC; return 0L; }
- fp = _iob(i);
- fdopen_internal(fd,mode,fp);
- return fp;
- }
-
- static int
- mode_to_perm(char *name,char *mode)
- {
- switch (*mode) {
- case 'r': return O_RDONLY;
- case 'w': return O_WRONLY;
- case 'a': return O_WRONLY;
- default:
- fprintf(stderr,"Illegal mode \"%s\" opening %s\012",mode,name);
- return -1;
- }
- }
-
- FILE *
- fopen(char *name,char *mode)
- {
- FILE *fp;
- int created;
- int i,fd,perm;
-
- perm = mode_to_perm(name,mode);
- if (perm == -1) return 0L;
-
- created = 0;
- if (*mode == 'w') {
- fd = creat(name,perm);
- created = 1;
- }
- else if (*mode == 'a') {
- fd = open(name,perm);
- if (fd == -1) {
- fd = creat(name,perm);
- created = 1;
- }
- lseek(fd,0,2);
- }
- else
- fd = open(name,perm);
-
- if (fd == -1) { errno = EUNDOC; return 0L; }
- fp = fdopen(fd,mode);
- if (fp == 0L) {
- close(fd);
- if (created)
- unlink(name);
- errno = EUNDOC;
- }
- fp->havespec = unixfn2FSSpec(name,&fp->spec) == 0;
- return fp;
- }
-
- FILE *
- freopen(char *name,char *mode,FILE *fp)
- {
- int i,fd,created,perm;
-
- fclose(fp);
-
- perm = mode_to_perm(name,mode);
- if (perm == -1) return 0L;
-
- created = 0;
- if (*mode == 'w') {
- fd = creat(name,perm);
- created = 1;
- }
- else if (*mode == 'a') {
- fd = open(name,perm);
- if (fd == -1) {
- fd = creat(name,perm);
- created = 1;
- }
- lseek(fd,0,2);
- }
- else
- fd = open(name,perm);
-
- if (fd == -1) { errno = EUNDOC; return 0L; }
- fdopen_internal(fd,mode,fp);
- fp->havespec = unixfn2FSSpec(name,&fp->spec) == 0;
- return fp;
- }
-
- void
- setbuf(FILE *fp,char *p)
- {
- if (fp->base && !fp->external_base) DisposPtr((Ptr)fp->base);
- fp->base = (unsigned char *)p;
- fp->external_base = 1;
- fp->cnt = 0;
- fp->buflen = p ? BUFSIZ : 0;
- }
-
- int min(a,b) { return a<b ? a : b; }
-
- static void
- initbuf(FILE *fp)
- {
- if (fp->base == 0L && (fp->flag & _AUTO)) {
- char *t = NewPtr(BUFSIZ);
- setbuf(fp,t);
- }
- }
-
- int
- fread(char *p,int size,int items,FILE *fp)
- {
- int i,n,k,take;
- char *t;
-
- initbuf(fp);
-
- if (fp->base) {
- for (i = 0; i<items; ++i) {
- k = 0;
- while (1) {
- take = min(size,fp->cnt);
- memcpy(p + i*size + k,fp->base + (fp->buflen - fp->cnt),take);
- k += take;
- fp->cnt -= take;
-
- if (k == size) break;
-
- if (fp->fd < 0) { fp->err = errno = EEOF; return i; }
- n = read(fp->fd,fp->base,BUFSIZ);
- if (n == -1 || n == 0) {
- fp->err = errno = EEOF;
- return i;
- }
- fp->buflen = fp->cnt = n;
- }
- }
- }
- else {
- for (i = 0; i<items; ++i) {
- if (fp->fd < 0) { fp->err = errno = EEOF; return i; }
- n = read(fp->fd,p + i*size,size);
- if (n == -1) {
- fp->err = errno = EUNDOC;
- return i;
- }
- else if (n < size) {
- fp->err = errno = EEOF;
- return i;
- }
- }
- }
-
- errno = fp->err = 0;
- return i;
- }
-
- int
- fwrite(char *p,int size,int items,FILE *fp)
- {
- int i,k,n,put;
- char *t;
-
- initbuf(fp);
-
- if (fp->base) {
- for (i = 0; i<items; ++i) {
- k = 0;
- while (1) {
- put = min(size,fp->buflen - fp->cnt);
- memcpy(fp->base + fp->cnt,p + i*size + k,put);
- k += put;
- fp->cnt += put;
-
- if (k == size) break;
-
- if (fp->fd < 0) { fp->err = errno = EEOF; return 0; }
- n = write(fp->fd,fp->base,fp->buflen);
- if (n == -1) {
- fp->err = errno = EUNDOC;
- return i;
- }
- else if (n != fp->buflen) {
- fp->err = errno = EEOF;
- return i;
- }
- fp->cnt = 0;
- }
- }
- }
- else {
- for (i = 0; i<items; ++i) {
- if (fp->fd < 0) { fp->err = errno = EEOF; return 0; }
- n = write(fp->fd,p + i*size,size);
- if (n == -1) {
- fp->err = errno = EUNDOC;
- return i;
- }
- else if (n != size) {
- fp->err = errno = EEOF;
- return i;
- }
- }
- }
-
- fp->err = errno = 0;
- return i;
- }
-
- int
- _putc(int c,FILE *fp)
- {
- int n;
-
- initbuf(fp);
-
- if (fp->base) {
- if (fp->cnt == fp->buflen) {
- if (fp->fd < 0) { fp->err = errno = EEOF; return -1; }
- n = write(fp->fd,fp->base,fp->buflen);
- if (n != fp->buflen) {
- errno = fp->err = EEOF;
- return EOF;
- }
- fp->cnt = 0;
- }
- fp->base[fp->cnt++] = c;
- errno = fp->err = 0;
- return c;
- }
- else {
- char d = c;
- if (fp->fd < 0) { fp->err = errno = EEOF; return -1; }
- n = write(fp->fd,&d,1);
- if (n != 1) {
- errno = fp->err = EEOF;
- return EOF;
- }
- else {
- errno = fp->err = 0;
- return c;
- }
- }
- }
-
- int
- _getc(FILE *fp)
- {
- int i,n;
- unsigned char c;
-
- if (fp->havepushback) {
- fp->havepushback = 0;
- return fp->pushback;
- }
-
- initbuf(fp);
-
- if (fp->base) {
- if (fp->cnt == 0) {
- n = fread((char *)&c,1,1,fp);
- if (n == 0) {
- errno = fp->err = EEOF;
- return EOF;
- }
- else {
- errno = fp->err = 0;
- return c;
- }
- }
- else {
- errno = fp->err = 0;
- return fp->base[fp->buflen - fp->cnt--];
- }
- }
- else {
- if (fp->fd < 0) { fp->err = errno = EEOF; return -1; }
- n = read(fp->fd,&c,1);
- if (n == 1) {
- errno = fp->err = 0;
- return c;
- }
- else {
- errno = fp->err = EEOF;
- return EOF;
- }
- }
- }
-
- int
- fputc(int c,FILE *fp)
- {
- return putc(c,fp);
- }
-
- int
- feof(FILE *fp)
- {
- return fp->err == EEOF;
- }
-
- void
- clearerr(FILE *fp)
- {
- fp->err = 0;
- }
-
- int
- ungetc(int c,FILE *fp)
- {
- fp->havepushback = 1;
- fp->pushback = c;
- return c;
- }
-
- int
- fileno(FILE *fp)
- {
- return fp->fd;
- }
-
- char *
- fgets(char *s, int n, FILE *fp)
- {
- int c;
- char *t = s;
-
- if (n < 1) return 0L;
- while (--n) {
- if ((c = getc(fp)) < 0) {
- if (fp->err == EEOF && t != s)
- break;
- return 0L;
- }
- *t++ = c;
- if (c == 10) /* '\012' */
- break;
- }
- *t = '\0';
- return(s);
- }
-
- int
- fsync()
- {
- /* fclose will flush. */
- return 0;
- }
-
- void
- fputs(char *s,FILE *fp)
- {
- char c;
-
- while (1) {
- c = *s++;
- if (c == '\0') return;
- putc(c,fp);
- }
- }
-
- void
- perror(const char *s)
- {
- int i = errno;
-
- if (s && *s)
- fprintf(stderr, "%s: ", s);
- fprintf(stderr, "Error %d", i);
- fputc(10, stderr); /* '\012' */
- }
-
- int
- fstat(FILE *fp,struct stat *st)
- {
- if (!fp->havespec) { errno = EUNDOC; return -1; }
- return stat_spec(&fp->spec,st);
- }
-
- void
- puts(char *s)
- {
- printf("%s\012",s);
- }
-
- void
- rewind(FILE *fp)
- {
- if (fp->fd < 0) return;
- lseek(fp->fd,0,0);
- fp->err = 0;
- fp->cnt = 0;
- }
-
- int
- fseek(FILE *fp,int offset,int whence)
- {
- fp->err = 0;
- fp->cnt = 0;
- fp->havepushback = 0;
- if (fp->fd < 0) { fp->err = errno = EEOF; return -1; }
- return lseek(fp->fd,offset,whence);
- }
-
- int
- ferror(FILE *fp)
- {
- return fp->err;
- }
-
- int
- ftell(FILE *fp)
- {
- int tell_result;
- if (fp->fd < 0) { fp->err = errno = EEOF; return -1; }
- tell_result = tell(fp->fd);
- if (tell_result == -1) return -1;
- return tell_result - fp->cnt;
- }
-
- FILE *
- popen(char *name,char *mode)
- {
- return 0L;
- }
-
- int
- pclose(FILE *fp)
- {
- return -1;
- }
-