Annotation of coherent/g/usr/lib/ncurses/lib_tparm.c, revision 1.1

1.1     ! root        1: /*********************************************************************
        !             2: *                         COPYRIGHT NOTICE                           *
        !             3: **********************************************************************
        !             4: *        This software is copyright (C) 1982 by Pavel Curtis         *
        !             5: *                                                                    *
        !             6: *        Permission is granted to reproduce and distribute           *
        !             7: *        this file by any means so long as no fee is charged         *
        !             8: *        above a nominal handling fee and so long as this            *
        !             9: *        notice is always included in the copies.                    *
        !            10: *                                                                    *
        !            11: *        Other rights are reserved except as explicitly granted      *
        !            12: *        by written permission of the author.                        *
        !            13: *                Pavel Curtis                                        *
        !            14: *                Computer Science Dept.                              *
        !            15: *                405 Upson Hall                                      *
        !            16: *                Cornell University                                  *
        !            17: *                Ithaca, NY 14853                                    *
        !            18: *                                                                    *
        !            19: *                Ph- (607) 256-4934                                  *
        !            20: *                                                                    *
        !            21: *                Pavel.Cornell@Udel-Relay   (ARPAnet)                *
        !            22: *                decvax!cornell!pavel       (UUCPnet)                *
        !            23: *********************************************************************/
        !            24: 
        !            25: /*
        !            26:  *     tparm.c
        !            27:  *
        !            28:  *  $Log:      lib_tparm.c,v $
        !            29:  * Revision 1.8  93/04/12  14:14:30  bin
        !            30:  * Udo: third color update
        !            31:  * 
        !            32:  * Revision 2.4  92/10/23  00:31:38  munk
        !            33:  * npush(npop()...) does not work with COHERENT's cc
        !            34:  * because of side effects, use x = npop(); npush(x...) instead.
        !            35:  * Now hold x and y in register, not level.
        !            36:  * 
        !            37:  * Revision 1.2  92/04/13  14:38:35  bin
        !            38:  * update by vlad
        !            39:  * 
        !            40:  * Revision 2.2  91/04/20  21:54:27  munk
        !            41:  * Usage of register variables
        !            42:  *
        !            43:  * Revision 2.1  82/10/25  14:49:19  pavel
        !            44:  * Added Copyright Notice
        !            45:  * 
        !            46:  * Revision 2.0  82/10/24  15:17:53  pavel
        !            47:  * Beta-one Test Release
        !            48:  * 
        !            49:  * Revision 1.3  82/08/23  22:30:38  pavel
        !            50:  * The REAL Alpha-one Release Version
        !            51:  * 
        !            52:  * Revision 1.2  82/08/19  19:11:33  pavel
        !            53:  * Alpha Test Release One
        !            54:  * 
        !            55:  * Revision 1.1  82/08/12  18:45:33  pavel
        !            56:  * Initial revision
        !            57:  * 
        !            58:  *
        !            59:  */
        !            60: 
        !            61: #ifdef RCSHDR
        !            62: static char RCSid[] =
        !            63:        "$Header: /src386/usr/lib/ncurses/RCS/lib_tparm.c,v 1.8 93/04/12 14:14:30 bin Exp Locker: bin $";
        !            64: #endif
        !            65: 
        !            66: #include "curses.h"
        !            67: #include "curses.priv.h"
        !            68: #include "term.h"
        !            69: 
        !            70: 
        !            71: /*
        !            72:  *     char *
        !            73:  *     tparm(string, parms)
        !            74:  *
        !            75:  *     Substitute the given parameters into the given string by the following
        !            76:  *     rules (taken from terminfo(5)):
        !            77:  *
        !            78:  *          Cursor addressing and other strings  requiring  parame-
        !            79:  *     ters in the terminal are described by a parameterized string
        !            80:  *     capability, with like escapes %x in  it.   For  example,  to
        !            81:  *     address  the  cursor, the cup capability is given, using two
        !            82:  *     parameters: the row and column to  address  to.   (Rows  and
        !            83:  *     columns  are  numbered  from  zero and refer to the physical
        !            84:  *     screen visible to the user, not to any  unseen  memory.)  If
        !            85:  *     the terminal has memory relative cursor addressing, that can
        !            86:  *     be indicated by
        !            87:  *     
        !            88:  *          The parameter mechanism uses  a  stack  and  special  %
        !            89:  *     codes  to manipulate it.  Typically a sequence will push one
        !            90:  *     of the parameters onto the stack and then print it  in  some
        !            91:  *     format.  Often more complex operations are necessary.
        !            92:  *     
        !            93:  *          The % encodings have the following meanings:
        !            94:  *     
        !            95:  *          %%        outputs `%'
        !            96:  *          %d        print pop() like %d in printf()
        !            97:  *          %2d       print pop() like %2d in printf()
        !            98:  *          %02d      print pop() like %02d in printf()
        !            99:  *          %3d       print pop() like %3d in printf()
        !           100:  *          %03d      print pop() like %03d in printf()
        !           101:  *          %c        print pop() like %c in printf()
        !           102:  *          %s        print pop() like %s in printf()
        !           103:  *     
        !           104:  *          %p[1-9]   push ith parm
        !           105:  *          %P[a-z]   set variable [a-z] to pop()
        !           106:  *          %g[a-z]   get variable [a-z] and push it
        !           107:  *          %'c'      push char constant c
        !           108:  *          %{nn}     push integer constant nn
        !           109:  *     
        !           110:  *          %+ %- %* %/ %m
        !           111:  *                    arithmetic (%m is mod): push(pop() op pop())
        !           112:  *          %& %| %^  bit operations: push(pop() op pop())
        !           113:  *          %= %> %<  logical operations: push(pop() op pop())
        !           114:  *          %! %~     unary operations push(op pop())
        !           115:  *          %i        add 1 to first two parms (for ANSI terminals)
        !           116:  *     
        !           117:  *          %? expr %t thenpart %e elsepart %;
        !           118:  *                    if-then-else, %e elsepart is optional.
        !           119:  *                    else-if's are possible ala Algol 68:
        !           120:  *                    %? c1 %t b1 %e c2 %t b2 %e c3 %t b3 %e c4 %t b4 %e b5 %;
        !           121:  *     
        !           122:  *     For those of the above operators which are binary and not commutative,
        !           123:  *     the stack works in the usual way, with
        !           124:  *                     %gx %gy %m
        !           125:  *     resulting in x mod y, not the reverse.
        !           126:  */
        !           127: 
        !           128: #define STACKSIZE      20
        !           129: 
        !           130: #define npush(x)    if (stack_ptr < STACKSIZE) {stack[stack_ptr].num = x;\
        !           131:                                                 stack_ptr++;\
        !           132:                                                }
        !           133: #define npop()     (stack_ptr > 0  ?  stack[--stack_ptr].num  :  0)
        !           134: #define spop()     (stack_ptr > 0  ?  stack[--stack_ptr].str  :  (char *) 0)
        !           135: 
        !           136: typedef union
        !           137: {
        !           138:        unsigned int    num;
        !           139:        char            *str;
        !           140: }              stack_frame;
        !           141: 
        !           142: stack_frame    stack[STACKSIZE];
        !           143: static int     stack_ptr;
        !           144: static char    buffer[256];
        !           145: static int     *param;
        !           146: static char    *bufptr;
        !           147: static int     variable[26];
        !           148: 
        !           149: static char    *do_tparm();
        !           150: 
        !           151: 
        !           152: char *
        !           153: tparm(string, parms)
        !           154: register char  *string;
        !           155: int            parms;
        !           156: {
        !           157:        char            *strcpy();
        !           158:        char            len;
        !           159:        int             number;
        !           160:        int             level;
        !           161:        register int    x, y;
        !           162: 
        !           163:        param = &parms;
        !           164: 
        !           165: #ifdef TRACE
        !           166:        if (_tracing)
        !           167:            _tracef("tparm(%s,%d,%d,%d,%d,%d,%d,%d,%d,%d) called",
        !           168:                        string, param[0], param[1], param[2], param[3],
        !           169:                        param[4], param[5], param[6], param[7], param[8]);
        !           170: #endif
        !           171: 
        !           172:        stack_ptr = 0;
        !           173:        bufptr = buffer;
        !           174: 
        !           175:        while (*string)
        !           176:        {
        !           177:            if (*string != '%')
        !           178:                *(bufptr++) = *string;
        !           179:            else
        !           180:            {
        !           181:                string++;
        !           182:                switch (*string)
        !           183:                {
        !           184:                    default:
        !           185:                        break;
        !           186: 
        !           187:                    case '%':
        !           188:                        *(bufptr++) = '%';
        !           189:                        break;
        !           190: 
        !           191:                    case 'd':
        !           192:                        sprintf(bufptr, "%d", npop());
        !           193:                        bufptr += strlen(bufptr);
        !           194:                        break;
        !           195: 
        !           196:                    case '0':
        !           197:                        string++;
        !           198:                        len = *string;
        !           199:                        if ((len == '2'  ||  len == '3')  &&  *++string == 'd')
        !           200:                        {
        !           201:                            if (len == '2')
        !           202:                                sprintf(bufptr, "%02d", npop());
        !           203:                            else
        !           204:                                sprintf(bufptr, "%03d", npop());
        !           205:                            
        !           206:                            bufptr += strlen(bufptr);
        !           207:                        }
        !           208:                        break;
        !           209: 
        !           210:                    case '2':
        !           211:                        string++;
        !           212:                        if (*string == 'd')
        !           213:                        {
        !           214:                            sprintf(bufptr, "%2d", npop());
        !           215:                            bufptr += strlen(bufptr);
        !           216:                        }
        !           217:                        break;
        !           218: 
        !           219:                    case '3':
        !           220:                        string++;
        !           221:                        if (*string == 'd')
        !           222:                        {
        !           223:                            sprintf(bufptr, "%3d", npop());
        !           224:                            bufptr += strlen(bufptr);
        !           225:                        }
        !           226:                        break;
        !           227: 
        !           228:                    case 'c':
        !           229:                        *(bufptr++) = (char) npop();
        !           230:                        break;
        !           231: 
        !           232:                    case 's':
        !           233:                        strcpy(bufptr, spop());
        !           234:                        bufptr += strlen(bufptr);
        !           235:                        break;
        !           236: 
        !           237:                    case 'p':
        !           238:                        string++;
        !           239:                        if (*string >= '1'  &&  *string <= '9')
        !           240:                            npush(param[*string - '1']);
        !           241:                        break;
        !           242: 
        !           243:                    case 'P':
        !           244:                        string++;
        !           245:                        if (*string >= 'a'  &&  *string <= 'z')
        !           246:                            variable[*string - 'a'] = npop();
        !           247:                        break;
        !           248: 
        !           249:                    case 'g':
        !           250:                        string++;
        !           251:                        if (*string >= 'a'  &&  *string <= 'z')
        !           252:                            npush(variable[*string - 'a']);
        !           253:                        break;
        !           254: 
        !           255:                    case '\'':
        !           256:                        string++;
        !           257:                        npush(*string);
        !           258:                        string++;
        !           259:                        break;
        !           260: 
        !           261:                    case '{':
        !           262:                        number = 0;
        !           263:                        string++;
        !           264:                        while (*string >= '0'  &&  *string <= '9')
        !           265:                        {
        !           266:                            number = number * 10 + *string - '0';
        !           267:                            string++;
        !           268:                        }
        !           269:                        npush(number);
        !           270:                        break;
        !           271: 
        !           272:                    case '+':
        !           273:                        y = npop();
        !           274:                        x = npop();
        !           275:                        npush(x + y);
        !           276:                        break;
        !           277: 
        !           278:                    case '-':
        !           279:                        y = npop();
        !           280:                        x = npop();
        !           281:                        npush(x - y);
        !           282:                        break;
        !           283: 
        !           284:                    case '*':
        !           285:                        y = npop();
        !           286:                        x = npop();
        !           287:                        npush(x * y);
        !           288:                        break;
        !           289: 
        !           290:                    case '/':
        !           291:                        y = npop();
        !           292:                        x = npop();
        !           293:                        npush(x / y);
        !           294:                        break;
        !           295: 
        !           296:                    case 'm':
        !           297:                        y = npop();
        !           298:                        x = npop();
        !           299:                        npush(x % y);
        !           300:                        break;
        !           301: 
        !           302:                    case '&':
        !           303:                        y = npop();
        !           304:                        x = npop();
        !           305:                        npush(x & y);
        !           306:                        break;
        !           307: 
        !           308:                    case '|':
        !           309:                        y = npop();
        !           310:                        x = npop();
        !           311:                        npush(x | y);
        !           312:                        break;
        !           313: 
        !           314:                    case '^':
        !           315:                        y = npop();
        !           316:                        x = npop();
        !           317:                        npush(x ^ y);
        !           318:                        break;
        !           319: 
        !           320:                    case '=':
        !           321:                        y = npop();
        !           322:                        x = npop();
        !           323:                        npush(x == y);
        !           324:                        break;
        !           325: 
        !           326:                    case '<':
        !           327:                        y = npop();
        !           328:                        x = npop();
        !           329:                        npush(x < y);
        !           330:                        break;
        !           331: 
        !           332:                    case '>':
        !           333:                        y = npop();
        !           334:                        x = npop();
        !           335:                        npush(x > y);
        !           336:                        break;
        !           337: 
        !           338:                    case '!':
        !           339:                        x = ! npop();
        !           340:                        npush(x);
        !           341:                        break;
        !           342: 
        !           343:                    case '~':
        !           344:                        x = ~ npop();
        !           345:                        npush(x);
        !           346:                        break;
        !           347: 
        !           348:                    case 'i':
        !           349:                        param[0]++;
        !           350:                        param[1]++;
        !           351:                        break;
        !           352: 
        !           353:                    case '?':
        !           354:                        break;
        !           355: 
        !           356:                    case 't':
        !           357:                        x = npop();
        !           358:                        if (x)
        !           359:                        {
        !           360:                            /* do nothing; keep executing */
        !           361:                        }
        !           362:                        else
        !           363:                        {
        !           364:                            /* scan forward for %e or %; at level zero */
        !           365:                                string++;
        !           366:                                level = 0;
        !           367:                                while (*string)
        !           368:                                {
        !           369:                                    if (*string == '%')
        !           370:                                    {
        !           371:                                        string++;
        !           372:                                        if (*string == '?')
        !           373:                                            level++;
        !           374:                                        else if (*string == ';')
        !           375:                                        {
        !           376:                                            if (level > 0)
        !           377:                                                level--;
        !           378:                                            else
        !           379:                                                break;
        !           380:                                        }
        !           381:                                        else if (*string == 'e'  && level == 0)
        !           382:                                            break;
        !           383:                                    }
        !           384: 
        !           385:                                    if (*string)
        !           386:                                        string++;
        !           387:                                }
        !           388:                        }
        !           389:                        break;
        !           390: 
        !           391:                    case 'e':
        !           392:                        /* scan forward for a %; at level zero */
        !           393:                            string++;
        !           394:                            level = 0;
        !           395:                            while (*string)
        !           396:                            {
        !           397:                                if (*string == '%')
        !           398:                                {
        !           399:                                    string++;
        !           400:                                    if (*string == '?')
        !           401:                                        level++;
        !           402:                                    else if (*string == ';')
        !           403:                                    {
        !           404:                                        if (level > 0)
        !           405:                                            level--;
        !           406:                                        else
        !           407:                                            break;
        !           408:                                    }
        !           409:                                }
        !           410: 
        !           411:                                if (*string)
        !           412:                                    string++;
        !           413:                            }
        !           414:                        break;
        !           415: 
        !           416:                    case ';':
        !           417:                        break;
        !           418: 
        !           419:                } /* endswitch (*string) */
        !           420:            } /* endelse (*string == '%') */
        !           421: 
        !           422:            if (*string == '\0')
        !           423:                break;
        !           424:            
        !           425:            string++;
        !           426:        } /* endwhile (*string) */
        !           427: 
        !           428:        *bufptr = '\0';
        !           429:        return(buffer);
        !           430: }
        !           431: 
        !           432: 
        !           433: /*
        !           434:  *     char *
        !           435:  *     tgoto(string, x, y)
        !           436:  *
        !           437:  *     Retained solely for upward compatibility.  Note the intentional
        !           438:  *     reversing of the last two arguments.
        !           439:  *
        !           440:  */
        !           441: 
        !           442: char *
        !           443: tgoto(string, x, y)
        !           444: char   *string;
        !           445: int    x, y;
        !           446: {
        !           447:        return(tparm(string, y, x));
        !           448: }

unix.superglobalmegacorp.com

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