annotate src/tparam.c @ 5043:d0c14ea98592

various frame-geometry fixes -------------------- ChangeLog entries follow: -------------------- src/ChangeLog addition: 2010-02-15 Ben Wing <ben@xemacs.org> * EmacsFrame.c: * EmacsFrame.c (EmacsFrameResize): * console-msw-impl.h: * console-msw-impl.h (struct mswindows_frame): * console-msw-impl.h (FRAME_MSWINDOWS_TARGET_RECT): * device-tty.c: * device-tty.c (tty_asynch_device_change): * event-msw.c: * event-msw.c (mswindows_wnd_proc): * faces.c (Fface_list): * faces.h: * frame-gtk.c: * frame-gtk.c (gtk_set_initial_frame_size): * frame-gtk.c (gtk_set_frame_size): * frame-msw.c: * frame-msw.c (mswindows_init_frame_1): * frame-msw.c (mswindows_set_frame_size): * frame-msw.c (mswindows_size_frame_internal): * frame-msw.c (msprinter_init_frame_3): * frame.c: * frame.c (enum): * frame.c (Fmake_frame): * frame.c (adjust_frame_size): * frame.c (store_minibuf_frame_prop): * frame.c (Fframe_property): * frame.c (Fframe_properties): * frame.c (Fframe_displayable_pixel_height): * frame.c (Fframe_displayable_pixel_width): * frame.c (internal_set_frame_size): * frame.c (Fset_frame_height): * frame.c (Fset_frame_pixel_height): * frame.c (Fset_frame_displayable_pixel_height): * frame.c (Fset_frame_width): * frame.c (Fset_frame_pixel_width): * frame.c (Fset_frame_displayable_pixel_width): * frame.c (Fset_frame_size): * frame.c (Fset_frame_pixel_size): * frame.c (Fset_frame_displayable_pixel_size): * frame.c (frame_conversion_internal_1): * frame.c (get_frame_displayable_pixel_size): * frame.c (change_frame_size_1): * frame.c (change_frame_size): * frame.c (generate_title_string): * frame.h: * gtk-xemacs.c: * gtk-xemacs.c (gtk_xemacs_size_request): * gtk-xemacs.c (gtk_xemacs_size_allocate): * gtk-xemacs.c (gtk_xemacs_paint): * gutter.c: * gutter.c (update_gutter_geometry): * redisplay.c (end_hold_frame_size_changes): * redisplay.c (redisplay_frame): * toolbar.c: * toolbar.c (update_frame_toolbars_geometry): * window.c: * window.c (frame_pixsize_valid_p): * window.c (check_frame_size): Various fixes to frame geometry to make it a bit easier to understand and fix some bugs. 1. IMPORTANT: Some renamings. Will need to be applied carefully to the carbon repository, in the following order: -- pixel_to_char_size -> pixel_to_frame_unit_size -- char_to_pixel_size -> frame_unit_to_pixel_size -- pixel_to_real_char_size -> pixel_to_char_size -- char_to_real_pixel_size -> char_to_pixel_size -- Reverse second and third arguments of change_frame_size() and change_frame_size_1() to try to make functions consistent in putting width before height. -- Eliminate old round_size_to_char, because it didn't really do anything differently from round_size_to_real_char() -- round_size_to_real_char -> round_size_to_char; any places that called the old round_size_to_char should just call the new one. 2. IMPORTANT FOR CARBON: The set_frame_size() method is now passed sizes in "frame units", like all other frame-sizing functions, rather than some hacked-up combination of char-cell units and total pixel size. This only affects window systems that use "pixelated geometry", and I'm not sure if Carbon is one of them. MS Windows is pixelated, X and GTK are not. For pixelated-geometry systems, the size in set_frame_size() is in displayable pixels rather than total pixels and needs to be converted appropriately; take a look at the changes made to mswindows_set_frame_size() method if necessary. 3. Add a big long comment in frame.c describing how frame geometry works. 4. Remove MS Windows-specific character height and width fields, duplicative and unused. 5. frame-displayable-pixel-* and set-frame-displayable-pixel-* didn't use to work on MS Windows, but they do now. 6. In general, clean up the handling of "pixelated geometry" so that fewer functions have to worry about this. This is really an abomination that should be removed entirely but that will have to happen later. Fix some buggy code in frame_conversion_internal() that happened to "work" because it was countered by oppositely buggy code in change_frame_size(). 7. Clean up some frame-size code in toolbar.c and use functions already provided in frame.c instead of rolling its own. 8. Fix check_frame_size() in window.c, which formerly didn't take pixelated geometry into account.
author Ben Wing <ben@xemacs.org>
date Mon, 15 Feb 2010 22:14:11 -0600
parents facf3239ba30
children 308d34e9f07d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1 /* Merge parameters into a termcap entry string.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2 Copyright (C) 1985, 1987, 1992, 1993, 1994 Free Software Foundation, Inc.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4 This file is part of XEmacs.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6 XEmacs is free software; you can redistribute it and/or modify it
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7 under the terms of the GNU General Public License as published by the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8 Free Software Foundation; either version 2, or (at your option) any
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9 later version.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
10
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
11 XEmacs is distributed in the hope that it will be useful, but WITHOUT
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
14 for more details.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
15
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
16 You should have received a copy of the GNU General Public License
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
17 along with XEmacs; see the file COPYING. If not, write to
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
19 Boston, MA 02111-1307, USA. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
20
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
21 /* Synched up with: Not synched with FSF. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
22
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
23 /* config.h may rename various library functions such as malloc. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
24 #include <config.h>
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 551
diff changeset
25 #include "lisp.h"
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
26
551
e9a3f8b4de53 [xemacs-hg @ 2001-05-21 05:26:06 by martinb]
martinb
parents: 458
diff changeset
27 #undef realloc
e9a3f8b4de53 [xemacs-hg @ 2001-05-21 05:26:06 by martinb]
martinb
parents: 458
diff changeset
28 #undef malloc
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
29 #define realloc xrealloc
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
30 #define malloc xmalloc
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
31
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
32 /* Assuming STRING is the value of a termcap string entry
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
33 containing `%' constructs to expand parameters,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
34 merge in parameter values and store result in block OUTSTRING points to.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
35 LEN is the length of OUTSTRING. If more space is needed,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
36 a block is allocated with `malloc'.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
37
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
38 The value returned is the address of the resulting string.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
39 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
40 In the latter case, the caller must free the block.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
41
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
42 The fourth and following args to tparam serve as the parameter values. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
43
398
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents: 0
diff changeset
44 static char *tparam1 (const char *string, char *outstring, int len,
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents: 0
diff changeset
45 const char *up, const char *left,
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
46 int *argp);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
47
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
48 /* XEmacs: renamed this function because just tparam() conflicts with
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
49 ncurses */
398
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents: 0
diff changeset
50 char *emacs_tparam (const char *string, char *outstring, int len, int arg0,
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
51 int arg1, int arg2, int arg3);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
52 char *
398
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents: 0
diff changeset
53 emacs_tparam (const char *string, char *outstring, int len, int arg0,
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
54 int arg1, int arg2, int arg3)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
55 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
56 int arg[4];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
57 arg[0] = arg0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
58 arg[1] = arg1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
59 arg[2] = arg2;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
60 arg[3] = arg3;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
61 return tparam1 (string, outstring, len, 0, 0, arg);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
62 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
63
398
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents: 0
diff changeset
64 const char *BC;
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents: 0
diff changeset
65 const char *UP;
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
66
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
67 static char tgoto_buf[50];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
68
398
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents: 0
diff changeset
69 char *tgoto (const char *cm, int hpos, int vpos);
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
70 char *
398
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents: 0
diff changeset
71 tgoto (const char *cm, int hpos, int vpos)
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
72 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
73 int args[2];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
74 if (!cm)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
75 return 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
76 args[0] = vpos;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
77 args[1] = hpos;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
78 return tparam1 (cm, tgoto_buf, 50, UP, BC, args);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
79 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
80
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
81 static char *
398
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents: 0
diff changeset
82 tparam1 (const char *string, char *outstring, int len, const char *up,
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents: 0
diff changeset
83 const char *left, int *argp)
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
84 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
85 int c;
398
74fd4e045ea6 Import from CVS: tag r21-2-29
cvs
parents: 0
diff changeset
86 const char *p = string;
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
87 char *op = outstring;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
88 char *outend;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
89 int outlen = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
90
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
91 int tem;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
92 int *old_argp = argp;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
93 int doleft = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
94 int doup = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
95
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
96 outend = outstring + len;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
97
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
98 while (1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
99 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
100 /* If the buffer might be too short, make it bigger. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
101 if (op + 5 >= outend)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
102 {
3025
facf3239ba30 [xemacs-hg @ 2005-10-25 11:16:19 by ben]
ben
parents: 1726
diff changeset
103 char *new_;
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
104 if (outlen == 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
105 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
106 outlen = len + 40;
3025
facf3239ba30 [xemacs-hg @ 2005-10-25 11:16:19 by ben]
ben
parents: 1726
diff changeset
107 new_ = (char *) malloc (outlen);
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
108 outend += 40;
3025
facf3239ba30 [xemacs-hg @ 2005-10-25 11:16:19 by ben]
ben
parents: 1726
diff changeset
109 memcpy (new_, outstring, op - outstring);
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
110 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
111 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
112 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
113 outend += outlen;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
114 outlen *= 2;
3025
facf3239ba30 [xemacs-hg @ 2005-10-25 11:16:19 by ben]
ben
parents: 1726
diff changeset
115 new_ = (char *) realloc (outstring, outlen);
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
116 }
3025
facf3239ba30 [xemacs-hg @ 2005-10-25 11:16:19 by ben]
ben
parents: 1726
diff changeset
117 op += new_ - outstring;
facf3239ba30 [xemacs-hg @ 2005-10-25 11:16:19 by ben]
ben
parents: 1726
diff changeset
118 outend += new_ - outstring;
facf3239ba30 [xemacs-hg @ 2005-10-25 11:16:19 by ben]
ben
parents: 1726
diff changeset
119 outstring = new_;
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
120 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
121 c = *p++;
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 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
124 if (c == '%')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
125 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
126 c = *p++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
127 tem = *argp;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
128 switch (c)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
129 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
130 case 'd': /* %d means output in decimal. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
131 if (tem < 10)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
132 goto onedigit;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
133 if (tem < 100)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
134 goto twodigit;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
135 case '3': /* %3 means output in decimal, 3 digits. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
136 if (tem > 999)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
137 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
138 *op++ = tem / 1000 + '0';
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
139 tem %= 1000;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
140 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
141 *op++ = tem / 100 + '0';
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
142 case '2': /* %2 means output in decimal, 2 digits. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
143 twodigit:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
144 tem %= 100;
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 onedigit:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
147 *op++ = tem % 10 + '0';
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
148 argp++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
149 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
150
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
151 case 'C':
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
152 /* For c-100: print quotient of value by 96, if nonzero,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
153 then do like %+. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
154 if (tem >= 96)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
155 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
156 *op++ = tem / 96;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
157 tem %= 96;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
158 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
159 case '+': /* %+x means add character code of char x. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
160 tem += *p++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
161 case '.': /* %. means output as character. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
162 if (left)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
163 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
164 /* If want to forbid output of 0 and \n and \t,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
165 and this is one of them, increment it. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
166 while (tem == 0 || tem == '\n' || tem == '\t')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
167 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
168 tem++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
169 if (argp == old_argp)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
170 doup++, outend -= strlen (up);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
171 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
172 doleft++, outend -= strlen (left);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
173 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
174 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
175 *op++ = tem | 0200;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
176 case 'f': /* %f means discard next arg. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
177 argp++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
178 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
179
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
180 case 'b': /* %b means back up one arg (and re-use it). */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
181 argp--;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
182 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
183
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
184 case 'r': /* %r means interchange following two args. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
185 argp[0] = argp[1];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
186 argp[1] = tem;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
187 old_argp++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
188 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
189
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
190 case '>': /* %>xy means if arg is > char code of x, */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
191 if (argp[0] > *p++) /* then add char code of y to the arg, */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
192 argp[0] += *p; /* and in any case don't output. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
193 p++; /* Leave the arg to be output later. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
194 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
195
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
196 case 'a': /* %a means arithmetic. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
197 /* Next character says what operation.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
198 Add or subtract either a constant or some other arg. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
199 /* First following character is + to add or - to subtract
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
200 or = to assign. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
201 /* Next following char is 'p' and an arg spec
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
202 (0100 plus position of that arg relative to this one)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
203 or 'c' and a constant stored in a character. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
204 tem = p[2] & 0177;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
205 if (p[1] == 'p')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
206 tem = argp[tem - 0100];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
207 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 if (p[0] == '/')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
214 argp[0] /= tem;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
215 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
216 argp[0] = tem;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
217
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
218 p += 3;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
219 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
220
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
221 case 'i': /* %i means add one to arg, */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
222 argp[0] ++; /* and leave it to be output later. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
223 argp[1] ++; /* Increment the following arg, too! */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
224 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
225
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
226 case '%': /* %% means output %; no arg. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
227 goto ordinary;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
228
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
229 case 'n': /* %n means xor each of next two args with 140. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
230 argp[0] ^= 0140;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
231 argp[1] ^= 0140;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
232 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
233
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
234 case 'm': /* %m means xor each of next two args with 177. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
235 argp[0] ^= 0177;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
236 argp[1] ^= 0177;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
237 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
238
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
239 case 'B': /* %B means express arg as BCD char code. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
240 argp[0] += 6 * (tem / 10);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
241 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
242
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
243 case 'D': /* %D means weird Delta Data transformation. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
244 argp[0] -= 2 * (tem % 16);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
245 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
246 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
247 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
248 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
249 /* Ordinary character in the argument string. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
250 ordinary:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
251 *op++ = c;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
252 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
253 *op = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
254 while (doup-- > 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
255 strcat (op, up);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
256 while (doleft-- > 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
257 strcat (op, left);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
258 return outstring;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
259 }