Annotation of researchv9/jerq/src/lib/sys/pf.c, revision 1.1

1.1     ! root        1: #include <jerq.h>
        !             2: #include <kbd.h>
        !             3: #include <font.h>
        !             4: #include <setup.h>
        !             5: #include <pf.h>
        !             6: 
        !             7: #define xmax ((XMAX-2*XMARGIN)/CW-1)
        !             8: #define ymax ((YMAX-2*YMARGIN)/NS-3)
        !             9: 
        !            10: extern Point pt();
        !            11: extern Point cur;
        !            12: extern Rectangle rect();
        !            13: extern Rectangle Rect();
        !            14: 
        !            15: pfkey(keynum)
        !            16: int keynum;     /* pfkey number pressed */
        !            17: {
        !            18:        short edit, ins_mode;
        !            19:        int inchar;
        !            20:        char tempstr[2];
        !            21:        char pfstr[PFKEYLEN + 1];
        !            22:        Point savecur;
        !            23: 
        !            24:        savecur = cur;          /* save setup's cursor */
        !            25:        clear (Rect(0, ymax+1, xmax, ymax+3));  /* clear converts to points */
        !            26:        rectf(&display,rect(Rect(0,ymax+2,7,ymax+3)), F_XOR);
        !            27:        rectf(&display,rect(Rect(9,ymax+2,16,ymax+3)), F_XOR);
        !            28:        rectf(&display,rect(Rect(18,ymax+2,25,ymax+3)), F_XOR);
        !            29:        rectf(&display,rect(Rect(30,ymax+2,36,ymax+3)), F_XOR);
        !            30:        rectf(&display,rect(Rect(38,ymax+2,44,ymax+3)), F_XOR);
        !            31:        rectf(&display,rect(Rect(49,ymax+2,56,ymax+3)), F_XOR);
        !            32:        rectf(&display,rect(Rect(58,ymax+2,65,ymax+3)), F_XOR);
        !            33:        rectf(&display,rect(Rect(67,ymax+2,74,ymax+3)), F_XOR);
        !            34:        cur.x=0;
        !            35:        cur.y=ymax+2;
        !            36:        string (&defont, PFBOT_HEADINGS, &display, pt(cur), F_XOR);
        !            37: 
        !            38: 
        !            39: next_key:      /* label for goto (shudder) if user wants to change keys */
        !            40:        tempstr[0] = keynum + '0';
        !            41:        tempstr[1] = (char) 0;
        !            42:        keynum--;       /* adjust for storage, which starts with 0 */
        !            43: 
        !            44:        /*   Logic...
        !            45:           draw menu to screen
        !            46:           switch/wait on chars for fkeys 
        !            47:           ins/delete as necessary... keep one string
        !            48:           on exit update BRAM
        !            49:           pfkey is null terminated
        !            50:         */
        !            51:        clear (Rect(0, ymax+1, xmax, ymax+2));  /* clear converts to points */
        !            52: 
        !            53:        cur.x = 0;
        !            54:        cur.y = ymax + 1;
        !            55:        string (&defont, PFTOP_HEADINGS, &display, pt(cur), F_STORE);
        !            56:        cur.x = 1;
        !            57:        string (&defont, tempstr, &display, pt(cur), F_STORE);
        !            58:        cur.x=3;
        !            59:        bramgetstr ( keynum, pfstr, EDLEN(0) ); /* put pfkey into str "pfstr" */
        !            60:        displaystring (pfstr ,cur);     /* print string, display unprintables */
        !            61: 
        !            62:        /* Now the initial display is set:  wait for a char */
        !            63: 
        !            64:        ins_mode = edit = 0;       /* set to editting pf key, may implement labels later */
        !            65:        cur.x = PFMINPOS(edit); /* set cursor to start of pfkey def */
        !            66:        curse();
        !            67:        while(((inchar = kgetc()) == -1) || (inchar == (char) 0));      /* wait until we get a valid character */
        !            68:        while ((inchar  != PF_EXITKEY) && (inchar != SETUPKEY))
        !            69:        {
        !            70:                switch(inchar)
        !            71:                {
        !            72: /*            case PF_ED_KEY:
        !            73: /*              case PF_ED_LABEL:       /* Not implemented yet */
        !            74: /*                    if (edit == inchar-PF_ED_KEY)   /* turn off current edit mode */
        !            75: /*                             edit = NOT_EDITTING;
        !            76: /*                 else
        !            77: /*                 {
        !            78: /*                            if (edit != NOT_EDITTING) /* switch editmodes */
        !            79: /*                                     curse();        /* clean up old cursor*/
        !            80: /*                             edit = inchar - PF_ED_KEY;
        !            81: /*                           cur.x = PFMINPOS(edit);
        !            82: /*                      }
        !            83: /*                    curse();        /* clear/set cursor */
        !            84: /*                       break;                                  */
        !            85:                case PF_INSKEY:
        !            86:                        /*                       if (edit == NOT_EDITTING)
        !            87: /*                    {               /* not legal unless editting */
        !            88: /*                              ringbell();
        !            89: /*                          break;
        !            90: /*                       }                                               */
        !            91:                        /* reverse highlight insert char key */
        !            92:                        rectf(&display,inset(rect(Rect(0,ymax+2,7,ymax+3)),1), F_XOR);
        !            93:                        ins_mode = ~ins_mode;
        !            94:                        break;
        !            95:                case PF_DELKEY:
        !            96:                        if (strlen(pfstr) > 0)
        !            97:                        {
        !            98:                                if(strlen(pfstr) == EDPOS(edit,cur.x)) {
        !            99:                                        /* at end of string */
        !           100:                                        curse();
        !           101:                                        cur.x--;
        !           102:                                        curse();
        !           103:                                }
        !           104:                                else {
        !           105:                                        scroll(Rect(cur.x + 1, ymax+1,
        !           106:                                            PFMINPOS(edit) + strlen(pfstr), ymax+2),
        !           107:                                            Pt(cur.x, ymax+1),ymax+2);
        !           108:                                        strdelchar(pfstr,cur.x - PFMINPOS(edit));
        !           109:                                        if ((cur.x >= strlen(pfstr) + PFMINPOS(edit)) &&
        !           110:                                            (cur.x > PFMINPOS(edit)))
        !           111:                                                cur.x--;
        !           112:                                        curse();        /* restore creamed cursor */
        !           113:                                }
        !           114:                        }
        !           115:                        else
        !           116:                                ringbell();
        !           117:                        break;
        !           118:                case PF_NEXTKEY:
        !           119:                        bramputstr ( keynum, pfstr );   /* Store string into bram */
        !           120:                        keynum += 2;
        !           121:                        if (keynum > 8)
        !           122:                                keynum = 1;
        !           123:                        if(ins_mode) {
        !           124:                                /* reverse highlight insert char key */
        !           125:                                rectf(&display,inset(rect(Rect(0,ymax+2,7,ymax+3)),1), F_XOR);
        !           126:                        }
        !           127:                        goto next_key;  /* top of routine, load new pfkey */
        !           128:                case PF_LEFTKEY:
        !           129:                case 0xc4:      /* left-arrow */
        !           130:                        /*                        if (edit != NOT_EDITTING)  */
        !           131:                        if (cur.x > PFMINPOS(edit))
        !           132:                        {
        !           133:                                curse();
        !           134:                                cur.x--;
        !           135:                                curse();
        !           136:                        }
        !           137:                        break;
        !           138:                case PF_RIGHTKEY:
        !           139:                case 0xc3:      /* right-arrow */
        !           140:                        /* EDPOS returns the position within the
        !           141:                                   currently editted string that the cursor
        !           142:                                points at                            */
        !           143:                        /*                      if (edit != NOT_EDITTING)  */
        !           144:                        if (strlen(pfstr) >= EDPOS(edit, cur.x + 1))
        !           145:                        {
        !           146:                                curse();
        !           147:                                cur.x++;
        !           148:                                curse();
        !           149:                        }
        !           150:                        break;
        !           151:                case 0x88:      /* PF 7 */
        !           152:                case 0x89:      /* PF 8         */
        !           153:                        /*
        !           154:                        * Ignore these keys
        !           155:                        */
        !           156:                        break;
        !           157:                default:
        !           158:                        if( ins_mode )
        !           159:                                if( strlen(pfstr) >= EDLEN(edit) ) /* Can't insert */
        !           160:                                {               
        !           161:                                        ringbell(); 
        !           162:                                        break;  
        !           163:                                }
        !           164:                                else {
        !           165:                                        /* First make room on screen */
        !           166:                                        curse(); /* turn off old cursor */
        !           167:                                        scroll(Rect(cur.x, ymax+1,PFMINPOS(edit) + strlen(pfstr) + 1, ymax+2),
        !           168:                                            Pt(cur.x + 1, ymax+1),ymax+2);
        !           169:                                        curse(); /* turn it back on */
        !           170: 
        !           171:                                        /* Then update real string */
        !           172:                                        tempstr[0] = inchar;
        !           173:                                        ins_str(pfstr,tempstr,cur.x - PFMINPOS(edit));
        !           174:                                }
        !           175:                        else {  /* overstrike */
        !           176:                                if(EDPOS(edit,cur.x) >= EDLEN(edit)) {
        !           177:                                        /* can't insert any more */
        !           178:                                        ringbell();
        !           179:                                        break;
        !           180:                                }
        !           181:                                else {
        !           182:                                        /*
        !           183:                                        * see if we are adding characters to the end of the string
        !           184:                                        */
        !           185:                                        if((strlen(pfstr)  ) == EDPOS(edit,cur.x))
        !           186:                                                pfstr[EDPOS(edit,cur.x)+1 ] = (char) 0;
        !           187:                                        pfstr[EDPOS(edit,cur.x)] = inchar;
        !           188:                                        tempstr[0] = inchar;
        !           189:                                }
        !           190:                        }
        !           191:                        if( cur.x <= PFMAXPOS(edit) )
        !           192:                        {
        !           193:                                curse();
        !           194:                                displaystring(tempstr,cur);
        !           195:                                if(cur.x++ > PFMAXPOS(edit)) {
        !           196:                                        ringbell();
        !           197:                                        cur.x--;
        !           198:                                }
        !           199:                                curse();
        !           200:                        }
        !           201:                        break;
        !           202:                }
        !           203:                while(((inchar = kgetc()) == -1) || (inchar == (char) 0));      /* wait until we get a valid character */
        !           204:        }
        !           205:        bramputstr ( keynum, pfstr );   /* Store string into bram */
        !           206:        cur = savecur;  /* restore cursor */
        !           207:        return(inchar);
        !           208: }
        !           209: 
        !           210: 
        !           211: bramgetstr(keynum,str,maxlen)  /* get pfkey "keynum" from bram into "str" */
        !           212: int keynum;
        !           213: register char *str;
        !           214: int maxlen;  /* max length allowed for string */
        !           215: {
        !           216:        register int i = 0;
        !           217:        while ((*str++ = BRAM->pfkeys[keynum][i].byte) && (++i < maxlen));
        !           218:        *str = (char) 0;        /* guarantee null termination if full length */
        !           219: }
        !           220: 
        !           221: bramputstr(keynum,str) /* store string "str" into pfkey "keynum" in bram */
        !           222: int keynum;
        !           223: char *str;
        !           224: {
        !           225:        register int i = 0;
        !           226: 
        !           227:        while (BRAM->pfkeys[keynum][i++].byte = (unsigned char) (*str++));
        !           228: }
        !           229: 
        !           230: displaystring(str,cur)      /* print the real string with screen printable chars */
        !           231: char *str;
        !           232: Point cur;
        !           233: {
        !           234:        register char tmpc;
        !           235:        char overstrike[2];     /* string holding overstrike char */
        !           236:        char printstr[2];
        !           237: 
        !           238:        overstrike[0] = overstrike[1] =  printstr[1] = (char) 0;
        !           239: 
        !           240:        str--;          /* prepare for the loop */
        !           241:        while ((tmpc = *++str) != (char) NULL)
        !           242:        {
        !           243:                printstr[0] = tmpc;     /* printable char */
        !           244:                string(&defont, printstr, &display, pt(cur), F_STORE);
        !           245:                cur.x++;
        !           246:        }
        !           247: }
        !           248: 
        !           249: extern int kbdstatus;
        !           250: ringbell()
        !           251: {
        !           252:        kbdstatus |= TTY_ALARM;
        !           253:        DUART->b_data = kbdstatus; /* ding!!!*/
        !           254:        kbdstatus &= ~TTY_ALARM;
        !           255: }
        !           256: 
        !           257: strdelchar(str, pos)   /* delete char at position pos in string str */
        !           258: char *str;
        !           259: int pos;
        !           260: {
        !           261:        str = &(str[pos]);
        !           262:        while (*str++ != (char) NULL)
        !           263:                *(str - 1) = *str;
        !           264: }
        !           265: 
        !           266: ins_str(str,instr, pos)     /* insert instr into str at position pos */
        !           267: char *str, *instr;
        !           268: int pos;
        !           269: {
        !           270:        register int i, j;
        !           271: 
        !           272:        i = strlen(str) + 1;
        !           273:        j = strlen(instr);
        !           274:        while ( --i >= pos )    /* make room for new string */
        !           275:                str[i + j] = str[i];
        !           276: 
        !           277:        /* insert new string */
        !           278:        while ( j--)
        !           279:                str[++i] = *instr++;
        !           280: }

unix.superglobalmegacorp.com

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