1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License, Version 1.0 only
   6  * (the "License").  You may not use this file except in compliance
   7  * with the License.
   8  *
   9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  10  * or http://www.opensolaris.org/os/licensing.
  11  * See the License for the specific language governing permissions
  12  * and limitations under the License.
  13  *
  14  * When distributing Covered Code, include this CDDL HEADER in each
  15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  16  * If applicable, add the following below this CDDL HEADER, with the
  17  * fields enclosed by brackets "[]" replaced with your own identifying
  18  * information: Portions Copyright [yyyy] [name of copyright owner]
  19  *
  20  * CDDL HEADER END
  21  */
  22 /*
  23  * Copyright 2017 Gary Mills
  24  * Copyright 2003 Sun Microsystems, Inc.  All rights reserved.
  25  * Use is subject to license terms.
  26  */
  27 
  28 /*      Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T     */
  29 /*        All Rights Reserved   */
  30 
  31 /*
  32  * University Copyright- Copyright (c) 1982, 1986, 1988
  33  * The Regents of the University of California
  34  * All Rights Reserved
  35  *
  36  * University Acknowledgment- Portions of this document are derived from
  37  * software developed by the University of California, Berkeley, and its
  38  * contributors.
  39  */
  40 
  41 #include "tdef.h"
  42 #include "tw.h"
  43 #include "ext.h"
  44 #include <ctype.h>
  45 
  46 /*
  47  * n6.c -- width functions, sizes and fonts
  48 */
  49 
  50 int     bdtab[NFONT+1] ={ 0, 0, 0, 3, 3, 0, };
  51 int     sbold = 0;
  52 int     fontlab[NFONT+1] = { 0, 'R', 'I', 'B', PAIR('B','I'), 'S', 0 };
  53 
  54 extern  int     nchtab;
  55 
  56 int
  57 width(j)
  58 tchar j;
  59 {
  60         int     i, k;
  61 
  62         if (j & (ZBIT|MOT)) {
  63                 if (iszbit(j))
  64                         return(0);
  65                 if (isvmot(j))
  66                         return(0);
  67                 k = absmot(j);
  68                 if (isnmot(j))
  69                         k = -k;
  70                 return(k);
  71         }
  72         i = cbits(j);
  73         if (i < ' ') {
  74                 if (i == '\b')
  75                         return(-widthp);
  76                 if (i == PRESC)
  77                         i = eschar;
  78                 else if (iscontrol(i))
  79                         return(0);
  80         }
  81         if (i==ohc)
  82                 return(0);
  83 #ifdef EUC
  84 #ifdef NROFF
  85         if (multi_locale) {
  86                 if ((j & MBMASK) || (j & CSMASK)) {
  87                         switch(j & MBMASK) {
  88                                 case BYTE_CHR:
  89                                 case LASTOFMB:
  90                                         k = t.Char * csi_width[cs(j)];
  91                                         break;
  92                                 default:
  93                                         k = 0;
  94                                         break;
  95                         }
  96                         widthp = k;
  97                         return(k);
  98                 }
  99         }
 100         i &= 0x1ff;
 101 #endif /* NROFF */
 102 #endif /* EUC */
 103         i = trtab[i];
 104         if (i < 32)
 105                 return(0);
 106         k = t.width[i] * t.Char;
 107         widthp = k;
 108         return(k);
 109 }
 110 
 111 
 112 tchar setch()
 113 {
 114         int     j;
 115         char    temp[10];
 116         char    *s;
 117 
 118         s = temp;
 119         if ((*s++ = getach()) == 0 || (*s++ = getach()) == 0)
 120                 return(0);
 121         *s = '\0';
 122         if ((j = findch(temp)) > 0)
 123                 return j | chbits;
 124         else
 125                 return 0;
 126 }
 127 
 128 tchar setabs()          /* set absolute char from \C'...' */
 129 {                       /* for now, a no-op */
 130         int i, n, nf;
 131 
 132         getch();
 133         n = 0;
 134         n = inumb(&n);
 135         getch();
 136         if (nonumb)
 137                 return 0;
 138         return n + nchtab + _SPECCHAR_ST;
 139 }
 140 
 141 int
 142 findft(i)
 143 int     i;
 144 {
 145         int     k;
 146 
 147         if ((k = i - '0') >= 0 && k <= nfonts && k < smnt)
 148                 return(k);
 149         for (k = 0; fontlab[k] != i; k++)
 150                 if (k > nfonts)
 151                         return(-1);
 152         return(k);
 153 }
 154 
 155 int
 156 caseps()
 157 {
 158         return (0);
 159 }
 160 
 161 int
 162 mchbits()
 163 {
 164         chbits = 0;
 165         setfbits(chbits, font);
 166         sps = width(' ' | chbits);
 167 
 168         return (0);
 169 }
 170 
 171 
 172 int
 173 setps()
 174 {
 175         int     i, j;
 176 
 177         i = cbits(getch());
 178         if (ischar(i) && isdigit(i)) {          /* \sd or \sdd */
 179                 i -= '0';
 180                 if (i == 0)             /* \s0 */
 181                         ;
 182                 else if (i <= 3 && ischar(j = cbits(ch = getch())) &&
 183                     isdigit(j)) {       /* \sdd */
 184                         ch = 0;
 185                 }
 186         } else if (i == '(') {          /* \s(dd */
 187                 getch();
 188                 getch();
 189         } else if (i == '+' || i == '-') {      /* \s+, \s- */
 190                 j = cbits(getch());
 191                 if (ischar(j) && isdigit(j)) {          /* \s+d, \s-d */
 192                         ;
 193                 } else if (j == '(') {          /* \s+(dd, \s-(dd */
 194                         getch();
 195                         getch();
 196                 }
 197         }
 198 
 199         return (0);
 200 }
 201 
 202 
 203 tchar setht()           /* set character height from \H'...' */
 204 {
 205         tchar c;
 206 
 207         getch();
 208         (void) inumb(&apts);
 209         getch();
 210         return(0);
 211 }
 212 
 213 
 214 tchar setslant()                /* set slant from \S'...' */
 215 {
 216         int     n;
 217         tchar c;
 218 
 219         getch();
 220         n = 0;
 221         n = inumb(&n);
 222         getch();
 223         return(0);
 224 }
 225 
 226 
 227 int
 228 caseft()
 229 {
 230         skip();
 231         setfont(1);
 232 
 233         return (0);
 234 }
 235 
 236 
 237 int
 238 setfont(a)
 239 int     a;
 240 {
 241         int     i, j;
 242 
 243         if (a)
 244                 i = getrq();
 245         else
 246                 i = getsn();
 247         if (!i || i == 'P') {
 248                 j = font1;
 249                 goto s0;
 250         }
 251         if (i == 'S' || i == '0')
 252                 return (0);
 253         if ((j = findft(i, fontlab)) == -1)
 254                 return (0);
 255 s0:
 256         font1 = font;
 257         font = j;
 258         mchbits();
 259 
 260         return (0);
 261 }
 262 
 263 
 264 int
 265 setwd()
 266 {
 267         int     base, wid;
 268         tchar i;
 269         int     delim, emsz, k;
 270         int     savhp, savapts, savapts1, savfont, savfont1, savpts, savpts1;
 271 
 272         base = numtab[ST].val = wid = numtab[CT].val = 0;
 273         if (ismot(i = getch()))
 274                 return (0);
 275         delim = cbits(i);
 276         savhp = numtab[HP].val;
 277         numtab[HP].val = 0;
 278         savapts = apts;
 279         savapts1 = apts1;
 280         savfont = font;
 281         savfont1 = font1;
 282         savpts = pts;
 283         savpts1 = pts1;
 284         setwdf++;
 285         while (cbits(i = getch()) != delim && !nlflg) {
 286                 k = width(i);
 287                 wid += k;
 288                 numtab[HP].val += k;
 289                 if (!ismot(i)) {
 290                         emsz = (INCH * pts + 36) / 72;
 291                 } else if (isvmot(i)) {
 292                         k = absmot(i);
 293                         if (isnmot(i))
 294                                 k = -k;
 295                         base -= k;
 296                         emsz = 0;
 297                 } else
 298                         continue;
 299                 if (base < numtab[SB].val)
 300                         numtab[SB].val = base;
 301                 if ((k = base + emsz) > numtab[ST].val)
 302                         numtab[ST].val = k;
 303         }
 304         setn1(wid, 0, (tchar) 0);
 305         numtab[HP].val = savhp;
 306         apts = savapts;
 307         apts1 = savapts1;
 308         font = savfont;
 309         font1 = savfont1;
 310         pts = savpts;
 311         pts1 = savpts1;
 312         mchbits();
 313         setwdf = 0;
 314 
 315         return (0);
 316 }
 317 
 318 
 319 tchar vmot()
 320 {
 321         dfact = lss;
 322         vflag++;
 323         return(mot());
 324 }
 325 
 326 
 327 tchar hmot()
 328 {
 329         dfact = EM;
 330         return(mot());
 331 }
 332 
 333 
 334 tchar mot()
 335 {
 336         int j, n;
 337         tchar i;
 338 
 339         j = HOR;
 340         getch(); /*eat delim*/
 341         if (n = atoi()) {
 342                 if (vflag)
 343                         j = VERT;
 344                 i = makem(quant(n, j));
 345         } else
 346                 i = 0;
 347         getch();
 348         vflag = 0;
 349         dfact = 1;
 350         return(i);
 351 }
 352 
 353 
 354 tchar sethl(k)
 355 int     k;
 356 {
 357         int     j;
 358         tchar i;
 359 
 360         j = t.Halfline;
 361         if (k == 'u')
 362                 j = -j;
 363         else if (k == 'r')
 364                 j = -2 * j;
 365         vflag++;
 366         i = makem(j);
 367         vflag = 0;
 368         return(i);
 369 }
 370 
 371 
 372 tchar makem(i)
 373 int     i;
 374 {
 375         tchar j;
 376 
 377         if ((j = i) < 0)
 378                 j = -j;
 379         j |= MOT;
 380         if (i < 0)
 381                 j |= NMOT;
 382         if (vflag)
 383                 j |= VMOT;
 384         return(j);
 385 }
 386 
 387 
 388 tchar getlg(i)
 389 tchar   i;
 390 {
 391         return(i);
 392 }
 393 
 394 
 395 int
 396 caselg()
 397 {
 398         return (0);
 399 }
 400 
 401 
 402 int
 403 casefp()
 404 {
 405         int     i, j;
 406 
 407         skip();
 408         if ((i = cbits(getch()) - '0') < 0 || i > nfonts)
 409                 return (0);
 410         if (skip() || !(j = getrq()))
 411                 return (0);
 412         fontlab[i] = j;
 413 
 414         return (0);
 415 }
 416 
 417 
 418 int
 419 casecs()
 420 {
 421         return (0);
 422 }
 423 
 424 
 425 int
 426 casebd()
 427 {
 428         int     i, j, k;
 429 
 430         k = 0;
 431 bd0:
 432         if (skip() || !(i = getrq()) || (j = findft(i)) == -1) {
 433                 if (k)
 434                         goto bd1;
 435                 else
 436                         return (0);
 437         }
 438         if (j == smnt) {
 439                 k = smnt;
 440                 goto bd0;
 441         }
 442         if (k) {
 443                 sbold = j;
 444                 j = k;
 445         }
 446 bd1:
 447         skip();
 448         noscale++;
 449         bdtab[j] = atoi();
 450         noscale = 0;
 451 
 452         return (0);
 453 }
 454 
 455 
 456 int
 457 casevs()
 458 {
 459         int     i;
 460 
 461         skip();
 462         vflag++;
 463         dfact = INCH; /*default scaling is points!*/
 464         dfactd = 72;
 465         res = VERT;
 466         i = inumb(&lss);
 467         if (nonumb)
 468                 i = lss1;
 469         if (i < VERT)
 470                 i = VERT;       /* was VERT */
 471         lss1 = lss;
 472         lss = i;
 473 
 474         return (0);
 475 }
 476 
 477 
 478 
 479 int
 480 casess()
 481 {
 482         return (0);
 483 }
 484 
 485 
 486 tchar xlss()
 487 {
 488         /* stores \x'...' into
 489          * two successive tchars.
 490          * the first contains HX, the second the value,
 491          * encoded as a vertical motion.
 492          * decoding is done in n2.c by pchar().
 493          */
 494         int     i;
 495 
 496         getch();
 497         dfact = lss;
 498         i = quant(atoi(), VERT);
 499         dfact = 1;
 500         getch();
 501         if (i >= 0)
 502                 *pbp++ = MOT | VMOT | i;
 503         else
 504                 *pbp++ = MOT | VMOT | NMOT | -i;
 505         return(HX);
 506 }