Annotation of GNUtools/emacs/src/tparam.c, revision 1.1.1.1

1.1       root        1: /* Merge parameters into a termcap entry string.
                      2:    Copyright (C) 1985, 1987 Free Software Foundation, Inc.
                      3: 
                      4:     This program is free software; you can redistribute it and/or modify
                      5:     it under the terms of the GNU General Public License as published by
                      6:     the Free Software Foundation; either version 1, or (at your option)
                      7:     any later version.
                      8: 
                      9:     This program is distributed in the hope that it will be useful,
                     10:     but WITHOUT ANY WARRANTY; without even the implied warranty of
                     11:     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     12:     GNU General Public License for more details.
                     13: 
                     14:     You should have received a copy of the GNU General Public License
                     15:     along with this program; if not, write to the Free Software
                     16:     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                     17: 
                     18: In other words, you are welcome to use, share and improve this program.
                     19: You are forbidden to forbid anyone else to use, share and improve
                     20: what you give them.   Help stamp out software-hoarding!  */
                     21: 
                     22: 
                     23: /* config.h may rename various library functions such as malloc.  */
                     24: #ifdef emacs
                     25: #include "config.h"
                     26: #endif
                     27: 
                     28: /* Assuming STRING is the value of a termcap string entry
                     29:    containing `%' constructs to expand parameters,
                     30:    merge in parameter values and store result in block OUTSTRING points to.
                     31:    LEN is the length of OUTSTRING.  If more space is needed,
                     32:    a block is allocated with `malloc'.
                     33: 
                     34:    The value returned is the address of the resulting string.
                     35:    This may be OUTSTRING or may be the address of a block got with `malloc'.
                     36:    In the latter case, the caller must free the block.
                     37: 
                     38:    The fourth and following args to tparam serve as the parameter values.  */
                     39: 
                     40: static char *tparam1 ();
                     41: 
                     42: /* VARARGS 2 */
                     43: char *
                     44: tparam (string, outstring, len, arg0, arg1, arg2, arg3)
                     45:      char *string;
                     46:      char *outstring;
                     47:      int len;
                     48:      int arg0, arg1, arg2, arg3;
                     49: {
                     50: #ifdef NO_ARG_ARRAY
                     51:   int arg[4];
                     52:   arg[0] = arg0;
                     53:   arg[1] = arg1;
                     54:   arg[2] = arg2;
                     55:   arg[3] = arg3;
                     56:   return tparam1 (string, outstring, len, 0, 0, arg);
                     57: #else
                     58:   return tparam1 (string, outstring, len, 0, 0, &arg0);
                     59: #endif
                     60: }
                     61: 
                     62: char *BC;
                     63: char *UP;
                     64: 
                     65: static char tgoto_buf[50];
                     66: 
                     67: char *
                     68: tgoto (cm, hpos, vpos)
                     69:      char *cm;
                     70:      int hpos, vpos;
                     71: {
                     72:   int args[2];
                     73:   if (!cm)
                     74:     return 0;
                     75:   args[0] = vpos;
                     76:   args[1] = hpos;
                     77:   return tparam1 (cm, tgoto_buf, 50, UP, BC, args);
                     78: }
                     79: 
                     80: static char *
                     81: tparam1 (string, outstring, len, up, left, argp)
                     82:      char *string;
                     83:      char *outstring;
                     84:      int len;
                     85:      char *up, *left;
                     86:      register int *argp;
                     87: {
                     88:   register int c;
                     89:   register char *p = string;
                     90:   register char *op = outstring;
                     91:   char *outend;
                     92:   int outlen = 0;
                     93: 
                     94:   register int tem;
                     95:   int *oargp = argp;
                     96:   int doleft = 0;
                     97:   int doup = 0;
                     98: 
                     99:   outend = outstring + len;
                    100: 
                    101:   while (1)
                    102:     {
                    103:       /* If the buffer might be too short, make it bigger.  */
                    104:       if (op + 5 >= outend)
                    105:        {
                    106:          register char *new;
                    107:          if (outlen == 0)
                    108:            {
                    109:              new = (char *) malloc (outlen = 40 + len);
                    110:              outend += 40;
                    111:              bcopy (outstring, new, op - outstring);
                    112:            }
                    113:          else
                    114:            {
                    115:              outend += outlen;
                    116:              new = (char *) realloc (outstring, outlen *= 2);
                    117:            }
                    118:          op += new - outstring;
                    119:          outend += new - outstring;
                    120:          outstring = new;
                    121:        }
                    122:       if (!(c = *p++))
                    123:        break;
                    124:       if (c == '%')
                    125:        {
                    126:          c = *p++;
                    127:          tem = *argp;
                    128:          switch (c)
                    129:            {
                    130:            case 'd':           /* %d means output in decimal */
                    131:              if (tem < 10)
                    132:                goto onedigit;
                    133:              if (tem < 100)
                    134:                goto twodigit;
                    135:            case '3':           /* %3 means output in decimal, 3 digits. */
                    136:              if (tem > 999)
                    137:                {
                    138:                  *op++ = tem / 1000 + '0';
                    139:                  tem %= 1000;
                    140:                }
                    141:              *op++ = tem / 100 + '0';
                    142:            case '2':           /* %2 means output in decimal, 2 digits. */
                    143:            twodigit:
                    144:              tem %= 100;
                    145:              *op++ = tem / 10 + '0';
                    146:            onedigit:
                    147:              *op++ = tem % 10 + '0';
                    148:              argp++;
                    149:              break;
                    150: 
                    151:            case 'C':
                    152:              /* For c-100: print quotient of value by 96, if nonzero,
                    153:                 then do like %+ */
                    154:              if (tem >= 96)
                    155:                {
                    156:                  *op++ = tem / 96;
                    157:                  tem %= 96;
                    158:                }
                    159:            case '+':           /* %+x means add character code of char x */
                    160:              tem += *p++;
                    161:            case '.':           /* %. means output as character */
                    162:              if (left)
                    163:                {
                    164:                  /* If want to forbid output of 0 and \n and \t,
                    165:                     and this is one of them, increment it.  */
                    166:                  while (tem == 0 || tem == '\n' || tem == '\t')
                    167:                    {
                    168:                      tem++;
                    169:                      if (argp == oargp)
                    170:                        doup++, outend -= strlen (up);
                    171:                      else
                    172:                        doleft++, outend -= strlen (left);
                    173:                    }
                    174:                }
                    175:              *op++ = tem | 0200;
                    176:            case 'f':           /* %f means discard next arg */
                    177:              argp++;
                    178:              break;
                    179: 
                    180:            case 'b':           /* %b means back up one arg (and re-use it) */
                    181:              argp--;
                    182:              break;
                    183: 
                    184:            case 'r':           /* %r means interchange following two args */
                    185:              argp[0] = argp[1];
                    186:              argp[1] = tem;
                    187:              oargp++;
                    188:              break;
                    189: 
                    190:            case '>':           /* %>xy means if arg is > char code of x, */
                    191:              if (argp[0] > *p++) /* then add char code of y to the arg, */
                    192:                argp[0] += *p;  /* and in any case don't output. */
                    193:              p++;              /* Leave the arg to be output later. */
                    194:              break;
                    195: 
                    196:            case 'a':           /* %a means arithmetic */
                    197:              /* Next character says what operation.
                    198:                 Add or subtract either a constant or some other arg */
                    199:              /* First following character is + to add or - to subtract
                    200:                 or = to assign.  */
                    201:              /* Next following char is 'p' and an arg spec
                    202:                 (0100 plus position of that arg relative to this one)
                    203:                 or 'c' and a constant stored in a character */
                    204:              tem = p[2] & 0177;
                    205:              if (p[1] == 'p')
                    206:                tem = argp[tem - 0100];
                    207:              if (p[0] == '-')
                    208:                argp[0] -= tem;
                    209:              else if (p[0] == '+')
                    210:                argp[0] += tem;
                    211:              else if (p[0] == '*')
                    212:                argp[0] *= tem;
                    213:              else if (p[0] == '/')
                    214:                argp[0] /= tem;
                    215:              else
                    216:                argp[0] = tem;
                    217: 
                    218:              p += 3;
                    219:              break;
                    220: 
                    221:            case 'i':           /* %i means add one to arg, */
                    222:              argp[0] ++;       /* and leave it to be output later. */
                    223:              argp[1] ++;       /* Increment the following arg, too!  */
                    224:              break;
                    225: 
                    226:            case '%':           /* %% means output %; no arg. */
                    227:              goto ordinary;
                    228: 
                    229:            case 'n':           /* %n means xor each of next two args with 140 */
                    230:              argp[0] ^= 0140;
                    231:              argp[1] ^= 0140;
                    232:              break;
                    233: 
                    234:            case 'm':           /* %m means xor each of next two args with 177 */
                    235:              argp[0] ^= 0177;
                    236:              argp[1] ^= 0177;
                    237:              break;
                    238: 
                    239:            case 'B':           /* %B means express arg as BCD char code. */
                    240:              argp[0] += 6 * (tem / 10);
                    241:              break;
                    242: 
                    243:            case 'D':           /* %D means weird Delta Data transformation */
                    244:              argp[0] -= 2 * (tem % 16);
                    245:              break;
                    246:            }
                    247:        }
                    248:       else
                    249:        /* Ordinary character in the argument string.  */
                    250:       ordinary:
                    251:        *op++ = c;
                    252:     }
                    253:   *op = 0;
                    254:   while (doup-- > 0)
                    255:     strcat (op, up);
                    256:   while (doleft-- > 0)
                    257:     strcat (op, left);
                    258:   return outstring;
                    259: }
                    260: 
                    261: #ifdef DEBUG
                    262: 
                    263: main (argc, argv)
                    264:      int argc;
                    265:      char **argv;
                    266: {
                    267:   char buf[50];
                    268:   int args[3];
                    269:   args[0] = atoi (argv[2]);
                    270:   args[1] = atoi (argv[3]);
                    271:   args[2] = atoi (argv[4]);
                    272:   tparam1 (argv[1], buf, "LEFT", "UP", args);
                    273:   printf ("%s\n", buf);
                    274:   return 0;
                    275: }
                    276: 
                    277: #endif /* DEBUG */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.