Annotation of GNUtools/emacs/src/tparam.c, revision 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.