annotate src/tparam.c @ 16886:c686d4f3728a

Change all uses of win95, winnt, and win32 into Windows 95, Windows NT, and W32, respectively. Expand "win" substring in variables referring to Microsoft Windows constructs into "windows". Canonicalize header comments to use same terminology.
author Geoff Voelker <voelker@cs.washington.edu>
date Mon, 20 Jan 1997 00:43:16 +0000
parents 6e7bb4bd5010
children cdc89dbad540
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4687
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
1 /* Merge parameters into a termcap entry string.
12678
8fc56d171ada (tparam): Remove arg array and the #ifdef.
David J. MacKenzie <djm@gnu.org>
parents: 4687
diff changeset
2 Copyright (C) 1985, 87, 93, 95 Free Software Foundation, Inc.
4687
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
3
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
4 This program is free software; you can redistribute it and/or modify
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
5 it under the terms of the GNU General Public License as published by
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
6 the Free Software Foundation; either version 2, or (at your option)
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
7 any later version.
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
8
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
9 This program is distributed in the hope that it will be useful,
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
12 GNU General Public License for more details.
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
13
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
14 You should have received a copy of the GNU General Public License
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
15 along with this program; see the file COPYING. If not, write to
14414
6e7bb4bd5010 Update FSF address in comment.
Karl Heuer <kwzh@gnu.org>
parents: 12994
diff changeset
16 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
6e7bb4bd5010 Update FSF address in comment.
Karl Heuer <kwzh@gnu.org>
parents: 12994
diff changeset
17 Boston, MA 02111-1307, USA. */
4687
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
18
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
19 /* Emacs config.h may rename various library functions such as malloc. */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
20 #ifdef HAVE_CONFIG_H
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
21 #include <config.h>
12994
bd38619285f7 Don't assume that HAVE_CONFIG_H implies emacs.
David J. MacKenzie <djm@gnu.org>
parents: 12678
diff changeset
22 #endif
4687
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
23
12994
bd38619285f7 Don't assume that HAVE_CONFIG_H implies emacs.
David J. MacKenzie <djm@gnu.org>
parents: 12678
diff changeset
24 #ifndef emacs
4687
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
25 #if defined(HAVE_STRING_H) || defined(STDC_HEADERS)
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
26 #define bcopy(s, d, n) memcpy ((d), (s), (n))
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
27 #endif
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
28
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
29 #ifdef STDC_HEADERS
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
30 #include <stdlib.h>
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
31 #include <string.h>
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
32 #else
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
33 char *malloc ();
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
34 char *realloc ();
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
35 #endif
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
36
12994
bd38619285f7 Don't assume that HAVE_CONFIG_H implies emacs.
David J. MacKenzie <djm@gnu.org>
parents: 12678
diff changeset
37 #endif /* not emacs */
4687
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
38
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
39 #ifndef NULL
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
40 #define NULL (char *) 0
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
41 #endif
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
42
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
43 #ifndef emacs
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
44 static void
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
45 memory_out ()
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
46 {
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
47 write (2, "virtual memory exhausted\n", 25);
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
48 exit (1);
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
49 }
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
50
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
51 static char *
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
52 xmalloc (size)
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
53 unsigned size;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
54 {
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
55 register char *tem = malloc (size);
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
56
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
57 if (!tem)
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
58 memory_out ();
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
59 return tem;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
60 }
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
61
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
62 static char *
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
63 xrealloc (ptr, size)
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
64 char *ptr;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
65 unsigned size;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
66 {
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
67 register char *tem = realloc (ptr, size);
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
68
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
69 if (!tem)
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
70 memory_out ();
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
71 return tem;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
72 }
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
73 #endif /* not emacs */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
74
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
75 /* Assuming STRING is the value of a termcap string entry
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
76 containing `%' constructs to expand parameters,
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
77 merge in parameter values and store result in block OUTSTRING points to.
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
78 LEN is the length of OUTSTRING. If more space is needed,
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
79 a block is allocated with `malloc'.
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
80
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
81 The value returned is the address of the resulting string.
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
82 This may be OUTSTRING or may be the address of a block got with `malloc'.
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
83 In the latter case, the caller must free the block.
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
84
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
85 The fourth and following args to tparam serve as the parameter values. */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
86
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
87 static char *tparam1 ();
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
88
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
89 /* VARARGS 2 */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
90 char *
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
91 tparam (string, outstring, len, arg0, arg1, arg2, arg3)
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
92 char *string;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
93 char *outstring;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
94 int len;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
95 int arg0, arg1, arg2, arg3;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
96 {
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
97 int arg[4];
12678
8fc56d171ada (tparam): Remove arg array and the #ifdef.
David J. MacKenzie <djm@gnu.org>
parents: 4687
diff changeset
98
4687
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
99 arg[0] = arg0;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
100 arg[1] = arg1;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
101 arg[2] = arg2;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
102 arg[3] = arg3;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
103 return tparam1 (string, outstring, len, NULL, NULL, arg);
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
104 }
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
105
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
106 char *BC;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
107 char *UP;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
108
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
109 static char tgoto_buf[50];
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
110
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
111 char *
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
112 tgoto (cm, hpos, vpos)
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
113 char *cm;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
114 int hpos, vpos;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
115 {
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
116 int args[2];
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
117 if (!cm)
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
118 return NULL;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
119 args[0] = vpos;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
120 args[1] = hpos;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
121 return tparam1 (cm, tgoto_buf, 50, UP, BC, args);
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
122 }
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
123
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
124 static char *
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
125 tparam1 (string, outstring, len, up, left, argp)
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
126 char *string;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
127 char *outstring;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
128 int len;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
129 char *up, *left;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
130 register int *argp;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
131 {
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
132 register int c;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
133 register char *p = string;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
134 register char *op = outstring;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
135 char *outend;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
136 int outlen = 0;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
137
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
138 register int tem;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
139 int *old_argp = argp;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
140 int doleft = 0;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
141 int doup = 0;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
142
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
143 outend = outstring + len;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
144
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
145 while (1)
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
146 {
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
147 /* If the buffer might be too short, make it bigger. */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
148 if (op + 5 >= outend)
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
149 {
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
150 register char *new;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
151 if (outlen == 0)
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
152 {
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
153 outlen = len + 40;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
154 new = (char *) xmalloc (outlen);
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
155 outend += 40;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
156 bcopy (outstring, new, op - outstring);
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
157 }
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
158 else
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
159 {
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
160 outend += outlen;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
161 outlen *= 2;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
162 new = (char *) xrealloc (outstring, outlen);
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
163 }
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
164 op += new - outstring;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
165 outend += new - outstring;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
166 outstring = new;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
167 }
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
168 c = *p++;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
169 if (!c)
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
170 break;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
171 if (c == '%')
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
172 {
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
173 c = *p++;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
174 tem = *argp;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
175 switch (c)
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
176 {
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
177 case 'd': /* %d means output in decimal. */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
178 if (tem < 10)
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
179 goto onedigit;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
180 if (tem < 100)
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
181 goto twodigit;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
182 case '3': /* %3 means output in decimal, 3 digits. */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
183 if (tem > 999)
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
184 {
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
185 *op++ = tem / 1000 + '0';
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
186 tem %= 1000;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
187 }
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
188 *op++ = tem / 100 + '0';
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
189 case '2': /* %2 means output in decimal, 2 digits. */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
190 twodigit:
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
191 tem %= 100;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
192 *op++ = tem / 10 + '0';
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
193 onedigit:
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
194 *op++ = tem % 10 + '0';
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
195 argp++;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
196 break;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
197
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
198 case 'C':
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
199 /* For c-100: print quotient of value by 96, if nonzero,
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
200 then do like %+. */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
201 if (tem >= 96)
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
202 {
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
203 *op++ = tem / 96;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
204 tem %= 96;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
205 }
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
206 case '+': /* %+x means add character code of char x. */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
207 tem += *p++;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
208 case '.': /* %. means output as character. */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
209 if (left)
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
210 {
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
211 /* If want to forbid output of 0 and \n and \t,
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
212 and this is one of them, increment it. */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
213 while (tem == 0 || tem == '\n' || tem == '\t')
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
214 {
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
215 tem++;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
216 if (argp == old_argp)
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
217 doup++, outend -= strlen (up);
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
218 else
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
219 doleft++, outend -= strlen (left);
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
220 }
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
221 }
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
222 *op++ = tem ? tem : 0200;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
223 case 'f': /* %f means discard next arg. */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
224 argp++;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
225 break;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
226
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
227 case 'b': /* %b means back up one arg (and re-use it). */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
228 argp--;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
229 break;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
230
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
231 case 'r': /* %r means interchange following two args. */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
232 argp[0] = argp[1];
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
233 argp[1] = tem;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
234 old_argp++;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
235 break;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
236
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
237 case '>': /* %>xy means if arg is > char code of x, */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
238 if (argp[0] > *p++) /* then add char code of y to the arg, */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
239 argp[0] += *p; /* and in any case don't output. */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
240 p++; /* Leave the arg to be output later. */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
241 break;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
242
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
243 case 'a': /* %a means arithmetic. */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
244 /* Next character says what operation.
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
245 Add or subtract either a constant or some other arg. */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
246 /* First following character is + to add or - to subtract
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
247 or = to assign. */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
248 /* Next following char is 'p' and an arg spec
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
249 (0100 plus position of that arg relative to this one)
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
250 or 'c' and a constant stored in a character. */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
251 tem = p[2] & 0177;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
252 if (p[1] == 'p')
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
253 tem = argp[tem - 0100];
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
254 if (p[0] == '-')
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
255 argp[0] -= tem;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
256 else if (p[0] == '+')
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
257 argp[0] += tem;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
258 else if (p[0] == '*')
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
259 argp[0] *= tem;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
260 else if (p[0] == '/')
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
261 argp[0] /= tem;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
262 else
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
263 argp[0] = tem;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
264
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
265 p += 3;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
266 break;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
267
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
268 case 'i': /* %i means add one to arg, */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
269 argp[0] ++; /* and leave it to be output later. */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
270 argp[1] ++; /* Increment the following arg, too! */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
271 break;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
272
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
273 case '%': /* %% means output %; no arg. */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
274 goto ordinary;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
275
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
276 case 'n': /* %n means xor each of next two args with 140. */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
277 argp[0] ^= 0140;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
278 argp[1] ^= 0140;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
279 break;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
280
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
281 case 'm': /* %m means xor each of next two args with 177. */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
282 argp[0] ^= 0177;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
283 argp[1] ^= 0177;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
284 break;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
285
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
286 case 'B': /* %B means express arg as BCD char code. */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
287 argp[0] += 6 * (tem / 10);
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
288 break;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
289
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
290 case 'D': /* %D means weird Delta Data transformation. */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
291 argp[0] -= 2 * (tem % 16);
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
292 break;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
293 }
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
294 }
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
295 else
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
296 /* Ordinary character in the argument string. */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
297 ordinary:
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
298 *op++ = c;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
299 }
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
300 *op = 0;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
301 while (doup-- > 0)
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
302 strcat (op, up);
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
303 while (doleft-- > 0)
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
304 strcat (op, left);
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
305 return outstring;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
306 }
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
307
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
308 #ifdef DEBUG
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
309
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
310 main (argc, argv)
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
311 int argc;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
312 char **argv;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
313 {
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
314 char buf[50];
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
315 int args[3];
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
316 args[0] = atoi (argv[2]);
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
317 args[1] = atoi (argv[3]);
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
318 args[2] = atoi (argv[4]);
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
319 tparam1 (argv[1], buf, "LEFT", "UP", args);
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
320 printf ("%s\n", buf);
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
321 return 0;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
322 }
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
323
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
324 #endif /* DEBUG */