~ubuntu-branches/ubuntu/oneiric/9base/oneiric

« back to all changes in this revision

Viewing changes to troff/n6.c

  • Committer: Bazaar Package Importer
  • Author(s): Daniel Baumann
  • Date: 2009-11-07 12:25:14 UTC
  • mfrom: (6.2.3 squeeze)
  • Revision ID: james.westby@ubuntu.com-20091107122514-tcw4u4ha2w2xbbnn
Tags: 1:4-1
* Adding maintainer homepage field to control.
* Marking maintainer homepage field to be also included in binary
  packages and changelog.
* Adding README.source.
* Merging upstream version 4.
* Adding sh4 to explicit architecture list (Closes: #545772).
* Moving maintainer homepage field from control to copyright.
* Updating README.source.
* Updating homepage field in control.
* Removing manpage patch, went upstream.
* Removing kfreebsd.patch, went upstream.
* Generalizing manpage moving in rules.
* Moving base directory from /usr/lib/9base to /usr/lib/plan9 for
  consistency reasons.
* Prefixing manpages with plan9 instead of 9base for consistency
  reasons.
* Bumping versioned build-depends on debhelper.
* Making internal mkMAP and sendcover scripts executable.
* Adding patch to adjust shebang in newly included troff commands.
* Updating lintian-overrides.
* Making buildd-depends on quilt versioned.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#include "tdef.h"
 
2
#include "ext.h"
 
3
#include "fns.h"
 
4
#include <ctype.h>
 
5
 
 
6
/*
 
7
 * n6.c -- width functions, sizes and fonts
 
8
*/
 
9
 
 
10
int
 
11
n_width(Tchar j)
 
12
{
 
13
        int i, k;
 
14
 
 
15
        if (iszbit(j))
 
16
                return 0;
 
17
        if (ismot(j)) {
 
18
                if (isvmot(j))
 
19
                        return(0);
 
20
                k = absmot(j);
 
21
                if (isnmot(j))
 
22
                        k = -k;
 
23
                return(k);
 
24
        }
 
25
        i = cbits(j);
 
26
        if (i < ' ') {
 
27
                if (i == '\b')
 
28
                        return(-widthp);
 
29
                if (i == PRESC)
 
30
                        i = eschar;
 
31
                else if (i == HX)
 
32
                        return(0);
 
33
        }
 
34
        if (i == ohc)
 
35
                return(0);
 
36
        i = trtab[i];
 
37
        if (i < ' ')
 
38
                return(0);
 
39
        if (i >= t.tfont.nchars)        /* not on the font */
 
40
                k = t.Char;             /* really ought to check properly */
 
41
        else
 
42
                k = t.tfont.wp[i].wid * t.Char;
 
43
        widthp = k;
 
44
        return(k);
 
45
}
 
46
 
 
47
 
 
48
Tchar n_setch(int c)
 
49
{
 
50
        return t_setch(c);
 
51
}
 
52
 
 
53
Tchar n_setabs(void)    /* set absolute char from \N'...' */
 
54
{                       /* for now, a no-op */
 
55
        return t_setabs();
 
56
}
 
57
 
 
58
int n_findft(int i)
 
59
{
 
60
        int k;
 
61
 
 
62
        if ((k = i - '0') >= 0 && k <= nfonts && k < smnt)
 
63
                return(k);
 
64
        for (k = 0; fontlab[k] != i; k++)
 
65
                if (k > nfonts)
 
66
                        return(-1);
 
67
        return(k);
 
68
}
 
69
 
 
70
 
 
71
 
 
72
void n_mchbits(void)
 
73
{
 
74
        chbits = 0;
 
75
        setfbits(chbits, font);
 
76
        sps = width(' ' | chbits);
 
77
}
 
78
 
 
79
 
 
80
void n_setps(void )
 
81
{
 
82
        int i, j;
 
83
 
 
84
        i = cbits(getch());
 
85
        if (isdigit(i)) {               /* \sd or \sdd */
 
86
                i -= '0';
 
87
                if (i == 0)             /* \s0 */
 
88
                        ;
 
89
                else if (i <= 3 && (ch=getch()) && isdigit(cbits(ch))) {        /* \sdd */
 
90
                        ch = 0;
 
91
                }
 
92
        } else if (i == '(') {          /* \s(dd */
 
93
                getch();
 
94
                getch();
 
95
        } else if (i == '+' || i == '-') {      /* \s+, \s- */
 
96
                j = cbits(getch());
 
97
                if (isdigit(j)) {               /* \s+d, \s-d */
 
98
                        ;
 
99
                } else if (j == '(') {          /* \s+(dd, \s-(dd */
 
100
                        getch();
 
101
                        getch();
 
102
                }
 
103
        }
 
104
}
 
105
 
 
106
 
 
107
Tchar n_setht(void)             /* set character height from \H'...' */
 
108
{
 
109
 
 
110
        getch();
 
111
        inumb(&apts);
 
112
        getch();
 
113
        return(0);
 
114
}
 
115
 
 
116
 
 
117
Tchar n_setslant(void)          /* set slant from \S'...' */
 
118
{
 
119
        int n;
 
120
 
 
121
        getch();
 
122
        n = 0;
 
123
        n = inumb(&n);
 
124
        getch();
 
125
        return(0);
 
126
}
 
127
 
 
128
 
 
129
void n_caseft(void)
 
130
{
 
131
        skip();
 
132
        setfont(1);
 
133
}
 
134
 
 
135
 
 
136
void n_setfont(int a)
 
137
{
 
138
        int i, j;
 
139
 
 
140
        if (a)
 
141
                i = getrq();
 
142
        else 
 
143
                i = getsn();
 
144
        if (!i || i == 'P') {
 
145
                j = font1;
 
146
                goto s0;
 
147
        }
 
148
        if (i == 'S' || i == '0')
 
149
                return;
 
150
        if ((j = findft(i)) == -1)
 
151
                return;
 
152
s0:
 
153
        font1 = font;
 
154
        font = j;
 
155
        mchbits();
 
156
}
 
157
 
 
158
 
 
159
void n_setwd(void)
 
160
{
 
161
        int base, wid;
 
162
        Tchar i;
 
163
        int     delim, emsz, k;
 
164
        int     savhp, savapts, savapts1, savfont, savfont1, savpts, savpts1;
 
165
 
 
166
        base = numtabp[ST].val = numtabp[ST].val = wid = numtabp[CT].val = 0;
 
167
        if (ismot(i = getch()))
 
168
                return;
 
169
        delim = cbits(i);
 
170
        savhp = numtabp[HP].val;
 
171
        numtabp[HP].val = 0;
 
172
        savapts = apts;
 
173
        savapts1 = apts1;
 
174
        savfont = font;
 
175
        savfont1 = font1;
 
176
        savpts = pts;
 
177
        savpts1 = pts1;
 
178
        setwdf++;
 
179
        while (cbits(i = getch()) != delim && !nlflg) {
 
180
                k = width(i);
 
181
                wid += k;
 
182
                numtabp[HP].val += k;
 
183
                if (!ismot(i)) {
 
184
                        emsz = (INCH * pts + 36) / 72;
 
185
                } else if (isvmot(i)) {
 
186
                        k = absmot(i);
 
187
                        if (isnmot(i))
 
188
                                k = -k;
 
189
                        base -= k;
 
190
                        emsz = 0;
 
191
                } else 
 
192
                        continue;
 
193
                if (base < numtabp[SB].val)
 
194
                        numtabp[SB].val = base;
 
195
                if ((k = base + emsz) > numtabp[ST].val)
 
196
                        numtabp[ST].val = k;
 
197
        }
 
198
        setn1(wid, 0, (Tchar) 0);
 
199
        numtabp[HP].val = savhp;
 
200
        apts = savapts;
 
201
        apts1 = savapts1;
 
202
        font = savfont;
 
203
        font1 = savfont1;
 
204
        pts = savpts;
 
205
        pts1 = savpts1;
 
206
        mchbits();
 
207
        setwdf = 0;
 
208
}
 
209
 
 
210
 
 
211
Tchar n_vmot(void)
 
212
{
 
213
        dfact = lss;
 
214
        vflag++;
 
215
        return n_mot();
 
216
}
 
217
 
 
218
 
 
219
Tchar n_hmot(void)
 
220
{
 
221
        dfact = EM;
 
222
        return n_mot();
 
223
}
 
224
 
 
225
 
 
226
Tchar n_mot(void)
 
227
{
 
228
        int j, n;
 
229
        Tchar i;
 
230
 
 
231
        j = HOR;
 
232
        getch(); /*eat delim*/
 
233
        if (n = atoi0()) {
 
234
                if (vflag)
 
235
                        j = VERT;
 
236
                i = makem(quant(n, j));
 
237
        } else
 
238
                i = 0;
 
239
        getch();
 
240
        vflag = 0;
 
241
        dfact = 1;
 
242
        return(i);
 
243
}
 
244
 
 
245
 
 
246
Tchar n_sethl(int k)
 
247
{
 
248
        int j;
 
249
        Tchar i;
 
250
 
 
251
        j = t.Halfline;
 
252
        if (k == 'u')
 
253
                j = -j;
 
254
        else if (k == 'r')
 
255
                j = -2 * j;
 
256
        vflag++;
 
257
        i = makem(j);
 
258
        vflag = 0;
 
259
        return(i);
 
260
}
 
261
 
 
262
 
 
263
Tchar n_makem(int i)
 
264
{
 
265
        Tchar j;
 
266
 
 
267
        if (i >= 0)
 
268
                j = i;
 
269
        else
 
270
                j = -i;
 
271
        j |= MOT;
 
272
        if (i < 0)
 
273
                j |= NMOT;
 
274
        if (vflag)
 
275
                j |= VMOT;
 
276
        return(j);
 
277
}
 
278
 
 
279
 
 
280
void n_casefp(void)
 
281
{
 
282
        int i, j;
 
283
 
 
284
        skip();
 
285
        if ((i = cbits(getch()) - '0') < 0 || i > nfonts)
 
286
                return;
 
287
        if (skip() || !(j = getrq()))
 
288
                return;
 
289
        fontlab[i] = j;
 
290
}
 
291
 
 
292
 
 
293
 
 
294
void n_casebd(void)
 
295
{
 
296
        int i, j, k;
 
297
 
 
298
        j = k = 0;
 
299
bd0:
 
300
        if (skip() || !(i = getrq()) || (j = findft(i)) == -1) {
 
301
                if (k)
 
302
                        goto bd1;
 
303
                else 
 
304
                        return;
 
305
        }
 
306
        if (j == smnt) {
 
307
                k = smnt;
 
308
                goto bd0;
 
309
        }
 
310
        if (k) {
 
311
                sbold = j;
 
312
                j = k;
 
313
        }
 
314
bd1:
 
315
        skip();
 
316
        noscale++;
 
317
        bdtab[j] = atoi0();
 
318
        noscale = 0;
 
319
}
 
320
 
 
321
 
 
322
void n_casevs(void)
 
323
{
 
324
        int i;
 
325
 
 
326
        skip();
 
327
        vflag++;
 
328
        dfact = INCH; /*default scaling is points!*/
 
329
        dfactd = 72;
 
330
        res = VERT;
 
331
        i = inumb(&lss);
 
332
        if (nonumb)
 
333
                i = lss1;
 
334
        if (i < VERT)
 
335
                i = VERT;       /* was VERT */
 
336
        lss1 = lss;
 
337
        lss = i;
 
338
}
 
339
 
 
340
 
 
341
 
 
342
 
 
343
Tchar n_xlss(void)
 
344
{
 
345
        /* stores \x'...' into
 
346
        /* two successive Tchars.
 
347
        /* the first contains HX, the second the value,
 
348
        /* encoded as a vertical motion.
 
349
        /* decoding is done in n2.c by pchar().
 
350
        */
 
351
        int     i;
 
352
 
 
353
        getch();
 
354
        dfact = lss;
 
355
        i = quant(atoi0(), VERT);
 
356
        dfact = 1;
 
357
        getch();
 
358
        if (i >= 0)
 
359
                *pbp++ = MOT | VMOT | i;
 
360
        else
 
361
                *pbp++ = MOT | VMOT | NMOT | -i;
 
362
        return(HX);
 
363
}