annotate src/tparam.c @ 5602:c9e5612f5424

Support the MP library on recent FreeBSD, have it pass relevant tests. src/ChangeLog addition: 2011-11-26 Aidan Kehoe <kehoea@parhasard.net> * number-mp.c (bignum_to_string): Don't overwrite the accumulator we've just set up for this function. * number-mp.c (BIGNUM_TO_TYPE): mp_itom() doesn't necessarily do what this code used to think with negative numbers, it can treat them as unsigned ints. Subtract numbers from bignum_zero instead of multiplying them by -1 to convert them to their negative equivalents. * number-mp.c (bignum_to_int): * number-mp.c (bignum_to_uint): * number-mp.c (bignum_to_long): * number-mp.c (bignum_to_ulong): * number-mp.c (bignum_to_double): Use the changed BIGNUM_TO_TYPE() in these functions. * number-mp.c (bignum_ceil): * number-mp.c (bignum_floor): In these functions, be more careful about rounding to positive and negative infinity, respectively. Don't use the sign of QUOTIENT when working out out whether to add or subtract one, rather use the sign QUOTIENT would have if arbitrary-precision division were done. * number-mp.h: * number-mp.h (MP_GCD): Wrap #include <mp.h> in BEGIN_C_DECLS/END_C_DECLS. * number.c (Fbigfloat_get_precision): * number.c (Fbigfloat_set_precision): Don't attempt to call XBIGFLOAT_GET_PREC if this build doesn't support big floats.
author Aidan Kehoe <kehoea@parhasard.net>
date Sat, 26 Nov 2011 17:59:14 +0000
parents 308d34e9f07d
children
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
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 3025
diff changeset
6 XEmacs is free software: you can redistribute it and/or modify it
0
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
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 3025
diff changeset
8 Free Software Foundation, either version 3 of the License, or (at your
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 3025
diff changeset
9 option) any later version.
0
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
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 3025
diff changeset
17 along with XEmacs. If not, see <http://www.gnu.org/licenses/>. */
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
18
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
19 /* Synched up with: Not synched with FSF. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
20
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
21 /* config.h may rename various library functions such as malloc. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
22 #include <config.h>
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 551
diff changeset
23 #include "lisp.h"
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
24
551
e9a3f8b4de53 [xemacs-hg @ 2001-05-21 05:26:06 by martinb]
martinb
parents: 458
diff changeset
25 #undef realloc
e9a3f8b4de53 [xemacs-hg @ 2001-05-21 05:26:06 by martinb]
martinb
parents: 458
diff changeset
26 #undef malloc
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
27 #define realloc xrealloc
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
28 #define malloc xmalloc
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
29
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
30 /* Assuming STRING is the value of a termcap string entry
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
31 containing `%' constructs to expand parameters,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
32 merge in parameter values and store result in block OUTSTRING points to.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
33 LEN is the length of OUTSTRING. If more space is needed,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
34 a block is allocated with `malloc'.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
35
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
36 The value returned is the address of the resulting string.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
37 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
38 In the latter case, the caller must free the block.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
39
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
40 The fourth and following args to tparam serve as the parameter values. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
41
398
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents: 0
diff changeset
42 static char *tparam1 (const char *string, char *outstring, int len,
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents: 0
diff changeset
43 const char *up, const char *left,
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
44 int *argp);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
45
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
46 /* XEmacs: renamed this function because just tparam() conflicts with
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
47 ncurses */
398
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents: 0
diff changeset
48 char *emacs_tparam (const char *string, char *outstring, int len, int arg0,
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
49 int arg1, int arg2, int arg3);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
50 char *
398
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents: 0
diff changeset
51 emacs_tparam (const char *string, char *outstring, int len, int arg0,
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
52 int arg1, int arg2, int arg3)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
53 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
54 int arg[4];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
55 arg[0] = arg0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
56 arg[1] = arg1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
57 arg[2] = arg2;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
58 arg[3] = arg3;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
59 return tparam1 (string, outstring, len, 0, 0, arg);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
60 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
61
398
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents: 0
diff changeset
62 const char *BC;
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents: 0
diff changeset
63 const char *UP;
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
64
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
65 static char tgoto_buf[50];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
66
398
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents: 0
diff changeset
67 char *tgoto (const char *cm, int hpos, int vpos);
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
68 char *
398
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents: 0
diff changeset
69 tgoto (const char *cm, int hpos, int vpos)
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 int args[2];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
72 if (!cm)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
73 return 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
74 args[0] = vpos;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
75 args[1] = hpos;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
76 return tparam1 (cm, tgoto_buf, 50, UP, BC, args);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
77 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
78
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
79 static char *
398
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents: 0
diff changeset
80 tparam1 (const char *string, char *outstring, int len, const char *up,
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents: 0
diff changeset
81 const char *left, int *argp)
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
82 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
83 int c;
398
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents: 0
diff changeset
84 const char *p = string;
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
85 char *op = outstring;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
86 char *outend;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
87 int outlen = 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 tem;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
90 int *old_argp = argp;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
91 int doleft = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
92 int doup = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
93
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
94 outend = outstring + len;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
95
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
96 while (1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
97 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
98 /* If the buffer might be too short, make it bigger. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
99 if (op + 5 >= outend)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
100 {
3025
facf3239ba30 [xemacs-hg @ 2005-10-25 11:16:19 by ben]
ben
parents: 1726
diff changeset
101 char *new_;
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
102 if (outlen == 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
103 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
104 outlen = len + 40;
3025
facf3239ba30 [xemacs-hg @ 2005-10-25 11:16:19 by ben]
ben
parents: 1726
diff changeset
105 new_ = (char *) malloc (outlen);
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
106 outend += 40;
3025
facf3239ba30 [xemacs-hg @ 2005-10-25 11:16:19 by ben]
ben
parents: 1726
diff changeset
107 memcpy (new_, outstring, op - outstring);
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
108 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
109 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
110 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
111 outend += outlen;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
112 outlen *= 2;
3025
facf3239ba30 [xemacs-hg @ 2005-10-25 11:16:19 by ben]
ben
parents: 1726
diff changeset
113 new_ = (char *) realloc (outstring, outlen);
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
114 }
3025
facf3239ba30 [xemacs-hg @ 2005-10-25 11:16:19 by ben]
ben
parents: 1726
diff changeset
115 op += new_ - outstring;
facf3239ba30 [xemacs-hg @ 2005-10-25 11:16:19 by ben]
ben
parents: 1726
diff changeset
116 outend += new_ - outstring;
facf3239ba30 [xemacs-hg @ 2005-10-25 11:16:19 by ben]
ben
parents: 1726
diff changeset
117 outstring = new_;
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
118 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
119 c = *p++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
120 if (!c)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
121 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
122 if (c == '%')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
123 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
124 c = *p++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
125 tem = *argp;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
126 switch (c)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
127 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
128 case 'd': /* %d means output in decimal. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
129 if (tem < 10)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
130 goto onedigit;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
131 if (tem < 100)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
132 goto twodigit;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
133 case '3': /* %3 means output in decimal, 3 digits. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
134 if (tem > 999)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
135 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
136 *op++ = tem / 1000 + '0';
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
137 tem %= 1000;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
138 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
139 *op++ = tem / 100 + '0';
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
140 case '2': /* %2 means output in decimal, 2 digits. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
141 twodigit:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
142 tem %= 100;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
143 *op++ = tem / 10 + '0';
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
144 onedigit:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
145 *op++ = tem % 10 + '0';
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
146 argp++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
147 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
148
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
149 case 'C':
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
150 /* For c-100: print quotient of value by 96, if nonzero,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
151 then do like %+. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
152 if (tem >= 96)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
153 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
154 *op++ = tem / 96;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
155 tem %= 96;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
156 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
157 case '+': /* %+x means add character code of char x. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
158 tem += *p++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
159 case '.': /* %. means output as character. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
160 if (left)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
161 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
162 /* If want to forbid output of 0 and \n and \t,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
163 and this is one of them, increment it. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
164 while (tem == 0 || tem == '\n' || tem == '\t')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
165 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
166 tem++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
167 if (argp == old_argp)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
168 doup++, outend -= strlen (up);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
169 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
170 doleft++, outend -= strlen (left);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
171 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
172 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
173 *op++ = tem | 0200;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
174 case 'f': /* %f means discard next arg. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
175 argp++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
176 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
177
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
178 case 'b': /* %b means back up one arg (and re-use it). */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
179 argp--;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
180 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
181
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
182 case 'r': /* %r means interchange following two args. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
183 argp[0] = argp[1];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
184 argp[1] = tem;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
185 old_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 '>': /* %>xy means if arg is > char code of x, */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
189 if (argp[0] > *p++) /* then add char code of y to the arg, */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
190 argp[0] += *p; /* and in any case don't output. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
191 p++; /* Leave the arg to be output later. */
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 'a': /* %a means arithmetic. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
195 /* Next character says what operation.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
196 Add or subtract either a constant or some other arg. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
197 /* First following character is + to add or - to subtract
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
198 or = to assign. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
199 /* Next following char is 'p' and an arg spec
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
200 (0100 plus position of that arg relative to this one)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
201 or 'c' and a constant stored in a character. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
202 tem = p[2] & 0177;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
203 if (p[1] == 'p')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
204 tem = argp[tem - 0100];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
205 if (p[0] == '-')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
206 argp[0] -= tem;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
207 else if (p[0] == '+')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
208 argp[0] += tem;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
209 else if (p[0] == '*')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
210 argp[0] *= tem;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
211 else 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
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
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
216 p += 3;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
217 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
218
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
219 case 'i': /* %i means add one to arg, */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
220 argp[0] ++; /* and leave it to be output later. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
221 argp[1] ++; /* Increment the following arg, too! */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
222 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
223
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
224 case '%': /* %% means output %; no arg. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
225 goto ordinary;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
226
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
227 case 'n': /* %n means xor each of next two args with 140. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
228 argp[0] ^= 0140;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
229 argp[1] ^= 0140;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
230 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
231
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
232 case 'm': /* %m means xor each of next two args with 177. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
233 argp[0] ^= 0177;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
234 argp[1] ^= 0177;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
235 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
236
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
237 case 'B': /* %B means express arg as BCD char code. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
238 argp[0] += 6 * (tem / 10);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
239 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
240
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
241 case 'D': /* %D means weird Delta Data transformation. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
242 argp[0] -= 2 * (tem % 16);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
243 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
244 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
245 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
246 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
247 /* Ordinary character in the argument string. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
248 ordinary:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
249 *op++ = c;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
250 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
251 *op = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
252 while (doup-- > 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
253 strcat (op, up);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
254 while (doleft-- > 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
255 strcat (op, left);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
256 return outstring;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
257 }