annotate src/tparam.c @ 1314:15a91d7ae2d1

[xemacs-hg @ 2003-02-20 08:16:21 by ben] check in makefile fixes et al Makefile.in.in: Major surgery. Move all stuff related to building anything in the src/ directory into src/. Simplify the dependencies -- everything in src/ is dependent on the single entry `src' in MAKE_SUBDIRS. Remove weirdo targets like `all-elc[s]', dump-elc[s], etc. mule/mule-msw-init.el: Removed. Delete this file. mule/mule-win32-init.el: New file, with stuff from mule-msw-init.el -- not just for MS Windows native, boys and girls! bytecomp.el: Change code inserted to catch trying to load a Mule-only .elc file in a non-Mule XEmacs. Formerly you got the rather cryptic "The required feature `mule' cannot be provided". Now you get "Loading this file requires Mule support". finder.el: Remove dependency on which directory this function is invoked from. update-elc.el: Don't mess around with ../src/BYTECOMPILE_CHANGE. Now that Makefile.in.in and xemacs.mak are in sync, both of them use NEEDTODUMP and the other one isn't used. dumped-lisp.el: Rewrite in terms of `list' and `nconc' instead of assemble-list, so we can have arbitrary forms, not just `when-feature'. very-early-lisp.el: Nuke this file. finder-inf.el, packages.el, update-elc.el, update-elc-2.el, loadup.el, make-docfile.el: Eliminate references to very-early-lisp. msw-glyphs.el: Comment clarification. xemacs.mak: Add macros DO_TEMACS, DO_XEMACS, and a few others; this macro section is now completely in sync with src/Makefile.in.in. Copy check-features, load-shadows, and rebuilding finder-inf.el from src/Makefile.in.in. The main build/dump/recompile process is now synchronized with src/Makefile.in.in. Change `WARNING' to `NOTE' and `error checking' to `error-checking' TO avoid tripping faux warnings and errors in the VC++ IDE. Makefile.in.in: Major surgery. Move all stuff related to building anything in the src/ directory from top-level Makefile.in.in to here. Simplify the dependencies. Rearrange into logical subsections. Synchronize the main compile/dump/build-elcs section with xemacs.mak, which is already clean and in good working order. Remove weirdo targets like `all-elc[s]', dump-elc[s], etc. Add additional levels of macros \(e.g. DO_TEMACS, DO_XEMACS, TEMACS_BATCH, XEMACS_BATCH, XEMACS_BATCH_PACKAGES) to factor out duplicated stuff. Clean up handling of "HEAP_IN_DATA" (Cygwin) so it doesn't need to ignore the return value from dumping. Add .NO_PARALLEL since various aspects of building and dumping must be serialized but do not always have dependencies between them (this is impossible in some cases). Everything related to src/ now gets built in one pass in this directory by just running `make' (except the Makefiles themselves and config.h, paths.h, Emacs.ad.h, and other generated .h files). console.c: Update list of possibly valid console types. emacs.c: Rationalize the specifying and handling of the type of the first frame. This was originally prompted by a workspace in which I got GTK to compile under C++ and in the process fixed it so it could coexist with X in the same build -- hence, a combined TTY/X/MS-Windows/GTK build is now possible under Cygwin. (However, you can't simultaneously *display* more than one kind of device connection -- but getting that to work is not that difficult. Perhaps a project for a bored grad student. I (ben) would do it but don't see the use.) To make sense of this, I added new switches that can be used to specifically indicate the window system: -x [aka --use-x], -tty \[aka --use-tty], -msw [aka --use-ms-windows], -gtk [aka --use-gtk], and -gnome [aka --use-gnome, same as --use-gtk]. -nw continues as an alias for -tty. When none have been given, XEmacs checks for other parameters implying particular device types (-t -> tty, -display -> x [or should it have same treatment as DISPLAY below?]), and has ad-hoc logic afterwards: if env var DISPLAY is set, use x (or gtk? perhaps should check whether gnome is running), else MS Windows if it exsits, else TTY if it exists, else stream, and you must be running in batch mode. This also fixes an existing bug whereby compiling with no x, no mswin, no tty, when running non- interactively (e.g. to dump) I get "sorry, must have TTY support". emacs.c: Turn on Vstack_trace_on_error so that errors are debuggable even when occurring extremely early in reinitialization. emacs.c: Try to make sure that the user can see message output under Windows (i.e. it doesn't just disappear right away) regardless of when it occurs, e.g. in the middle of creating the first frame. emacs.c: Define new function `emacs-run-status', indicating whether XEmacs is noninteractive or interactive, whether raw, post-dump/pdump-load or run-temacs, whether we are dumping, whether pdump is in effect. event-stream.c: It's "mommas are fat", not "momas are fat". Fix other typo. event-stream.c: Conditionalize in_menu_callback check on HAVE_MENUBARS, because it won't exist on w/o menubar support, lisp.h: More hackery on RETURN_NOT_REACHED. Cygwin v3.2 DOES complain here if RETURN_NOT_REACHED() is blank, as it is for GCC 2.5+. So make it blank only for GCC 2.5 through 2.999999999999999. Declare Vstack_trace_on_error. profile.c: Need to include "profile.h" to fix warnings. sheap.c: Don't fatal() when need to rerun Make, just stderr_out() and exit(0). That way we can distinguish between a dumping failing expectedly (due to lack of stack space, triggering another dump) and unexpectedly, in which case, we want to stop building. (or go on, if -K is given) syntax.c, syntax.h: Use ints where they belong, and enum syntaxcode's where they belong, and fix warnings thereby. syntax.h: Fix crash caused by an edge condition in the syntax-cache macros. text.h: Spacing fixes. xmotif.h: New file, to get around shadowing warnings. EmacsManager.c, event-Xt.c, glyphs-x.c, gui-x.c, input-method-motif.c, xmmanagerp.h, xmprimitivep.h: Include xmotif.h. alloc.c: Conditionalize in_malloc on ERROR_CHECK_MALLOC. config.h.in, file-coding.h, fileio.c, getloadavg.c, select-x.c, signal.c, sysdep.c, sysfile.h, systime.h, text.c, unicode.c: Eliminate HAVE_WIN32_CODING_SYSTEMS, use WIN32_ANY instead. Replace defined (WIN32_NATIVE) || defined (CYGWIN) with WIN32_ANY. lisp.h: More futile attempts to walk and chew gum at the same time when dealing with subr's that don't return.
author ben
date Thu, 20 Feb 2003 08:16:21 +0000
parents fdefd0186b75
children a8d8f419b459
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1 /* Merge parameters into a termcap entry string.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2 Copyright (C) 1985, 1987, 1992, 1993, 1994 Free Software Foundation, Inc.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4 This file is part of XEmacs.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6 XEmacs is free software; you can redistribute it and/or modify it
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7 under the terms of the GNU General Public License as published by the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8 Free Software Foundation; either version 2, or (at your option) any
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9 later version.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
10
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
11 XEmacs is distributed in the hope that it will be useful, but WITHOUT
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
14 for more details.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
15
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
16 You should have received a copy of the GNU General Public License
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
17 along with XEmacs; see the file COPYING. If not, write to
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
19 Boston, MA 02111-1307, USA. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
20
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
21 /* Synched up with: Not synched with FSF. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
22
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
23 /* config.h may rename various library functions such as malloc. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
24 #include <config.h>
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 551
diff changeset
25 #include "lisp.h"
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
26
551
e9a3f8b4de53 [xemacs-hg @ 2001-05-21 05:26:06 by martinb]
martinb
parents: 458
diff changeset
27 #undef realloc
e9a3f8b4de53 [xemacs-hg @ 2001-05-21 05:26:06 by martinb]
martinb
parents: 458
diff changeset
28 #undef malloc
e9a3f8b4de53 [xemacs-hg @ 2001-05-21 05:26:06 by martinb]
martinb
parents: 458
diff changeset
29 #undef free
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
30 #define realloc xrealloc
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
31 #define malloc xmalloc
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
32 #define free xfree
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
33 extern void *xmalloc (Bytecount size);
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
34 extern void *xrealloc (void *, Bytecount size);
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
35
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
36 /* Assuming STRING is the value of a termcap string entry
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
37 containing `%' constructs to expand parameters,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
38 merge in parameter values and store result in block OUTSTRING points to.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
39 LEN is the length of OUTSTRING. If more space is needed,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
40 a block is allocated with `malloc'.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
41
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
42 The value returned is the address of the resulting string.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
43 This may be OUTSTRING or may be the address of a block got with `malloc'.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
44 In the latter case, the caller must free the block.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
45
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
46 The fourth and following args to tparam serve as the parameter values. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
47
398
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents: 0
diff changeset
48 static char *tparam1 (const char *string, char *outstring, int len,
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents: 0
diff changeset
49 const char *up, const char *left,
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
50 int *argp);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
51
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
52 /* XEmacs: renamed this function because just tparam() conflicts with
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
53 ncurses */
398
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents: 0
diff changeset
54 char *emacs_tparam (const char *string, char *outstring, int len, int arg0,
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
55 int arg1, int arg2, int arg3);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
56 char *
398
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents: 0
diff changeset
57 emacs_tparam (const char *string, char *outstring, int len, int arg0,
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
58 int arg1, int arg2, int arg3)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
59 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
60 int arg[4];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
61 arg[0] = arg0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
62 arg[1] = arg1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
63 arg[2] = arg2;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
64 arg[3] = arg3;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
65 return tparam1 (string, outstring, len, 0, 0, arg);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
66 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
67
398
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents: 0
diff changeset
68 const char *BC;
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents: 0
diff changeset
69 const char *UP;
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
70
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
71 static char tgoto_buf[50];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
72
398
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents: 0
diff changeset
73 char *tgoto (const char *cm, int hpos, int vpos);
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
74 char *
398
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents: 0
diff changeset
75 tgoto (const char *cm, int hpos, int vpos)
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
76 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
77 int args[2];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
78 if (!cm)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
79 return 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
80 args[0] = vpos;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
81 args[1] = hpos;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
82 return tparam1 (cm, tgoto_buf, 50, UP, BC, args);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
83 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
84
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
85 static char *
398
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents: 0
diff changeset
86 tparam1 (const char *string, char *outstring, int len, const char *up,
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents: 0
diff changeset
87 const char *left, int *argp)
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
88 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
89 int c;
398
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents: 0
diff changeset
90 const char *p = string;
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
91 char *op = outstring;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
92 char *outend;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
93 int outlen = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
94
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
95 int tem;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
96 int *old_argp = argp;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
97 int doleft = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
98 int doup = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
99
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
100 outend = outstring + len;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
101
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
102 while (1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
103 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
104 /* If the buffer might be too short, make it bigger. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
105 if (op + 5 >= outend)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
106 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
107 char *new;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
108 if (outlen == 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
109 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
110 outlen = len + 40;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
111 new = (char *) malloc (outlen);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
112 outend += 40;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
113 memcpy (new, outstring, op - outstring);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
114 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
115 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
116 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
117 outend += outlen;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
118 outlen *= 2;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
119 new = (char *) realloc (outstring, outlen);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
120 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
121 op += new - outstring;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
122 outend += new - outstring;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
123 outstring = new;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
124 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
125 c = *p++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
126 if (!c)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
127 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
128 if (c == '%')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
129 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
130 c = *p++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
131 tem = *argp;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
132 switch (c)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
133 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
134 case 'd': /* %d means output in decimal. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
135 if (tem < 10)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
136 goto onedigit;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
137 if (tem < 100)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
138 goto twodigit;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
139 case '3': /* %3 means output in decimal, 3 digits. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
140 if (tem > 999)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
141 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
142 *op++ = tem / 1000 + '0';
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
143 tem %= 1000;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
144 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
145 *op++ = tem / 100 + '0';
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
146 case '2': /* %2 means output in decimal, 2 digits. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
147 twodigit:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
148 tem %= 100;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
149 *op++ = tem / 10 + '0';
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
150 onedigit:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
151 *op++ = tem % 10 + '0';
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
152 argp++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
153 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
154
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
155 case 'C':
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
156 /* For c-100: print quotient of value by 96, if nonzero,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
157 then do like %+. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
158 if (tem >= 96)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
159 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
160 *op++ = tem / 96;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
161 tem %= 96;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
162 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
163 case '+': /* %+x means add character code of char x. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
164 tem += *p++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
165 case '.': /* %. means output as character. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
166 if (left)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
167 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
168 /* If want to forbid output of 0 and \n and \t,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
169 and this is one of them, increment it. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
170 while (tem == 0 || tem == '\n' || tem == '\t')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
171 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
172 tem++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
173 if (argp == old_argp)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
174 doup++, outend -= strlen (up);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
175 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
176 doleft++, outend -= strlen (left);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
177 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
178 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
179 *op++ = tem | 0200;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
180 case 'f': /* %f means discard next arg. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
181 argp++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
182 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
183
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
184 case 'b': /* %b means back up one arg (and re-use it). */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
185 argp--;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
186 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
187
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
188 case 'r': /* %r means interchange following two args. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
189 argp[0] = argp[1];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
190 argp[1] = tem;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
191 old_argp++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
192 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
193
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
194 case '>': /* %>xy means if arg is > char code of x, */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
195 if (argp[0] > *p++) /* then add char code of y to the arg, */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
196 argp[0] += *p; /* and in any case don't output. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
197 p++; /* Leave the arg to be output later. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
198 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
199
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
200 case 'a': /* %a means arithmetic. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
201 /* Next character says what operation.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
202 Add or subtract either a constant or some other arg. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
203 /* First following character is + to add or - to subtract
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
204 or = to assign. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
205 /* Next following char is 'p' and an arg spec
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
206 (0100 plus position of that arg relative to this one)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
207 or 'c' and a constant stored in a character. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
208 tem = p[2] & 0177;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
209 if (p[1] == 'p')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
210 tem = argp[tem - 0100];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
211 if (p[0] == '-')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
212 argp[0] -= tem;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
213 else if (p[0] == '+')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
214 argp[0] += tem;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
215 else if (p[0] == '*')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
216 argp[0] *= tem;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
217 else if (p[0] == '/')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
218 argp[0] /= tem;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
219 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
220 argp[0] = tem;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
221
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
222 p += 3;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
223 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
224
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
225 case 'i': /* %i means add one to arg, */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
226 argp[0] ++; /* and leave it to be output later. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
227 argp[1] ++; /* Increment the following arg, too! */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
228 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
229
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
230 case '%': /* %% means output %; no arg. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
231 goto ordinary;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
232
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
233 case 'n': /* %n means xor each of next two args with 140. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
234 argp[0] ^= 0140;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
235 argp[1] ^= 0140;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
236 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
237
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
238 case 'm': /* %m means xor each of next two args with 177. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
239 argp[0] ^= 0177;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
240 argp[1] ^= 0177;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
241 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
242
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
243 case 'B': /* %B means express arg as BCD char code. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
244 argp[0] += 6 * (tem / 10);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
245 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
246
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
247 case 'D': /* %D means weird Delta Data transformation. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
248 argp[0] -= 2 * (tem % 16);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
249 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
250 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
251 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
252 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
253 /* Ordinary character in the argument string. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
254 ordinary:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
255 *op++ = c;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
256 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
257 *op = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
258 while (doup-- > 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
259 strcat (op, up);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
260 while (doleft-- > 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
261 strcat (op, left);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
262 return outstring;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
263 }