Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Path: utzoo!mnetor!uunet!rsalz From: rsalz@uunet.UU.NET (Rich Salz) Newsgroups: comp.sources.unix Subject: v12i060: A PostScript interpreter, Part11/18 Message-ID: <2858@uunet.UU.NET> Date: Fri, 6-Nov-87 14:03:23 EST Article-I.D.: uunet.2858 Posted: Fri Nov 6 14:03:23 1987 Date-Received: Sun, 8-Nov-87 15:43:16 EST Organization: UUNET Communications Services, Arlington, VA Lines: 5867 Approved: rs@uunet.UU.NET Submitted-by: Crispin Goswell Posting-number: Volume 12, Issue 60 Archive-name: postscript/part11 #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh 'postscript/fonts/Times/bits.r' <<'END_OF_FILE' XCharStrings X/2281 X Xput XMetrics X/2281 X[-1 X27] Xput XCharStrings X/2282 X Xput XMetrics X/2282 X[4 X17] Xput XCharStrings X/2283 X Xput XMetrics X/2283 X[3 X19] Xput XCharStrings X/2284 X Xput XMetrics X/2284 X[-2 X28] Xput XCharStrings X/2285 X Xput XMetrics X/2285 X[0 X25] Xput XCharStrings X/2286 X Xput XMetrics X/2286 X[0 X22] Xput XCharStrings X/2287 X Xput XMetrics X/2287 X[3 X19] Xput XCharStrings X/2288 X Xput XMetrics X/2288 X[3 X19] Xput XCharStrings X/2289 X Xput XMetrics X/2289 X[1 X23] Xput XCharStrings X/2290 X Xput XMetrics X/2290 X[1 X22] Xput XCharStrings X/2291 X Xput XMetrics X/2291 X[1 X19] Xput XCharStrings X/2292 X Xput XMetrics X/2292 X[-2 X25] Xput XCharStrings X/2293 X Xput XMetrics X/2293 X[-3 X20] Xput XCharStrings X/2294 X Xput XMetrics X/2294 X[-1 X24] Xput XCharStrings X/2295 X Xput XMetrics X/2295 X[-1 X24] Xput XCharStrings X/2301 X Xput XMetrics X/2301 X[-1 X25] Xput XCharStrings X/2302 X Xput XMetrics X/2302 X[-1 X24] Xput XCharStrings X/2303 X Xput XMetrics X/2303 X[-1 X24] Xput XCharStrings X/2304 X Xput XMetrics X/2304 X[-3 X24] Xput XCharStrings X/2305 X Xput XMetrics X/2305 X[-1 X23] Xput XCharStrings X/2306 X Xput XMetrics X/2306 X[-1 X24] Xput XCharStrings X/2307 X Xput XMetrics X/2307 X[-1 X24] Xput XCharStrings X/2308 X Xput XMetrics X/2308 X[-1 X25] Xput XCharStrings X/2309 X Xput XMetrics X/2309 X[-2 X22] Xput XCharStrings X/2310 X Xput XMetrics X/2310 X[-2 X24] Xput XCharStrings X/2311 X Xput XMetrics X/2311 X[-3 X24] Xput XCharStrings X/2312 X Xput XMetrics X/2312 X[-2 X24] Xput XCharStrings X/2317 X Xput XMetrics X/2317 X[-3 X8] Xput XCharStrings X/2318 X Xput XMetrics X/2318 X[-3 X16] Xput XCharStrings X/2319 X Xput XMetrics X/2319 X[4 X16] Xput XCharStrings X/2320 X Xput XMetrics X/2320 X[-3 X20] Xput XCharStrings X/2321 X Xput XMetrics X/2321 X[-3 X20] Xput XCharStrings X/2322 X Xput XMetrics X/2322 X[-3 X17] Xput XCharStrings X/2323 X Xput XMetrics X/2323 X[4 X16] Xput XCharStrings X/2324 X Xput XMetrics X/2324 X[4 X16] Xput XCharStrings X/2325 X Xput XMetrics X/2325 X[8 X16] Xput XCharStrings X/2326 X Xput XMetrics X/2326 X[-3 X26] Xput XCharStrings X/2327 X Xput XMetrics X/2327 X[-3 X16] Xput XCharStrings X/2328 X Xput XMetrics X/2328 X[-1 X16] Xput XCharStrings X/2329 X Xput XMetrics X/2329 X[-1 X16] Xput XCharStrings X/2330 X Xput XMetrics X/2330 X[21 X29] Xput XCharStrings X/2331 X Xput XMetrics X/2331 X[-3 X33] Xput XCharStrings X/2332 X Xput XMetrics X/2332 X[4 X28] Xput XCharStrings X/2367 X Xput XMetrics X/2367 X[-3 X8] Xput XCharStrings X/2368 X Xput XMetrics X/2368 X[-3 X16] Xput XCharStrings X/2369 X Xput XMetrics X/2369 X[4 X16] Xput XCharStrings X/2370 X Xput XMetrics X/2370 X[-3 X20] Xput XCharStrings X/2371 X Xput XMetrics X/2371 X[-3 X20] Xput XCharStrings X/2372 X Xput XMetrics X/2372 X[-3 X17] Xput XCharStrings X/2373 X Xput XMetrics X/2373 X[4 X16] Xput XCharStrings X/2374 X Xput XMetrics X/2374 X[4 X16] Xput XCharStrings X/2375 X Xput XMetrics X/2375 X[8 X16] Xput XCharStrings X/2376 X Xput XMetrics X/2376 X[-3 X26] Xput XCharStrings X/2377 X Xput XMetrics X/2377 X[-3 X16] Xput XCharStrings X/2378 X Xput XMetrics X/2378 X[7 X16] Xput XCharStrings X/2379 X Xput XMetrics X/2379 X[-1 X16] Xput XCharStrings X/2380 X Xput XMetrics X/2380 X[21 X29] Xput XCharStrings X/2381 X Xput XMetrics X/2381 X[1 X33] Xput XCharStrings X/2382 X Xput XMetrics X/2382 X[6 X28] Xput XCharStrings X/Product X Xput XMetrics X/Product X[-1 X34] Xput XCharStrings X/Sum X Xput XMetrics X/Sum X[0 X31] Xput XCharStrings X/Parenleft X Xput XMetrics X/Parenleft X[30 X18] Xput XCharStrings X/Parenright X Xput XMetrics X/Parenright X[30 X18] Xput XCharStrings X/Bracketleft X Xput XMetrics X/Bracketleft X[30 X18] Xput XCharStrings X/Bracketright X Xput XMetrics X/Bracketright X[30 X18] Xput XCharStrings X/Braceleft X Xput XMetrics X/Braceleft X[30 X18] Xput XCharStrings X/Braceright X Xput XMetrics X/Braceright X[30 X18] Xput XCharStrings X/Braceleft1 X Xput XMetrics X/Braceleft1 X[27 X18] Xput XCharStrings X/Braceright1 X Xput XMetrics X/Braceright1 X[27 X18] Xput XCharStrings X/Radical X Xput XMetrics X/Radical X[21 X35] Xput XCharStrings X/Integral X Xput XMetrics X/Integral X[24 X30] Xput END_OF_FILE if test 14110 -ne `wc -c <'postscript/fonts/Times/bits.r'`; then echo shar: \"'postscript/fonts/Times/bits.r'\" unpacked with wrong size! fi # end of 'postscript/fonts/Times/bits.r' fi if test -f 'postscript/fonts/extra/extra.r' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'postscript/fonts/extra/extra.r'\" else echo shar: Extracting \"'postscript/fonts/extra/extra.r'\" \(13017 characters\) sed "s/^X//" >'postscript/fonts/extra/extra.r' <<'END_OF_FILE' XCharStrings X/4000 X Xput XMetrics X/4000 X[3 X18] Xput XCharStrings X/4001 X Xput XMetrics X/4001 X[-4 X32] Xput XCharStrings X/4002 X Xput XMetrics X/4002 X[-3 X14] Xput XCharStrings X/4003 X Xput XMetrics X/4003 X[0 X16] Xput XCharStrings X/4004 X Xput XMetrics X/4004 X[0 X24] Xput XCharStrings X/4005 X Xput XMetrics X/4005 X[0 X24] Xput XCharStrings X/4006 X Xput XMetrics X/4006 X[-1 X25] Xput XCharStrings X/4007 X Xput XMetrics X/4007 X[9 X14] Xput XCharStrings X/4008 X Xput XMetrics X/4008 X[9 X14] Xput XCharStrings X/4009 X Xput XMetrics X/4009 X[3 X18] Xput XCharStrings X/4010 X Xput XMetrics X/4010 X[-2 X27] Xput XCharStrings X/4011 X Xput XMetrics X/4011 X[-2 X27] Xput XCharStrings X/4012 X Xput XMetrics X/4012 X[-4 X26] Xput XCharStrings X/4013 X Xput XMetrics X/4013 X[-4 X26] Xput XCharStrings X/4051 X Xput XMetrics X/4051 X[0 X24] Xput XCharStrings X/4052 X Xput XMetrics X/4052 X[-2 X32] Xput XCharStrings X/4053 X Xput XMetrics X/4053 X[-2 X32] Xput XCharStrings X/4054 X Xput XMetrics X/4054 X[1 X20] Xput XCharStrings X/4055 X Xput XMetrics X/4055 X[0 X20] Xput XCharStrings X/4061 X Xput XMetrics X/4061 X[-2 X28] Xput XCharStrings X/4062 X Xput XMetrics X/4062 X[-3 X37] Xput XCharStrings X/4063 X Xput XMetrics X/4063 X[-3 X37] Xput XCharStrings X/4064 X Xput XMetrics X/4064 X[-2 X23] Xput XCharStrings X/4065 X Xput XMetrics X/4065 X[-2 X23] Xput XCharStrings X/4071 X Xput XMetrics X/4071 X[-2 X28] Xput XCharStrings X/4072 X Xput XMetrics X/4072 X[-2 X40] Xput XCharStrings X/4073 X Xput XMetrics X/4073 X[-2 X40] Xput XCharStrings X/4074 X Xput XMetrics X/4074 X[-2 X26] Xput XCharStrings X/4075 X Xput XMetrics X/4075 X[-2 X26] Xput XCharStrings X/4081 X Xput XMetrics X/4081 X[2 X32] Xput XCharStrings X/4082 X Xput XMetrics X/4082 X[2 X45] Xput XCharStrings X/4083 X Xput XMetrics X/4083 X[2 X44] Xput XCharStrings X/4084 X Xput XMetrics X/4084 X[2 X29] Xput XCharStrings X/4085 X Xput XMetrics X/4085 X[2 X28] Xput XCharStrings X/4101 X Xput XMetrics X/4101 X[-4 X32] Xput XCharStrings X/4102 X Xput XMetrics X/4102 X[-3 X14] Xput XCharStrings X/4103 X Xput XMetrics X/4103 X[0 X16] Xput XCharStrings X/4109 X Xput XMetrics X/4109 X[3 X18] Xput XCharStrings X/4110 X Xput XMetrics X/4110 X[-2 X27] Xput XCharStrings X/4111 X Xput XMetrics X/4111 X[-2 X27] Xput XCharStrings X/4204 X Xput XMetrics X/4204 X[0 X24] Xput XCharStrings X/4205 X Xput XMetrics X/4205 X[0 X24] Xput XCharStrings X/4206 X Xput XMetrics X/4206 X[-1 X25] Xput XCharStrings X/4209 X Xput XMetrics X/4209 X[2 X19] Xput XCharStrings X/4210 X Xput XMetrics X/4210 X[-2 X27] Xput XCharStrings X/4211 X Xput XMetrics X/4211 X[-2 X27] Xput XCharStrings X/4212 X Xput XMetrics X/4212 X[8 X16] Xput XCharStrings X/4213 X Xput XMetrics X/4213 X[8 X16] Xput XCharStrings X/5001 X Xput XMetrics X/5001 X[8 X8] Xput XCharStrings X/5002 X Xput XMetrics X/5002 X[0 X16] Xput XCharStrings X/5003 X Xput XMetrics X/5003 X[-1 X24] Xput XCharStrings X/5004 X Xput XMetrics X/5004 X[8 X16] Xput XCharStrings X/5005 X Xput XMetrics X/5005 X[-3 X24] Xput XCharStrings X/5006 X Xput XMetrics X/5006 X[-4 X26] Xput XCharStrings X/5007 X Xput XMetrics X/5007 X[8 X17] Xput XCharStrings X/5008 X Xput XMetrics X/5008 X[8 X17] Xput XCharStrings X/5009 X Xput XMetrics X/5009 X[8 X17] Xput XCharStrings X/5010 X Xput XMetrics X/5010 X[8 X17] Xput XCharStrings X/5011 X Xput XMetrics X/5011 X[8 X17] Xput XCharStrings X/5012 X Xput XMetrics X/5012 X[8 X17] Xput XCharStrings X/5013 X Xput XMetrics X/5013 X[8 X17] Xput XCharStrings X/5014 X Xput XMetrics X/5014 X[8 X17] Xput XCharStrings X/5015 X Xput XMetrics X/5015 X[8 X17] Xput XCharStrings X/5016 X Xput XMetrics X/5016 X[8 X17] Xput XCharStrings X/5017 X Xput XMetrics X/5017 X[8 X17] Xput XCharStrings X/5018 X Xput XMetrics X/5018 X[3 X16] Xput XCharStrings X/5019 X Xput XMetrics X/5019 X[3 X16] Xput XCharStrings X/5020 X Xput XMetrics X/5020 X[-3 X20] Xput XCharStrings X/5021 X Xput XMetrics X/5021 X[16 X0] Xput XCharStrings X/5022 X Xput XMetrics X/5022 X[-1 X24] Xput XCharStrings X/5023 X Xput XMetrics X/5023 X[-1 X23] Xput XCharStrings X/5024 X Xput XMetrics X/5024 X[-3 X38] Xput END_OF_FILE if test 13017 -ne `wc -c <'postscript/fonts/extra/extra.r'`; then echo shar: \"'postscript/fonts/extra/extra.r'\" unpacked with wrong size! fi # end of 'postscript/fonts/extra/extra.r' fi if test -f 'source/string.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'source/string.c'\" else echo shar: Extracting \"'source/string.c'\" \(14328 characters\) sed "s/^X//" >'source/string.c' <<'END_OF_FILE' X/* X * Copyright (C) Rutherford Appleton Laboratory 1987 X * X * This source may be copied, distributed, altered or used, but not sold for profit X * or incorporated into a product except under licence from the author. X * It is not in the public domain. X * This notice should remain in the source unaltered, and any changes to the source X * made by persons other than the author should be marked as such. X * X * Crispin Goswell @ Rutherford Appleton Laboratory caag@uk.ac.rl.vd X */ X#include "main.h" X Xstatic Object OpForString, Make (); X Xint putIString (); X XObject ParseString (), ParseHexString (), StringFrom (); Xstatic unsigned char *Body (); Xstatic int forString (); X Xstatic int Exec (), Token (), PString (), Search (), AnchorSearch (), Copy (), EqEq (); Xstatic int Length (), ForAll (), Get (), Put (), GetInterval (), PutInterval (), Eq (), Lt (), Le (), Gt (), Ge (), PrCheck (), PwCheck (); Xstatic int Cvi (), Cvr (), Cvs (), PReadOnly (), PExecOnly (); X XInitString () X { X OpForString = MakeOp ("(forallstring)", forString, 0, 0, 3, 5); X X TypeInstallOp (String, "cvi", Cvi, 1, 1, 0, 0, String); X TypeInstallOp (String, "cvr", Cvr, 1, 1, 0, 0, String); X TypeInstallOp (String, "cvs", Cvs, 2, 1, 0, 0, String, String); X TypeInstallOp (String, "==", EqEq, 1, 0, 0, 0, String); X TypeInstallOp (String, "exec", Exec, 1, 0, 0, 1, String); X TypeInstallOp (String, "token", Token, 1, 3, 0, 2, String); X TypeInstallOp (String, "eq", Eq, 2, 1, 0, 0, String, String); X TypeInstallOp (String, "lt", Lt, 2, 1, 0, 0, String, String); X TypeInstallOp (String, "le", Le, 2, 1, 0, 0, String, String); X TypeInstallOp (String, "gt", Gt, 2, 1, 0, 0, String, String); X TypeInstallOp (String, "ge", Ge, 2, 1, 0, 0, String, String); X TypeInstallOp (String, "length", Length, 1, 1, 0, 0, String); X TypeInstallOp (String, "forall", ForAll, 2, 0, 0, 4, String, Array); X TypeInstallOp (String, "copy", Copy, 2, 1, 0, 0, String, String); X TypeInstallOp (String, "get", Get, 2, 1, 0, 0, String, Integer); X TypeInstallOp (String, "put", Put, 3, 0, 0, 0, String, Integer, Integer); X TypeInstallOp (String, "getinterval", GetInterval, 3, 1, 0, 0, String, Integer, Integer); X TypeInstallOp (String, "putinterval", PutInterval, 3, 0, 0, 0, String, Integer, String); X TypeInstallOp (String, "executeonly", PExecOnly, 1, 1, 0, 0, String); X TypeInstallOp (String, "readonly", PReadOnly, 1, 1, 0, 0, String); X TypeInstallOp (String, "rcheck", PrCheck, 1, 1, 0, 0, String); X TypeInstallOp (String, "wcheck", PwCheck, 1, 1, 0, 0, String); X TypeInstallOp (String, "token", Token, 1, 3, 0, 0, String); X X InstallOp ("string", PString, 1, 1, 0, 0, Integer); X InstallOp ("search", Search, 2, 4, 0, 0, String, String); X InstallOp ("anchorsearch", AnchorSearch, 2, 3, 0, 0, String, String); X } X Xstatic int Cvi (rep) Object rep; X { X Object v; X X v = ParseNumber (BodyString (rep), lengthString (rep)); X if (TypeOf (v) == Integer) X return Push (OpStack, v); X else if (TypeOf (v) == Real) X return Push (OpStack, IntReal (v)); X else if (TypeOf (v) == Condition) X return Error (PUnResult); X else X return Error (PSyntaxError); X } X Xstatic int Cvr (rep) Object rep; X { X Object v; X X v = ParseNumber (BodyString (rep), lengthString (rep)); X if (TypeOf (v) == Real) X return Push (OpStack, v); X else if (TypeOf (v) == Integer) X return Push (OpStack, RealInteger (v)); X else if (TypeOf (v) == Condition) X return Push (OpStack, rep), Error (PUnResult); X else X return Push (OpStack, rep), Error (PSyntaxError); X } X Xstatic int Cvs (v, string) Object v, string; X { X int length; X X if (lengthString (string) < (length = lengthString (v))) X return Error (PRangeCheck); X VOID Bcopy (BodyString (string), BodyString (v), length); X return Push (OpStack, getIString (string, 0, length)); X } X Xstatic int EqEq (v) Object v; X { X int c, i, l = lengthString (v); X unsigned char *s = BodyString (v); X X putchar ('('); X for (i = 0; i < l && !Interrupted (); i++) X switch (c = s[i]) X { X default: X if (c < ' ' || c > 126) X printf ("\\%o", c); X else X putchar (c); X break; X X case '\n': printf ("\\n"); break; X case '\r': printf ("\\r"); break; X case '\t': printf ("\\t"); break; X case '\b': printf ("\\b"); break; X case '\f': printf ("\\f"); break; X } X printf (")"); X return TRUE; X } X Xstatic int Exec (item) Object item; X { X return Push (ExecStack, Cvx (FileString (item))); X } X Xstatic int Token (f) Object f; X { X Object res, fs; X X res = Parse (fs = FileString (f)); X if (TypeOf (res) == Condition) X return Error (PSyntaxError); X else if (TypeOf (res) == Null) X return Error (PUnResult); X else if (TypeOf (res) != Boolean) X { X VOID Push (OpStack, Cvx (SameFlags (f, getIString (f, X lengthString (f) - BodyFile (fs)->available, X BodyFile (fs)->available)))); X VOID Push (OpStack, res); X VOID Push (OpStack, True); X } X else if (BodyBoolean (res)) X { X VOID Push (OpStack, f); X VOID Push (OpStack, False); X } X else X return Error (PSyntaxError); X return TRUE; X } X XObject MakeString (s, length) unsigned char *s; int length; X { X Object res; X char *new; X X res = MakeObject (String); X res.u.String = (unsigned char *) (new = Malloc ((unsigned) length)); X bcopy (s, new, length); X res.Length = length; X X return res; X } X Xstatic Object Make (s, length) unsigned char *s; int length; X { X Object res; X char *new; X X res = MakeObject (String); X res.u.String = (unsigned char *) (new = Malloc ((unsigned) length)); X bcopy (s, new, length); X res.Length = length; X X return res; X } X XObject StringFrom (s) unsigned char *s; X { X Object res; X X res = MakeObject (String); X res.u.String = s; X res.Length = strlen ((char *) s); X X return res; X } X Xstatic int Eq (a, b) Object a, b; X { X return Push (OpStack, MakeBoolean (EqString (a, b))); X } X Xint EqString (a, b) Object a, b; X { X int al = lengthString (a), X bl = lengthString (b); X X return al == bl && 0 == strncmp ((char *) Body (a), (char *) Body (b), al); X } X Xstatic int Lt (a, b) Object a, b; X { X int al = lengthString (a), X bl = lengthString (b), X cmp = strncmp ((char *) Body (a), (char *) Body (b), min (al, bl)); X X return Push (OpStack, MakeBoolean (cmp < 0 || cmp == 0 && al < bl)); X } X Xstatic int Le (a, b) Object a, b; X { X return Push (OpStack, X MakeBoolean ( X strncmp ((char *) Body (a), X (char *) Body (b), X min (lengthString (a), lengthString (b))) <= 0)); X } X Xstatic int Gt (a, b) Object a, b; X { X int al = lengthString (a), X bl = lengthString (b), X cmp = strncmp ((char *) Body (a), (char *) Body (b), min (al, bl)); X X return Push (OpStack, MakeBoolean (cmp > 0 || cmp == 0 && al > bl)); X } X Xstatic int Ge (a, b) Object a, b; X { X return Push (OpStack, X MakeBoolean ( X strncmp ((char *) Body (a), X (char *) Body (b), X min (lengthString (a), lengthString (b))) >= 0)); X } X Xint lengthString (object) Object object; X { X return object.Length; X } X Xstatic int Length (object) Object object; X { X return Push (OpStack, MakeInteger (lengthString (object))); X } X Xunsigned char *BodyString (object) Object object; X { X return object.u.String; X } X Xstatic unsigned char *Body (object) Object object; X { X return object.u.String; X } X Xstatic int Get (object, key) Object object, key; X { X int index; X X if (TypeOf (key) == Integer) X index = BodyInteger (key); X else if (TypeOf (key) == Real) X index = (int) BodyReal (key); X else X return Error (PTypeCheck); X if (index >= 0 && index < lengthString (object)) X return Push (OpStack, MakeInteger ((int) Body (object)[index])); X else X return Error (PRangeCheck); X } X Xint getString (object, index) Object object; int index; X { X return Body (object)[index]; X } X Xstatic int GetInterval (object, begin, length) Object object, begin, length; X { X int b = BodyInteger (begin), l = BodyInteger (length); X X if (l < 0 || b < 0 || b + l > lengthString (object)) X return Error (PRangeCheck); X return Push (OpStack, getIString (object, b, l)); X } X XObject getIString (object, begin, length) Object object; int begin, length; X { X return Make (Body (object) + begin, length); X } X Xstatic int Put (object, key, value) Object object, key, value; X { X int index; X X if (TypeOf (key) == Integer) X index = BodyInteger (key); X else if (TypeOf (key) == Real) X index = (int) BodyReal (key); X else X return Error (PTypeCheck); X if (index < 0 || index >= lengthString (object)) X return Error (PRangeCheck); X else if (TypeOf (value) != Integer) X return Error (PTypeCheck); X Body (object)[index] = BodyInteger (value); X return TRUE; X } X XputString (object, index, value) Object object; int index, value; X { X Body (object)[index] = value; X } X Xstatic int PutInterval (object1, begin, object2) Object object1, begin, object2; X { X int b = BodyInteger (begin); X X if (lengthString (object2) + b > lengthString (object1)) X return Error (PRangeCheck); X VOID putIString (object1, b, object2); X return TRUE; X } X Xint putIString (object1, begin, object2) Object object1, object2; int begin; X { X int l = lengthString (object2); X unsigned char *from = Body (object2), *to = Body (object1) + begin; X X while (l--) X *to++ = *from++; X X return TRUE; X } X Xstatic int Copy (object1, object2) Object object1, object2; X { X if (lengthString (object1) <= lengthString (object2)) X { X VOID putIString (object2, 0, object1); X VOID Push (OpStack, getIString (object2, 0, lengthString (object1))); X return TRUE; X } X else X return Error (PRangeCheck); X } X Xstatic int match (a, b, max) unsigned char *a, *b; int max; X { X int i; X X for (i = 0; i < max && *a++ == *b++; i++) X ; X return i; X } X Xstatic ForAll (string, proc) Object string, proc; X { X VOID Push (ExecStack, string); X VOID Push (ExecStack, MakeInteger (0)); X VOID Push (ExecStack, proc); X VOID Push (ExecStack, OpForString); X X return TRUE; X } X Xstatic int forString () X { X Object string, index, proc; X X proc = Pop (ExecStack); X index = Pop (ExecStack); X string = Pop (ExecStack); X X if (BodyInteger (index) >= lengthString (string)) X return TRUE; X X VOID Push (ExecStack, string); X VOID Push (ExecStack, MakeInteger (BodyInteger (index) + 1)); X VOID Push (ExecStack, proc); X VOID Push (ExecStack, OpForString); X VOID Push (ExecStack, proc); X X VOID Push (OpStack, MakeInteger (getString (string, BodyInteger (index)))); X return TRUE; X } X XObject ParseString (o) Object o; X { X unsigned char buf[BUFSIZE], *p = buf; X int c, length = 0, level = 0, foo; X X for (;;) X { X if (length == BUFSIZE) X return Absent; X switch (c = Getch (o)) X { X default: *p++ = c; ++length; continue; X X case EOF: return Nil; X X case '(': ++level; *p++ = c; ++length; continue; X X case ')': X if (--level < 0) X break; X else X { X *p++ = c; X ++length; X } X continue; X X case '\\': X if (BodyFile (o)->file_type != StringFile) X switch (c = Getch (o)) X { X default: *p++ = c; ++length; break; X X case EOF: return Nil; X X case '\n': /* nothing */ break; X case 'n': c = '\n'; *p++ = c; ++length; break; X case 'r': c = '\r'; *p++ = c; ++length; break; X case 't': c = '\t'; *p++ = c; ++length; break; X case 'b': c = '\b'; *p++ = c; ++length; break; X case 'f': c = '\f'; *p++ = c; ++length; break; X X case '0': case '1': case '2': case '3': X case '4': case '5': case '6': case '7': X c = c - '0'; X foo = Getch (o); /* breaks PNX C compiler when inline */ X c = (c << 3) + foo - '0'; X foo = Getch (o); /* breaks PNX C compiler when inline */ X c = (c << 3) + foo - '0'; X *p++ = c; ++length; X break; X } X else X *p++ = c, ++length; X continue; X } X break; X } X X return Make (buf, length); X } X XObject ParseHexString (o) Object o; X { X unsigned char buf [BUFSIZE], *p = buf; X int c, count = 0, val = 0, length = 0; X X while ((c = Getch (o)) != '>' && c != EOF && length < BUFSIZE) X { X if (c >= '0' && c <= '9') X val = val * 16 + c - '0'; X else if (c >= 'A' && c <= 'F') X val = val * 16 + 10 + c - 'A'; X else if (c >= 'a' && c <= 'z') X val = val * 16 + 10 + c - 'a'; X else X --count; X if (++count == 2) X { X *p++ = val; ++length; X count = val = 0; X } X } X if (length == BUFSIZE) X return Absent; X return c == EOF ? Nil : Make (buf, length); X } X Xstatic int PString (length) Object length; X { X int l; X unsigned char *body, *p; X X if ((l = BodyInteger (length)) < 0) X return Error (PRangeCheck); X body = (unsigned char *) Malloc ((unsigned) l); X X for (p = body; p < &body[l]; p++) X *p = '\0'; X return Push (OpStack, Make (body, l)); X } X Xstatic int AnchorSearch (string, seek) Object string, seek; X { X unsigned char *str = Body (string), *see = Body (seek); X int m, lstr = lengthString (string), lsee = lengthString (seek); X X if (lsee > lstr || (m = match (str, see, lsee)) != lsee) X VOID Push (OpStack, string), X VOID Push (OpStack, False); X else X { X VOID Push (OpStack, Make (str + m, lstr - m)); X VOID Push (OpStack, Make (str, m)); X VOID Push (OpStack, True); X } X return TRUE; X } X Xstatic int Search (string, seek) Object string, seek; X { X unsigned char *str = Body (string), *body = str, *see = Body (seek); X int i, m, lstr = lengthString (string), lsee = lengthString (seek); X X for (i = lstr - lsee; i >= 0; i--) X if ((m = match (str, see, lsee)) == lsee) X { X VOID Push (OpStack, Make (body + (str - body) + m, lstr - (str - body + m))); X VOID Push (OpStack, Make (body + (str - body), m)); X VOID Push (OpStack, Make (body, str - body)); X VOID Push (OpStack, True); X return TRUE; X } X else X ++str; X VOID Push (OpStack, string); X VOID Push (OpStack, False); X X return TRUE; X } X Xstatic int PExecOnly (item) Object item; X { X return Push (OpStack, ExecOnly (item)); X } X Xstatic int PReadOnly (item) Object item; X { X return Push (OpStack, ReadOnly (item)); X } X Xstatic int PrCheck (v) Object v; X { X return Push (OpStack, MakeBoolean (rCheck (v))); X } X Xstatic int PwCheck (v) Object v; X { X return Push (OpStack, MakeBoolean (wCheck (v))); X } X Xunsigned char *Bcopy (a, b, n) unsigned char *a, *b; int n; X { X unsigned char *res = a; X X while (n--) X *a++ = *b++; X return res; X } END_OF_FILE if test 14328 -ne `wc -c <'source/string.c'`; then echo shar: \"'source/string.c'\" unpacked with wrong size! fi # end of 'source/string.c' fi echo shar: End of archive 11 \(of 18\). cp /dev/null ark11isdone MISSING="" for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 18 archives. rm -f ark[1-9]isdone ark[1-9][0-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0