summaryrefslogtreecommitdiff
path: root/src/builtins/file.c
diff options
context:
space:
mode:
authorKaleb Keithley <kaleb@freedesktop.org>2003-11-14 16:48:50 +0000
committerKaleb Keithley <kaleb@freedesktop.org>2003-11-14 16:48:50 +0000
commit3795e9702b3b3a6fe0594d09cdd110adeb5e42f9 (patch)
treecaec4aaf13f12f0a31c15cb24ad2127eff834dd2 /src/builtins/file.c
parent153e8da44452905ae04a0e20ad0d85f40399b4ca (diff)
Initial revision
Diffstat (limited to 'src/builtins/file.c')
-rw-r--r--src/builtins/file.c135
1 files changed, 135 insertions, 0 deletions
diff --git a/src/builtins/file.c b/src/builtins/file.c
new file mode 100644
index 0000000..6fcaa79
--- /dev/null
+++ b/src/builtins/file.c
@@ -0,0 +1,135 @@
+/*
+ * Id: file.c,v 1.2 1999/11/02 06:16:47 keithp Exp $
+ *
+ * Copyright 1999 SuSE, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of SuSE not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission. SuSE makes no representations about the
+ * suitability of this software for any purpose. It is provided "as is"
+ * without express or implied warranty.
+ *
+ * SuSE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SuSE
+ * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * Author: Keith Packard, SuSE, Inc.
+ */
+/* $XFree86: xc/lib/font/builtins/file.c,v 1.4 2000/02/23 20:29:33 dawes Exp $ */
+
+#include "builtin.h"
+
+typedef struct _BuiltinIO {
+ int offset;
+ BuiltinFilePtr file;
+} BuiltinIORec, *BuiltinIOPtr;
+
+static int
+BuiltinFill (f)
+ BufFilePtr f;
+{
+ int left, len;
+ BuiltinIOPtr io = ((BuiltinIOPtr) f->private);
+
+ left = io->file->len - io->offset;
+ if (left <= 0)
+ {
+ f->left = 0;
+ return BUFFILEEOF;
+ }
+ len = BUFFILESIZE;
+ if (len > left)
+ len = left;
+ bcopy (io->file->bits + io->offset, f->buffer, len);
+ io->offset += len;
+ f->left = len - 1;
+ f->bufp = f->buffer + 1;
+ return f->buffer[0];
+}
+
+static int
+BuiltinSkip (f, count)
+ BufFilePtr f;
+ int count;
+{
+ BuiltinIOPtr io = ((BuiltinIOPtr) f->private);
+ int curoff;
+ int fileoff;
+ int todo;
+ int left;
+
+ curoff = f->bufp - f->buffer;
+ fileoff = curoff + f->left;
+ if (curoff + count <= fileoff) {
+ f->bufp += count;
+ f->left -= count;
+ } else {
+ todo = count - (fileoff - curoff);
+ io->offset += todo;
+ if (io->offset > io->file->len)
+ io->offset = io->file->len;
+ if (io->offset < 0)
+ io->offset = 0;
+ f->left = 0;
+ }
+ return count;
+}
+
+static int
+BuiltinClose (f, doClose)
+ BufFilePtr f;
+{
+ BuiltinIOPtr io = ((BuiltinIOPtr) f->private);
+
+ xfree (io);
+ return 1;
+}
+
+
+FontFilePtr
+BuiltinFileOpen (name)
+ char *name;
+{
+ int i;
+ BuiltinIOPtr io;
+ BufFilePtr raw, cooked;
+
+ if (*name == '/') name++;
+ for (i = 0; i < builtin_files_count; i++)
+ if (!strcmp (name, builtin_files[i].name))
+ break;
+ if (i == builtin_files_count)
+ return NULL;
+ io = (BuiltinIOPtr) xalloc (sizeof (BuiltinIORec));
+ if (!io)
+ return NULL;
+ io->offset = 0;
+ io->file = (void *) &builtin_files[i];
+ raw = BufFileCreate ((char *) io, BuiltinFill, 0, BuiltinSkip, BuiltinClose);
+ if (!raw)
+ {
+ xfree (io);
+ return NULL;
+ }
+ if (cooked = BufFilePushCompressed (raw))
+ raw = cooked;
+ else
+ {
+ raw->left += raw->bufp - raw->buffer;
+ raw->bufp = raw->buffer;
+ }
+ return (FontFilePtr) raw;
+}
+
+BuiltinFileClose (f)
+ FontFilePtr f;
+{
+ return BufFileClose ((BufFilePtr) f, TRUE);
+}