annotate src/tparam.c @ 981:0205cafe98ff

[xemacs-hg @ 2002-08-30 08:25:48 by youngs] Don't look now, but 21.5.9 is on its way out the door! Don't forget what good 'ol Ma used to say... "Eat your brussels sprouts, little Johnny, so you can grow up big and strong."
author youngs
date Fri, 30 Aug 2002 08:26:22 +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 }