annotate tparam.c @ 4824:eaf67474339b

(Fminibuffer_complete_word): GCPRO1 `completion' during calls to Ftry_completion. (read_minibuf): Rewrite change of Sep 14. Save the return value on the history list provided in the form that the value is returned, iff the value is not equal to the front of the history list. (Fread_no_blanks_input): Change DEFUN to allow 2nd arg to be optional. The code was already written correctly.
author Brian Fox <bfox@gnu.org>
date Tue, 05 Oct 1993 01:46:45 +0000
parents f0abfb1b59fd
children 8fc56d171ada
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.
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
2 Copyright (C) 1985, 1987, 1993 Free Software Foundation, Inc.
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
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
16 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
17
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
18 /* Emacs config.h may rename various library functions such as malloc. */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
19 #ifdef HAVE_CONFIG_H
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
20 #include <config.h>
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
21 #else /* not HAVE_CONFIG_H */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
22
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
23 #if defined(HAVE_STRING_H) || defined(STDC_HEADERS)
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
24 #define bcopy(s, d, n) memcpy ((d), (s), (n))
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
25 #endif
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
26
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
27 #ifdef STDC_HEADERS
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
28 #include <stdlib.h>
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
29 #include <string.h>
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
30 #else
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
31 char *malloc ();
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
32 char *realloc ();
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
33 #endif
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
34
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
35 #endif /* not HAVE_CONFIG_H */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
36
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
37 #ifndef NULL
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
38 #define NULL (char *) 0
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
39 #endif
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
40
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
41 #ifndef emacs
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
42 static void
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
43 memory_out ()
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
44 {
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
45 write (2, "virtual memory exhausted\n", 25);
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
46 exit (1);
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
47 }
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
48
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
49 static char *
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
50 xmalloc (size)
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
51 unsigned size;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
52 {
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
53 register char *tem = malloc (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 if (!tem)
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
56 memory_out ();
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
57 return tem;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
58 }
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
59
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
60 static char *
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
61 xrealloc (ptr, size)
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
62 char *ptr;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
63 unsigned size;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
64 {
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
65 register char *tem = realloc (ptr, 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 if (!tem)
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
68 memory_out ();
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
69 return tem;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
70 }
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
71 #endif /* not emacs */
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 /* Assuming STRING is the value of a termcap string entry
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
74 containing `%' constructs to expand parameters,
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
75 merge in parameter values and store result in block OUTSTRING points to.
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
76 LEN is the length of OUTSTRING. If more space is needed,
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
77 a block is allocated with `malloc'.
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
78
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
79 The value returned is the address of the resulting string.
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
80 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
81 In the latter case, the caller must free the block.
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
82
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
83 The fourth and following args to tparam serve as the parameter values. */
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 static char *tparam1 ();
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 /* VARARGS 2 */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
88 char *
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
89 tparam (string, outstring, len, arg0, arg1, arg2, arg3)
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
90 char *string;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
91 char *outstring;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
92 int len;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
93 int arg0, arg1, arg2, arg3;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
94 {
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
95 #ifdef NO_ARG_ARRAY
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
96 int arg[4];
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
97 arg[0] = arg0;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
98 arg[1] = arg1;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
99 arg[2] = arg2;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
100 arg[3] = arg3;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
101 return tparam1 (string, outstring, len, NULL, NULL, arg);
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
102 #else
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
103 return tparam1 (string, outstring, len, NULL, NULL, &arg0);
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
104 #endif
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
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
107 char *BC;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
108 char *UP;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
109
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
110 static char tgoto_buf[50];
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
111
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
112 char *
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
113 tgoto (cm, hpos, vpos)
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
114 char *cm;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
115 int hpos, vpos;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
116 {
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
117 int args[2];
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
118 if (!cm)
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
119 return NULL;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
120 args[0] = vpos;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
121 args[1] = hpos;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
122 return tparam1 (cm, tgoto_buf, 50, UP, BC, args);
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
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
125 static char *
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
126 tparam1 (string, outstring, len, up, left, argp)
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
127 char *string;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
128 char *outstring;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
129 int len;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
130 char *up, *left;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
131 register int *argp;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
132 {
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
133 register int c;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
134 register char *p = string;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
135 register char *op = outstring;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
136 char *outend;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
137 int outlen = 0;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
138
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
139 register int tem;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
140 int *old_argp = argp;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
141 int doleft = 0;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
142 int doup = 0;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
143
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
144 outend = outstring + len;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
145
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
146 while (1)
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
147 {
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
148 /* If the buffer might be too short, make it bigger. */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
149 if (op + 5 >= outend)
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
150 {
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
151 register char *new;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
152 if (outlen == 0)
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
153 {
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
154 outlen = len + 40;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
155 new = (char *) xmalloc (outlen);
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
156 outend += 40;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
157 bcopy (outstring, new, op - outstring);
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
158 }
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
159 else
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
160 {
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
161 outend += outlen;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
162 outlen *= 2;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
163 new = (char *) xrealloc (outstring, outlen);
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
164 }
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
165 op += new - outstring;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
166 outend += new - outstring;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
167 outstring = new;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
168 }
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
169 c = *p++;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
170 if (!c)
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
171 break;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
172 if (c == '%')
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
173 {
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
174 c = *p++;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
175 tem = *argp;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
176 switch (c)
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
177 {
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
178 case 'd': /* %d means output in decimal. */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
179 if (tem < 10)
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
180 goto onedigit;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
181 if (tem < 100)
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
182 goto twodigit;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
183 case '3': /* %3 means output in decimal, 3 digits. */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
184 if (tem > 999)
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
185 {
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
186 *op++ = tem / 1000 + '0';
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
187 tem %= 1000;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
188 }
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
189 *op++ = tem / 100 + '0';
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
190 case '2': /* %2 means output in decimal, 2 digits. */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
191 twodigit:
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
192 tem %= 100;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
193 *op++ = tem / 10 + '0';
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
194 onedigit:
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
195 *op++ = tem % 10 + '0';
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
196 argp++;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
197 break;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
198
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
199 case 'C':
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
200 /* For c-100: print quotient of value by 96, if nonzero,
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
201 then do like %+. */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
202 if (tem >= 96)
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
203 {
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
204 *op++ = tem / 96;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
205 tem %= 96;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
206 }
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
207 case '+': /* %+x means add character code of char x. */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
208 tem += *p++;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
209 case '.': /* %. means output as character. */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
210 if (left)
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
211 {
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
212 /* If want to forbid output of 0 and \n and \t,
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
213 and this is one of them, increment it. */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
214 while (tem == 0 || tem == '\n' || tem == '\t')
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
215 {
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
216 tem++;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
217 if (argp == old_argp)
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
218 doup++, outend -= strlen (up);
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
219 else
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
220 doleft++, outend -= strlen (left);
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 }
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
223 *op++ = tem ? tem : 0200;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
224 case 'f': /* %f means discard next arg. */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
225 argp++;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
226 break;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
227
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
228 case 'b': /* %b means back up one arg (and re-use it). */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
229 argp--;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
230 break;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
231
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
232 case 'r': /* %r means interchange following two args. */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
233 argp[0] = argp[1];
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
234 argp[1] = tem;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
235 old_argp++;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
236 break;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
237
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
238 case '>': /* %>xy means if arg is > char code of x, */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
239 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
240 argp[0] += *p; /* and in any case don't output. */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
241 p++; /* Leave the arg to be output later. */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
242 break;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
243
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
244 case 'a': /* %a means arithmetic. */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
245 /* Next character says what operation.
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
246 Add or subtract either a constant or some other arg. */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
247 /* First following character is + to add or - to subtract
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
248 or = to assign. */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
249 /* Next following char is 'p' and an arg spec
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
250 (0100 plus position of that arg relative to this one)
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
251 or 'c' and a constant stored in a character. */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
252 tem = p[2] & 0177;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
253 if (p[1] == 'p')
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
254 tem = argp[tem - 0100];
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
255 if (p[0] == '-')
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
256 argp[0] -= tem;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
257 else if (p[0] == '+')
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
258 argp[0] += tem;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
259 else if (p[0] == '*')
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
260 argp[0] *= tem;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
261 else if (p[0] == '/')
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
262 argp[0] /= tem;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
263 else
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
264 argp[0] = tem;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
265
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
266 p += 3;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
267 break;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
268
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
269 case 'i': /* %i means add one to arg, */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
270 argp[0] ++; /* and leave it to be output later. */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
271 argp[1] ++; /* Increment the following arg, too! */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
272 break;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
273
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
274 case '%': /* %% means output %; no arg. */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
275 goto ordinary;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
276
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
277 case 'n': /* %n means xor each of next two args with 140. */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
278 argp[0] ^= 0140;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
279 argp[1] ^= 0140;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
280 break;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
281
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
282 case 'm': /* %m means xor each of next two args with 177. */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
283 argp[0] ^= 0177;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
284 argp[1] ^= 0177;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
285 break;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
286
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
287 case 'B': /* %B means express arg as BCD char code. */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
288 argp[0] += 6 * (tem / 10);
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
289 break;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
290
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
291 case 'D': /* %D means weird Delta Data transformation. */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
292 argp[0] -= 2 * (tem % 16);
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
293 break;
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 }
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
296 else
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
297 /* Ordinary character in the argument string. */
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
298 ordinary:
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
299 *op++ = c;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
300 }
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
301 *op = 0;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
302 while (doup-- > 0)
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
303 strcat (op, up);
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
304 while (doleft-- > 0)
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
305 strcat (op, left);
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
306 return outstring;
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
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
309 #ifdef DEBUG
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
310
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
311 main (argc, argv)
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
312 int argc;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
313 char **argv;
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
314 {
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
315 char buf[50];
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
316 int args[3];
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
317 args[0] = atoi (argv[2]);
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
318 args[1] = atoi (argv[3]);
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
319 args[2] = atoi (argv[4]);
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
320 tparam1 (argv[1], buf, "LEFT", "UP", args);
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
321 printf ("%s\n", buf);
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
322 return 0;
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
f0abfb1b59fd entered into RCS
Roland McGrath <roland@gnu.org>
parents:
diff changeset
325 #endif /* DEBUG */