X-Git-Url: https://git.sesse.net/?p=rdpsrv;a=blobdiff_plain;f=Xserver%2Flib%2Ffont%2Ffontfile%2Fbufio.c;fp=Xserver%2Flib%2Ffont%2Ffontfile%2Fbufio.c;h=736b76fad0adc21e74aae4e1fb86a268529db2a0;hp=0000000000000000000000000000000000000000;hb=b6e6afccf37f4ad0515ef2a698f714fdf1bf23b3;hpb=e3340a110a3b01756b8e67531395a33b40a17d37 diff --git a/Xserver/lib/font/fontfile/bufio.c b/Xserver/lib/font/fontfile/bufio.c new file mode 100644 index 0000000..736b76f --- /dev/null +++ b/Xserver/lib/font/fontfile/bufio.c @@ -0,0 +1,224 @@ +/* $XConsortium: bufio.c,v 1.8 94/04/17 20:17:00 gildea Exp $ */ +/* $XFree86: xc/lib/font/fontfile/bufio.c,v 3.0 1994/12/17 09:41:39 dawes Exp $ */ + +/* + +Copyright (c) 1991 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from the X Consortium. + +*/ + +/* + * Author: Keith Packard, MIT X Consortium + */ + + +#include +#include +#include +#include +#ifdef X_NOT_STDC_ENV +extern int errno; +#endif + +BufFilePtr +BufFileCreate (private, io, skip, close) + char *private; + int (*io)(); + int (*skip)(); + int (*close)(); +{ + BufFilePtr f; + + f = (BufFilePtr) xalloc (sizeof *f); + if (!f) + return 0; + f->private = private; + f->bufp = f->buffer; + f->left = 0; + f->io = io; + f->skip = skip; + f->close = close; + return f; +} + +#define FileDes(f) ((int) (f)->private) + +static int +BufFileRawFill (f) + BufFilePtr f; +{ + int left; + + left = read (FileDes(f), (char *)f->buffer, BUFFILESIZE); + if (left <= 0) { + f->left = 0; + return BUFFILEEOF; + } + f->left = left - 1; + f->bufp = f->buffer + 1; + return f->buffer[0]; +} + +static int +BufFileRawSkip (f, count) + BufFilePtr f; + int count; +{ + int curoff; + int fileoff; + int todo; + + curoff = f->bufp - f->buffer; + fileoff = curoff + f->left; + if (curoff + count <= fileoff) { + f->bufp += count; + f->left -= count; + } else { + todo = count - (fileoff - curoff); + if (lseek (FileDes(f), todo, 1) == -1) { + if (errno != ESPIPE) + return BUFFILEEOF; + while (todo) { + curoff = BUFFILESIZE; + if (curoff > todo) + curoff = todo; + fileoff = read (FileDes(f), (char *)f->buffer, curoff); + if (fileoff <= 0) + return BUFFILEEOF; + todo -= fileoff; + } + } + f->left = 0; + } + return count; +} + +static int +BufFileRawClose (f, doClose) + BufFilePtr f; +{ + if (doClose) + close (FileDes (f)); + return 1; +} + +BufFilePtr +BufFileOpenRead (fd) + int fd; +{ +#ifdef __EMX__ + /* hv: I'd bet WIN32 has the same effect here */ + setmode(fd,O_BINARY); +#endif + return BufFileCreate ((char *) fd, BufFileRawFill, BufFileRawSkip, BufFileRawClose); +} + +static +BufFileRawFlush (c, f) + int c; + BufFilePtr f; +{ + int cnt; + + if (c != BUFFILEEOF) + *f->bufp++ = c; + cnt = f->bufp - f->buffer; + f->bufp = f->buffer; + f->left = BUFFILESIZE; + if (write (FileDes(f), (char *)f->buffer, cnt) != cnt) + return BUFFILEEOF; + return c; +} + +BufFilePtr +BufFileOpenWrite (fd) + int fd; +{ + BufFilePtr f; + +#ifdef __EMX__ + /* hv: I'd bet WIN32 has the same effect here */ + setmode(fd,O_BINARY); +#endif + f = BufFileCreate ((char *) fd, BufFileRawFlush, 0, BufFileFlush); + f->bufp = f->buffer; + f->left = BUFFILESIZE; + return f; +} + +BufFileRead (f, b, n) + BufFilePtr f; + char *b; + int n; +{ + int c, cnt; + cnt = n; + while (cnt--) { + c = BufFileGet (f); + if (c == BUFFILEEOF) + break; + *b++ = c; + } + return n - cnt - 1; +} + +BufFileWrite (f, b, n) + BufFilePtr f; + char *b; + int n; +{ + int cnt; + cnt = n; + while (cnt--) { + if (BufFilePut (*b++, f) == BUFFILEEOF) + return BUFFILEEOF; + } + return n; +} + +int +BufFileFlush (f) + BufFilePtr f; +{ + if (f->bufp != f->buffer) + (*f->io) (BUFFILEEOF, f); +} + +int +BufFileClose (f, doClose) + BufFilePtr f; +{ + (void) (*f->close) (f, doClose); + xfree (f); +} + +int +BufFileFree (f) + BufFilePtr f; +{ + xfree (f); +}