Annotation of 43BSDReno/contrib/emacs-18.55/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: 
                      5:                       NO WARRANTY
                      6: 
                      7:   BECAUSE THIS PROGRAM IS LICENSED FREE OF CHARGE, WE PROVIDE ABSOLUTELY
                      8: NO WARRANTY, TO THE EXTENT PERMITTED BY APPLICABLE STATE LAW.  EXCEPT
                      9: WHEN OTHERWISE STATED IN WRITING, FREE SOFTWARE FOUNDATION, INC,
                     10: RICHARD M. STALLMAN AND/OR OTHER PARTIES PROVIDE THIS PROGRAM "AS IS"
                     11: WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
                     12: BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
                     13: FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY
                     14: AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE PROGRAM PROVE
                     15: DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR
                     16: CORRECTION.
                     17: 
                     18:  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW WILL RICHARD M.
                     19: STALLMAN, THE FREE SOFTWARE FOUNDATION, INC., AND/OR ANY OTHER PARTY
                     20: WHO MAY MODIFY AND REDISTRIBUTE THIS PROGRAM AS PERMITTED BELOW, BE
                     21: LIABLE TO YOU FOR DAMAGES, INCLUDING ANY LOST PROFITS, LOST MONIES, OR
                     22: OTHER SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
                     23: USE OR INABILITY TO USE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR
                     24: DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY THIRD PARTIES OR
                     25: A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS) THIS
                     26: PROGRAM, EVEN IF YOU HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH
                     27: DAMAGES, OR FOR ANY CLAIM BY ANY OTHER PARTY.
                     28: 
                     29:                GENERAL PUBLIC LICENSE TO COPY
                     30: 
                     31:   1. You may copy and distribute verbatim copies of this source file
                     32: as you receive it, in any medium, provided that you conspicuously and
                     33: appropriately publish on each copy a valid copyright notice "Copyright
                     34: (C) 1986 Free Software Foundation, Inc."; and include following the
                     35: copyright notice a verbatim copy of the above disclaimer of warranty
                     36: and of this License.  You may charge a distribution fee for the
                     37: physical act of transferring a copy.
                     38: 
                     39:   2. You may modify your copy or copies of this source file or
                     40: any portion of it, and copy and distribute such modifications under
                     41: the terms of Paragraph 1 above, provided that you also do the following:
                     42: 
                     43:     a) cause the modified files to carry prominent notices stating
                     44:     that you changed the files and the date of any change; and
                     45: 
                     46:     b) cause the whole of any work that you distribute or publish,
                     47:     that in whole or in part contains or is a derivative of this
                     48:     program or any part thereof, to be licensed at no charge to all
                     49:     third parties on terms identical to those contained in this
                     50:     License Agreement (except that you may choose to grant more extensive
                     51:     warranty protection to some or all third parties, at your option).
                     52: 
                     53:     c) You may charge a distribution fee for the physical act of
                     54:     transferring a copy, and you may at your option offer warranty
                     55:     protection in exchange for a fee.
                     56: 
                     57: Mere aggregation of another unrelated program with this program (or its
                     58: derivative) on a volume of a storage or distribution medium does not bring
                     59: the other program under the scope of these terms.
                     60: 
                     61:   3. You may copy and distribute this program (or a portion or derivative
                     62: of it, under Paragraph 2) in object code or executable form under the terms
                     63: of Paragraphs 1 and 2 above provided that you also do one of the following:
                     64: 
                     65:     a) accompany it with the complete corresponding machine-readable
                     66:     source code, which must be distributed under the terms of
                     67:     Paragraphs 1 and 2 above; or,
                     68: 
                     69:     b) accompany it with a written offer, valid for at least three
                     70:     years, to give any third party free (except for a nominal
                     71:     shipping charge) a complete machine-readable copy of the
                     72:     corresponding source code, to be distributed under the terms of
                     73:     Paragraphs 1 and 2 above; or,
                     74: 
                     75:     c) accompany it with the information you received as to where the
                     76:     corresponding source code may be obtained.  (This alternative is
                     77:     allowed only for noncommercial distribution and only if you
                     78:     received the program in object code or executable form alone.)
                     79: 
                     80: For an executable file, complete source code means all the source code for
                     81: all modules it contains; but, as a special exception, it need not include
                     82: source code for modules which are standard libraries that accompany the
                     83: operating system on which the executable file runs.
                     84: 
                     85:   4. You may not copy, sublicense, distribute or transfer this program
                     86: except as expressly provided under this License Agreement.  Any attempt
                     87: otherwise to copy, sublicense, distribute or transfer this program is void and
                     88: your rights to use the program under this License agreement shall be
                     89: automatically terminated.  However, parties who have received computer
                     90: software programs from you with this License Agreement will not have
                     91: their licenses terminated so long as such parties remain in full compliance.
                     92: 
                     93:   5. If you wish to incorporate parts of this program into other free
                     94: programs whose distribution conditions are different, write to the Free
                     95: Software Foundation at 675 Mass Ave, Cambridge, MA 02139.  We have not yet
                     96: worked out a simple rule that can be stated here, but we will often permit
                     97: this.  We will be guided by the two goals of preserving the free status of
                     98: all derivatives of our free software and of promoting the sharing and reuse of
                     99: software.
                    100: 
                    101: 
                    102: In other words, you are welcome to use, share and improve this program.
                    103: You are forbidden to forbid anyone else to use, share and improve
                    104: what you give them.   Help stamp out software-hoarding!  */
                    105: 
                    106: 
                    107: /* config.h may rename various library functions such as malloc.  */
                    108: #ifdef emacs
                    109: #include "config.h"
                    110: #endif
                    111: 
                    112: /* Assuming STRING is the value of a termcap string entry
                    113:    containing `%' constructs to expand parameters,
                    114:    merge in parameter values and store result in block OUTSTRING points to.
                    115:    LEN is the length of OUTSTRING.  If more space is needed,
                    116:    a block is allocated with `malloc'.
                    117: 
                    118:    The value returned is the address of the resulting string.
                    119:    This may be OUTSTRING or may be the address of a block got with `malloc'.
                    120:    In the latter case, the caller must free the block.
                    121: 
                    122:    The fourth and following args to tparam serve as the parameter values.  */
                    123: 
                    124: static char *tparam1 ();
                    125: 
                    126: /* VARARGS 2 */
                    127: char *
                    128: tparam (string, outstring, len, arg0, arg1, arg2, arg3)
                    129:      char *string;
                    130:      char *outstring;
                    131:      int len;
                    132:      int arg0, arg1, arg2, arg3;
                    133: {
                    134: #ifdef NO_ARG_ARRAY
                    135:   int arg[4];
                    136:   arg[0] = arg0;
                    137:   arg[1] = arg1;
                    138:   arg[2] = arg2;
                    139:   arg[3] = arg3;
                    140:   return tparam1 (string, outstring, len, 0, 0, arg);
                    141: #else
                    142:   return tparam1 (string, outstring, len, 0, 0, &arg0);
                    143: #endif
                    144: }
                    145: 
                    146: char *BC;
                    147: char *UP;
                    148: 
                    149: static char tgoto_buf[50];
                    150: 
                    151: char *
                    152: tgoto (cm, hpos, vpos)
                    153:      char *cm;
                    154:      int hpos, vpos;
                    155: {
                    156:   int args[2];
                    157:   if (!cm)
                    158:     return 0;
                    159:   args[0] = vpos;
                    160:   args[1] = hpos;
                    161:   return tparam1 (cm, tgoto_buf, 50, UP, BC, args);
                    162: }
                    163: 
                    164: static char *
                    165: tparam1 (string, outstring, len, up, left, argp)
                    166:      char *string;
                    167:      char *outstring;
                    168:      int len;
                    169:      char *up, *left;
                    170:      register int *argp;
                    171: {
                    172:   register int c;
                    173:   register char *p = string;
                    174:   register char *op = outstring;
                    175:   char *outend;
                    176:   int outlen = 0;
                    177: 
                    178:   register int tem;
                    179:   int *oargp = argp;
                    180:   int doleft = 0;
                    181:   int doup = 0;
                    182: 
                    183:   outend = outstring + len;
                    184: 
                    185:   while (1)
                    186:     {
                    187:       /* If the buffer might be too short, make it bigger.  */
                    188:       if (op + 5 >= outend)
                    189:        {
                    190:          register char *new;
                    191:          if (outlen == 0)
                    192:            {
                    193:              new = (char *) malloc (outlen = 40 + len);
                    194:              outend += 40;
                    195:              bcopy (outstring, new, op - outstring);
                    196:            }
                    197:          else
                    198:            {
                    199:              outend += outlen;
                    200:              new = (char *) realloc (outstring, outlen *= 2);
                    201:            }
                    202:          op += new - outstring;
                    203:          outend += new - outstring;
                    204:          outstring = new;
                    205:        }
                    206:       if (!(c = *p++))
                    207:        break;
                    208:       if (c == '%')
                    209:        {
                    210:          c = *p++;
                    211:          tem = *argp;
                    212:          switch (c)
                    213:            {
                    214:            case 'd':           /* %d means output in decimal */
                    215:              if (tem < 10)
                    216:                goto onedigit;
                    217:              if (tem < 100)
                    218:                goto twodigit;
                    219:            case '3':           /* %3 means output in decimal, 3 digits. */
                    220:              if (tem > 999)
                    221:                {
                    222:                  *op++ = tem / 1000 + '0';
                    223:                  tem %= 1000;
                    224:                }
                    225:              *op++ = tem / 100 + '0';
                    226:            case '2':           /* %2 means output in decimal, 2 digits. */
                    227:            twodigit:
                    228:              tem %= 100;
                    229:              *op++ = tem / 10 + '0';
                    230:            onedigit:
                    231:              *op++ = tem % 10 + '0';
                    232:              argp++;
                    233:              break;
                    234: 
                    235:            case 'C':
                    236:              /* For c-100: print quotient of value by 96, if nonzero,
                    237:                 then do like %+ */
                    238:              if (tem >= 96)
                    239:                {
                    240:                  *op++ = tem / 96;
                    241:                  tem %= 96;
                    242:                }
                    243:            case '+':           /* %+x means add character code of char x */
                    244:              tem += *p++;
                    245:            case '.':           /* %. means output as character */
                    246:              if (left)
                    247:                {
                    248:                  /* If want to forbid output of 0 and \n and \t,
                    249:                     and this is one of them, increment it.  */
                    250:                  while (tem == 0 || tem == '\n' || tem == '\t')
                    251:                    {
                    252:                      tem++;
                    253:                      if (argp == oargp)
                    254:                        doup++, outend -= strlen (up);
                    255:                      else
                    256:                        doleft++, outend -= strlen (left);
                    257:                    }
                    258:                }
                    259:              *op++ = tem | 0200;
                    260:            case 'f':           /* %f means discard next arg */
                    261:              argp++;
                    262:              break;
                    263: 
                    264:            case 'b':           /* %b means back up one arg (and re-use it) */
                    265:              argp--;
                    266:              break;
                    267: 
                    268:            case 'r':           /* %r means interchange following two args */
                    269:              argp[0] = argp[1];
                    270:              argp[1] = tem;
                    271:              oargp++;
                    272:              break;
                    273: 
                    274:            case '>':           /* %>xy means if arg is > char code of x, */
                    275:              if (argp[0] > *p++) /* then add char code of y to the arg, */
                    276:                argp[0] += *p;  /* and in any case don't output. */
                    277:              p++;              /* Leave the arg to be output later. */
                    278:              break;
                    279: 
                    280:            case 'a':           /* %a means arithmetic */
                    281:              /* Next character says what operation.
                    282:                 Add or subtract either a constant or some other arg */
                    283:              /* First following character is + to add or - to subtract
                    284:                 or = to assign.  */
                    285:              /* Next following char is 'p' and an arg spec
                    286:                 (0100 plus position of that arg relative to this one)
                    287:                 or 'c' and a constant stored in a character */
                    288:              tem = p[2] & 0177;
                    289:              if (p[1] == 'p')
                    290:                tem = argp[tem - 0100];
                    291:              if (p[0] == '-')
                    292:                argp[0] -= tem;
                    293:              else if (p[0] == '+')
                    294:                argp[0] += tem;
                    295:              else if (p[0] == '*')
                    296:                argp[0] *= tem;
                    297:              else if (p[0] == '/')
                    298:                argp[0] /= tem;
                    299:              else
                    300:                argp[0] = tem;
                    301: 
                    302:              p += 3;
                    303:              break;
                    304: 
                    305:            case 'i':           /* %i means add one to arg, */
                    306:              argp[0] ++;       /* and leave it to be output later. */
                    307:              argp[1] ++;       /* Increment the following arg, too!  */
                    308:              break;
                    309: 
                    310:            case '%':           /* %% means output %; no arg. */
                    311:              goto ordinary;
                    312: 
                    313:            case 'n':           /* %n means xor each of next two args with 140 */
                    314:              argp[0] ^= 0140;
                    315:              argp[1] ^= 0140;
                    316:              break;
                    317: 
                    318:            case 'm':           /* %m means xor each of next two args with 177 */
                    319:              argp[0] ^= 0177;
                    320:              argp[1] ^= 0177;
                    321:              break;
                    322: 
                    323:            case 'B':           /* %B means express arg as BCD char code. */
                    324:              argp[0] += 6 * (tem / 10);
                    325:              break;
                    326: 
                    327:            case 'D':           /* %D means weird Delta Data transformation */
                    328:              argp[0] -= 2 * (tem % 16);
                    329:              break;
                    330:            }
                    331:        }
                    332:       else
                    333:        /* Ordinary character in the argument string.  */
                    334:       ordinary:
                    335:        *op++ = c;
                    336:     }
                    337:   *op = 0;
                    338:   while (doup-- > 0)
                    339:     strcat (op, up);
                    340:   while (doleft-- > 0)
                    341:     strcat (op, left);
                    342:   return outstring;
                    343: }
                    344: 
                    345: #ifdef DEBUG
                    346: 
                    347: main (argc, argv)
                    348:      int argc;
                    349:      char **argv;
                    350: {
                    351:   char buf[50];
                    352:   int args[3];
                    353:   args[0] = atoi (argv[2]);
                    354:   args[1] = atoi (argv[3]);
                    355:   args[2] = atoi (argv[4]);
                    356:   tparam1 (argv[1], buf, "LEFT", "UP", args);
                    357:   printf ("%s\n", buf);
                    358:   return 0;
                    359: }
                    360: 
                    361: #endif /* DEBUG */

unix.superglobalmegacorp.com

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