1 /* copy-mode character interpretation */
6 static int cp_nblk
; /* input block depth (text in \{ and \}) */
7 static int cp_sblk
[NIES
]; /* skip \} escape at this depth, if set */
8 static int cp_widreq
= 1; /* inline \w requests */
10 static void cparg(char *d
)
17 } else if (!n_cp
&& c
== '[') {
19 while (i
< NMLEN
- 1 && c
>= 0 && c
!= ']') {
29 static int regid(void)
36 static void cp_num(void)
40 if (c
!= '-' && c
!= '+')
43 if (c
== '-' || c
== '+')
44 num_get(id
, c
== '+' ? 1 : -1);
46 in_push(num_str(id
), NULL
);
49 static void cp_str(void)
51 char *buf
= str_get(regid());
56 static void cp_numfmt(void)
58 in_push(num_getfmt(regid()), NULL
);
61 static void cp_arg(void)
67 argnum
= atoi(argname
);
68 if (argnum
> 0 && argnum
< NARGS
+ 1)
74 static void cp_width(void)
77 sprintf(wid
, "%d", ren_wid(cp_next
, cp_back
));
81 static int cp_raw(void)
109 if (c
== '{' && cp_nblk
< LEN(cp_sblk
))
110 cp_sblk
[cp_nblk
++] = 0;
111 if (c
== '}' && cp_nblk
> 0)
112 if (cp_sblk
[--cp_nblk
])
129 while (c
>= 0 && c
!= '\n')
131 } else if (c
== 'w' && cp_widreq
) {
134 } else if (c
== 'n') {
137 } else if (c
== '*') {
140 } else if (c
== 'g') {
143 } else if (c
== '$') {
154 void cp_blk(int skip
)
159 c
= skip
? cp_raw() : cp_next();
160 } while (c
== ' ' || c
== '\t');
162 while (c
>= 0 && (c
!= '\n' || cp_nblk
> nblk
))
165 if (c
== c_ec
&& in_top() == '{') { /* a troff \{ \} block */
174 void cp_wid(int enable
)