annotate src/tparam.c @ 622:11502791fc1c

[xemacs-hg @ 2001-06-22 01:49:57 by ben] dired-msw.c: Fix problem noted by Michael Sperber with directories containing [] and code that destructively modifies an existing string. term\AT386.el: Fix warnings. term\apollo.el: Removed. Kill kill kill. Sync with FSF and remove most crap. term\linux.el: Removed. Sync with FSF. Don't define most defns, because they are automatically defined by termcap. But do add defns for keys that normally get defined as f13, f14, etc. and really ought to be shift-f3, shift-f4, etc. (NOTE: I did this based on Cygwin, which emulates the Linux console. I would appreciate it if someone on Linux could verify.) term\cygwin.el: New. Load term/linux. term\lk201.el, term\news.el, term\vt100.el: Sync with FSF. Fix warnings. dialog-gtk.el: Fix warning. For 21.4: help.el, update-elc.el: Compile in proper order. Maybe for 21.4: keydefs.el: Add a defn for M-?, previously undefined, to access help -- in case the terminal is not set up right, or f1 gets redefined. README: Rewrite.
author ben
date Fri, 22 Jun 2001 01:50:04 +0000
parents e9a3f8b4de53
children b39c14581166
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 #ifdef emacs
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
25
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
26 #include <config.h>
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
27
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
28 #include <string.h>
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
29
551
e9a3f8b4de53 [xemacs-hg @ 2001-05-21 05:26:06 by martinb]
martinb
parents: 458
diff changeset
30 #undef realloc
e9a3f8b4de53 [xemacs-hg @ 2001-05-21 05:26:06 by martinb]
martinb
parents: 458
diff changeset
31 #undef malloc
e9a3f8b4de53 [xemacs-hg @ 2001-05-21 05:26:06 by martinb]
martinb
parents: 458
diff changeset
32 #undef free
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
33 #define realloc xrealloc
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
34 #define malloc xmalloc
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
35 #define free xfree
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 398
diff changeset
36 extern void *xmalloc (size_t size);
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 398
diff changeset
37 extern void *xrealloc (void *, size_t size);
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
38
551
e9a3f8b4de53 [xemacs-hg @ 2001-05-21 05:26:06 by martinb]
martinb
parents: 458
diff changeset
39 #else /* !emacs */
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
40
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
41 #include <stdlib.h>
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
42 #include <string.h>
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
43
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
44 #endif /* !emacs */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
45
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
46 /* Assuming STRING is the value of a termcap string entry
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
47 containing `%' constructs to expand parameters,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
48 merge in parameter values and store result in block OUTSTRING points to.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
49 LEN is the length of OUTSTRING. If more space is needed,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
50 a block is allocated with `malloc'.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
51
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
52 The value returned is the address of the resulting string.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
53 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
54 In the latter case, the caller must free the block.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
55
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
56 The fourth and following args to tparam serve as the parameter values. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
57
398
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents: 0
diff changeset
58 static char *tparam1 (const char *string, char *outstring, int len,
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents: 0
diff changeset
59 const char *up, const char *left,
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
60 int *argp);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
61
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
62 /* XEmacs: renamed this function because just tparam() conflicts with
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
63 ncurses */
398
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents: 0
diff changeset
64 char *emacs_tparam (const char *string, char *outstring, int len, int arg0,
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
65 int arg1, int arg2, int arg3);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
66 char *
398
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents: 0
diff changeset
67 emacs_tparam (const char *string, char *outstring, int len, int arg0,
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
68 int arg1, int arg2, int arg3)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
69 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
70 int arg[4];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
71 arg[0] = arg0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
72 arg[1] = arg1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
73 arg[2] = arg2;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
74 arg[3] = arg3;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
75 return tparam1 (string, outstring, len, 0, 0, arg);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
76 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
77
398
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents: 0
diff changeset
78 const char *BC;
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents: 0
diff changeset
79 const char *UP;
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
80
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
81 static char tgoto_buf[50];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
82
398
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents: 0
diff changeset
83 char *tgoto (const char *cm, int hpos, int vpos);
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
84 char *
398
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents: 0
diff changeset
85 tgoto (const char *cm, int hpos, int vpos)
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
86 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
87 int args[2];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
88 if (!cm)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
89 return 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
90 args[0] = vpos;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
91 args[1] = hpos;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
92 return tparam1 (cm, tgoto_buf, 50, UP, BC, args);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
93 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
94
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
95 static char *
398
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents: 0
diff changeset
96 tparam1 (const char *string, char *outstring, int len, const char *up,
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents: 0
diff changeset
97 const char *left, int *argp)
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
98 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
99 int c;
398
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents: 0
diff changeset
100 const char *p = string;
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
101 char *op = outstring;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
102 char *outend;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
103 int outlen = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
104
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
105 int tem;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
106 int *old_argp = argp;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
107 int doleft = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
108 int doup = 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 outend = outstring + len;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
111
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
112 while (1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
113 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
114 /* If the buffer might be too short, make it bigger. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
115 if (op + 5 >= outend)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
116 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
117 char *new;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
118 if (outlen == 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
119 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
120 outlen = len + 40;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
121 new = (char *) malloc (outlen);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
122 outend += 40;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
123 memcpy (new, outstring, op - outstring);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
124 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
125 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
126 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
127 outend += outlen;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
128 outlen *= 2;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
129 new = (char *) realloc (outstring, outlen);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
130 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
131 op += new - outstring;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
132 outend += new - outstring;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
133 outstring = new;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
134 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
135 c = *p++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
136 if (!c)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
137 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
138 if (c == '%')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
139 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
140 c = *p++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
141 tem = *argp;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
142 switch (c)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
143 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
144 case 'd': /* %d means output in decimal. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
145 if (tem < 10)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
146 goto onedigit;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
147 if (tem < 100)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
148 goto twodigit;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
149 case '3': /* %3 means output in decimal, 3 digits. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
150 if (tem > 999)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
151 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
152 *op++ = tem / 1000 + '0';
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
153 tem %= 1000;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
154 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
155 *op++ = tem / 100 + '0';
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
156 case '2': /* %2 means output in decimal, 2 digits. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
157 twodigit:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
158 tem %= 100;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
159 *op++ = tem / 10 + '0';
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
160 onedigit:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
161 *op++ = tem % 10 + '0';
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
162 argp++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
163 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
164
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
165 case 'C':
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
166 /* For c-100: print quotient of value by 96, if nonzero,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
167 then do like %+. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
168 if (tem >= 96)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
169 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
170 *op++ = tem / 96;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
171 tem %= 96;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
172 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
173 case '+': /* %+x means add character code of char x. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
174 tem += *p++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
175 case '.': /* %. means output as character. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
176 if (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 /* If want to forbid output of 0 and \n and \t,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
179 and this is one of them, increment it. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
180 while (tem == 0 || tem == '\n' || tem == '\t')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
181 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
182 tem++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
183 if (argp == old_argp)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
184 doup++, outend -= strlen (up);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
185 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
186 doleft++, outend -= strlen (left);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
187 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
188 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
189 *op++ = tem | 0200;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
190 case 'f': /* %f means discard next arg. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
191 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 'b': /* %b means back up one arg (and re-use it). */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
195 argp--;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
196 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
197
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
198 case 'r': /* %r means interchange following two args. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
199 argp[0] = argp[1];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
200 argp[1] = tem;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
201 old_argp++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
202 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
203
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
204 case '>': /* %>xy means if arg is > char code of x, */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
205 if (argp[0] > *p++) /* then add char code of y to the arg, */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
206 argp[0] += *p; /* and in any case don't output. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
207 p++; /* Leave the arg to be output later. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
208 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
209
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
210 case 'a': /* %a means arithmetic. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
211 /* Next character says what operation.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
212 Add or subtract either a constant or some other arg. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
213 /* First following character is + to add or - to subtract
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
214 or = to assign. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
215 /* Next following char is 'p' and an arg spec
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
216 (0100 plus position of that arg relative to this one)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
217 or 'c' and a constant stored in a character. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
218 tem = p[2] & 0177;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
219 if (p[1] == 'p')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
220 tem = argp[tem - 0100];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
221 if (p[0] == '-')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
222 argp[0] -= tem;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
223 else if (p[0] == '+')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
224 argp[0] += tem;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
225 else if (p[0] == '*')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
226 argp[0] *= tem;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
227 else if (p[0] == '/')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
228 argp[0] /= tem;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
229 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
230 argp[0] = tem;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
231
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
232 p += 3;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
233 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
234
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
235 case 'i': /* %i means add one to arg, */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
236 argp[0] ++; /* and leave it to be output later. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
237 argp[1] ++; /* Increment the following arg, too! */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
238 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
239
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
240 case '%': /* %% means output %; no arg. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
241 goto ordinary;
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 'n': /* %n means xor each of next two args with 140. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
244 argp[0] ^= 0140;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
245 argp[1] ^= 0140;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
246 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
247
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
248 case 'm': /* %m means xor each of next two args with 177. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
249 argp[0] ^= 0177;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
250 argp[1] ^= 0177;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
251 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
252
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
253 case 'B': /* %B means express arg as BCD char code. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
254 argp[0] += 6 * (tem / 10);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
255 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
256
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
257 case 'D': /* %D means weird Delta Data transformation. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
258 argp[0] -= 2 * (tem % 16);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
259 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
260 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
261 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
262 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
263 /* Ordinary character in the argument string. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
264 ordinary:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
265 *op++ = c;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
266 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
267 *op = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
268 while (doup-- > 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
269 strcat (op, up);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
270 while (doleft-- > 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
271 strcat (op, left);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
272 return outstring;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
273 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
274
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
275 #ifdef DEBUG
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
276
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
277 main (argc, argv)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
278 int argc;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
279 char **argv;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
280 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
281 char buf[50];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
282 int args[3];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
283 args[0] = atoi (argv[2]);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
284 args[1] = atoi (argv[3]);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
285 args[2] = atoi (argv[4]);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
286 tparam1 (argv[1], buf, "LEFT", "UP", args);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
287 printf ("%s\n", buf);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
288 return 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
289 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
290
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
291 #endif /* DEBUG */