Annotation of coherent/b/kernel/FWB2/cmd.c, revision 1.1

1.1     ! root        1: /*-----------------------------------------------------------------------------
        !             2:        Talking BIOS device driver for the AT&T PC6300.
        !             3:        Copyright (C) Karl Dahlke 1987
        !             4:        This software may be freely used and distributed
        !             5:        for any non-profit purpose.
        !             6:  *-----------------------------------------------------------------------------
        !             7:  */
        !             8: 
        !             9: /* cmd.c: interpret and execute talking commands */
        !            10: 
        !            11: #include "speech.h"
        !            12: 
        !            13: /* the available speech commands */
        !            14: struct SDCMD sdcmds[] = {
        !            15: {0,"",0,0,0,0,0,0}, /* 0 is not a function */
        !            16: /* 1: read characters */
        !            17: {"reed the preivious karecter","pchar",1,0,0,1,0,0},
        !            18: {"reed the current karecter","cchar",1,0,0,1,0,0},
        !            19: {"reed the next karecter","nchar",1,0,0,1,0,0},
        !            20: {"upper or lower case","case",1,0,0,0,0,0},
        !            21: {"reed the current karecter as a word","asword",1,0,0,1,0,0},
        !            22: {"preivious row","prow",1,0,0,1,0,0},
        !            23: {"next row","nrow",1,0,0,1,0,0},
        !            24: {"current cohllumm number","colnum",1,0,0,0,0,0},
        !            25: /* 9: read words */
        !            26: {"reed the preivious word","pword",1,0,1,0,0,0},
        !            27: {"reed the current word","cword",1,0,1,0,0,0},
        !            28: {"reed the next word","nword",1,0,1,0,0,0},
        !            29: /* 12: read lines */
        !            30: {"reed the preivious line","pline",1,1,0,0,0,0},
        !            31: {"reed the current line","cline",1,1,0,0,0,0},
        !            32: {"reed the next line","nline",1,1,0,0,0,0},
        !            33: {"reed the line after next","nline2",1,1,0,0,0,0},
        !            34: {"reed the last cohmpleit line","lcline",1,1,0,0,0,0},
        !            35: /* 17: cursor position */
        !            36: {"start of buffer","top",1,0,0,0,0,0},
        !            37: {"end of buffer","bottom",1,0,0,0,0,0},
        !            38: {"stop speaking","shutup",0,0,0,0,0,0},
        !            39: /* 20: modes */
        !            40: {"announce the function of the next key entered","explain",0,0,0,0,1,0},
        !            41: {"pass next karecter threw","bypass",0,0,0,0,1,0},
        !            42: {"reed one line at a time","oneline",0,0,0,0,0,0},
        !            43: {"toggle bighnary mode","toggle",0,0,0,0,1,0},
        !            44: /* 24: search, configure, bind */
        !            45: {"serch down","searchd",0,0,0,0,0,1},
        !            46: {"serch up","searchu",0,0,0,0,0,1},
        !            47: {"set volume level","volume",0,0,0,0,1,0},
        !            48: {"set speed","speed",0,0,0,0,1,0},
        !            49: {"key binding","bind",0,0,0,0,0,1},
        !            50: {"set pronounciation","setpro",0,0,0,0,0,1},
        !            51: {"clear all binary modes","clrmode",0,0,0,0,0,0},
        !            52: {"set macroe","setmac",0,0,0,0,0,1},
        !            53: {0,"",0,0,0,0,0,0}
        !            54: };
        !            55: 
        !            56: static int keycmd_on;
        !            57: 
        !            58: keycmd_start(session)
        !            59: {
        !            60: short istate;
        !            61: 
        !            62: if(!sdready(session)) return 0;
        !            63: 
        !            64: /* need not use the semaphore under coherent,
        !            65:  * code already synchronized. */
        !            66: #ifdef MSDOS
        !            67: istate = sphi();
        !            68: if(keycmd_on) { /* function running or deferred */
        !            69: spl(istate);
        !            70: return 0;
        !            71: }
        !            72: keycmd_on = 1;
        !            73: spl(istate);
        !            74: #endif
        !            75: 
        !            76: /* set up static state variables for the deferred speech function,
        !            77:  * according to the session */
        !            78: sdsession = session;
        !            79: sdc = sdcontrol[session];
        !            80: return 1;
        !            81: } /* keycmd_start */
        !            82: 
        !            83: keycmd_end() { keycmd_on = 0; }
        !            84: 
        !            85: /* translate an entered key into a talking command.
        !            86:  * return nonzero if the key represents a talking command. */
        !            87: transkey(key)
        !            88: short key;
        !            89: {
        !            90: short low;
        !            91: 
        !            92: low = key & 0xff;
        !            93: if(low > 26) return 0;
        !            94: 
        !            95: /* control or alt or function key */
        !            96: if(low == 0) low = key>>8;
        !            97: else low += 119;
        !            98: 
        !            99: return low;
        !           100: } /* transkey */
        !           101: 
        !           102: /* execute the talking command */
        !           103: keycmd(packed)
        !           104: short packed;
        !           105: {
        !           106: char cmd = packed & 0x7f;
        !           107: struct SDCMD *cmdp = &sdcmds[cmd];
        !           108: struct MULTIKEY *a = packed&0x80 ? &sdc->indata : &sdc->outdata;
        !           109: char *suptext = a->text;
        !           110: short support = a->support;
        !           111: short i, n;
        !           112: char asword, c;
        !           113: extern char *submlookup();
        !           114: 
        !           115: /* The following code is added to fix a bug.
        !           116:  * The bug occurs when the user issues many (read symbol) commands in sequence
        !           117:  * (e.g. holds down a repeat key to constantly read the next symbol).
        !           118:  * Reading a mixed token (containing digits and lettters) requires multiple
        !           119:  * "reads", during which onesym is set to 1.
        !           120:  * If another command comes in the middle, the last half of the symbol
        !           121:  * willl not be read.  Thus, "1a 2b 3c 4d" might be heard as "1 2 3 4".
        !           122:  * Just eat the command. */
        !           123: if(cmdp->rdsymb && sdc->onesymb) return;
        !           124: 
        !           125: if(support & 0xff) support &= 0xff;
        !           126: 
        !           127: if(packed&0x80 || cmdp->nonempty) {
        !           128: sdc->rdflag = sdc->onesymb = 0; /* stop all reading */
        !           129: /* now check for interrupted speech */
        !           130: if(draincheck()) {
        !           131: sdshutup();
        !           132: sdc->drain_lbolt = 0;
        !           133: }
        !           134: }
        !           135: 
        !           136: /* some comands are meaningless when the buffer is empty */
        !           137: if(cmdp->nonempty && bufempty()) goto error_bound;
        !           138: 
        !           139: /* perform the requested action */
        !           140: asword = 0;
        !           141: cursor_copy();
        !           142: 
        !           143: switch(cmd) {
        !           144: case 30: /* clear binary modes, go to a known state */
        !           145: sdc->buf_ok = 0;
        !           146: sdc->dev_ok = 0;
        !           147: sdc->ctrl_ok = 0;
        !           148: sdc->oneline = 0;
        !           149: if(!sdsession) sdnoises = sdtones = sdscreenmode = 0;
        !           150: break;
        !           151: 
        !           152: case 31: /* macro definition */
        !           153: asword = 1;
        !           154: case 28: /* key binding */
        !           155: c = keybind(suptext, asword);
        !           156: if(!sdsession) sdsound(c);
        !           157: break;
        !           158: 
        !           159: case 19: /* shutup, may be called via output characters */
        !           160: stopread();
        !           161: drainset(sdc);
        !           162: sdonoff(0);
        !           163: break;
        !           164: 
        !           165: case 29: /* set pronunciation */
        !           166: c = addword(suptext);
        !           167: if(!sdsession) sdsound(c);
        !           168: break;
        !           169: 
        !           170: case 22: /* toggle reading mode, one line, or to the end */
        !           171: sdonoff(sdc->oneline ^= 1);
        !           172: break;
        !           173: 
        !           174: case 21: /* enable bypass */
        !           175: (*sdc->dev_in)(support);
        !           176: break;
        !           177: 
        !           178: case 3: /* speak next character */
        !           179: if(incptr()) goto error_bound;
        !           180: break;
        !           181: 
        !           182: case 1: /* speak previous character */
        !           183: if(decptr()) goto error_bound;
        !           184: break;
        !           185: 
        !           186: case 5: /* speak word for the current character */
        !           187: asword = 1;
        !           188: case 2: /* speak current character */
        !           189: break;
        !           190: 
        !           191: case 17: /* move cursor to top of buffer */
        !           192: buftop();
        !           193: break;
        !           194: 
        !           195: case 18: /* mov cursor to bottom of buffer */
        !           196: bufbot();
        !           197: break;
        !           198: 
        !           199: case 12: /* read previous line */
        !           200: backnl();
        !           201: if(decptr()) goto error_bound;
        !           202: case 13: /* start reading at current line */
        !           203: break;
        !           204: 
        !           205: case 15: /* read line after next */
        !           206: if(nextnl()) goto error_bound;
        !           207: case 14: /* read next line */
        !           208: if(nextnl()) goto error_bound;
        !           209: break;
        !           210: 
        !           211: case 8: /* read column number */
        !           212: n = backnl();
        !           213: sdw[5] = 0;
        !           214: for(i=4; i>=0; --i) {
        !           215: sdw[i] = n%10 + '0';
        !           216: n /= 10;
        !           217: }
        !           218: for(i=0; i<4; ++i)
        !           219: if(sdw[i] != '0') break;
        !           220: memcpy(sdw, sdw+i, 5);
        !           221: sdtextw();
        !           222: break;
        !           223: 
        !           224: case 4: /* indicate case */
        !           225: c = getc();
        !           226: if(!islower(c|0x20)) goto error_bell;
        !           227: sdonoff(!(c&0x20));
        !           228: break;
        !           229: 
        !           230: case 11: /* speak next symbol */
        !           231: nextsym();
        !           232: do
        !           233: if(incptr()) goto error_bound;
        !           234: while(getc() == ' ');
        !           235: break;
        !           236: 
        !           237: case 10: /* speak current symbol */
        !           238: if(getc() == ' ')
        !           239: cmdp = &sdcmds[2]; /* just speak the character */
        !           240: break;
        !           241: 
        !           242: case 9: /* speak previous symbol */
        !           243: backsym();
        !           244: do { if(decptr()) goto error_bound; } while(getc() == ' ');
        !           245: break;
        !           246: 
        !           247: case 6: /* up a row */
        !           248: n = backnl();
        !           249: if(decptr()) goto error_bound;
        !           250: backnl();
        !           251: for(i=1; i<n; ++i) {
        !           252: if(getc() == '\r') goto error_bell;
        !           253: incptr();
        !           254: }
        !           255: break;
        !           256: 
        !           257: case 7: /* down a row */
        !           258: n = backnl();
        !           259: if(nextnl()) goto error_bound;
        !           260: for(i=1; i<n; ++i) {
        !           261: if(getc() == '\r') goto error_bell;
        !           262: if(incptr()) goto error_bound;
        !           263: }
        !           264: break;
        !           265: 
        !           266: case 16: /* read last complete line */
        !           267: bufbot_temp();
        !           268: backnl();
        !           269: while(!(c = decptr()))
        !           270: if(getc() != '\r')   break;
        !           271: if(c) incptr();
        !           272: break;
        !           273: 
        !           274: case 20: /* announce the function of the next key entered */
        !           275: /* translate support */
        !           276: i = transkey(support);
        !           277: if(!i) goto error_bell;
        !           278: n = sdc->keymap[i];
        !           279: if(n) sdtext(sdcmds[n].desc);
        !           280: else if(submlookup(sdsession*10, i))
        !           281: sdtext("macro set");
        !           282: else
        !           283: sdtext("no speech function");
        !           284: break;
        !           285: 
        !           286: case 23: /* binary mode */
        !           287: if(binmode(support)) goto error_bell;
        !           288: break;
        !           289: 
        !           290: case 24:
        !           291: case 25:
        !           292: if(*suptext)
        !           293: memcpy(a->lasttext, suptext, LINELEN);
        !           294: suptext = a->lasttext;
        !           295: if(!*suptext) goto error_bell;
        !           296: if(bufsearch(cmd-24, suptext)) goto error_bound;
        !           297: cursor_set();
        !           298: if(sdc->oneline) cmdp = &sdcmds[13];
        !           299: else sdtext("o k");
        !           300: break;
        !           301: 
        !           302: default:
        !           303: if(!sdsession) sdsound(3);
        !           304: error_bell:
        !           305: if(!sdsession) sdsound(3);
        !           306: return;
        !           307: 
        !           308: error_bound:
        !           309: if(!sdsession) sdsound(4);
        !           310: return;
        !           311: } /* end switch on function */
        !           312: 
        !           313: /* begin reading? */
        !           314: if(cmdp->rdline) {
        !           315: backnl();
        !           316: cursor_set();
        !           317: sdc->rdflag = 1;
        !           318: reading(0);
        !           319: return;
        !           320: }
        !           321: 
        !           322: if(cmdp->rdsymb) {
        !           323: backsym();
        !           324: cursor_set();
        !           325: sdc->onesymb = 1;
        !           326: reading(0);
        !           327: return;
        !           328: }
        !           329: 
        !           330: if(cmdp->rdchar)
        !           331: curchar(1, asword);
        !           332: } /* keycmd */
        !           333: 
        !           334: static binmode(c)
        !           335: char c;
        !           336: {
        !           337: char onoff = 0;
        !           338: 
        !           339: switch(c) {
        !           340: case 'a': /* audio feedback */
        !           341: if(sdsession) return 1;
        !           342: if(sdnoises^=1) onoff = 1;
        !           343: break;
        !           344: case 'e': /* empty buffer */
        !           345: if(sdscreenmode) return 1; /* always text in screen memory */
        !           346: bufclear();
        !           347: break;
        !           348: case 'n': /* notes for keys */
        !           349: if(sdsession) return 1;
        !           350: if(sdtones^=1) onoff = 1;
        !           351: break;
        !           352: case 's': /* screen memory */
        !           353: if(sdsession) return 1;
        !           354: if(sdscreenmode ^= 1) onoff = 1;
        !           355: break;
        !           356: case 'c': /* control characters */
        !           357: if(sdc->ctrl_ok^=1) onoff = 1;
        !           358: break;
        !           359: case '1': /* one-line mode */
        !           360: if(sdc->oneline^=1) onoff = 1;
        !           361: break;
        !           362: case 'b': /* buffered input */
        !           363: if(sdc->buf_ok^=1) onoff = 1;
        !           364: break;
        !           365: case 't': /* output tty */
        !           366: if(sdc->dev_ok^=1) onoff = 1;
        !           367: break;
        !           368: case 'O': /* override bad signals from the speech unit */
        !           369: if(sdsession) return 1;
        !           370: if(sdoverride^=1) onoff = 1;
        !           371: break;
        !           372: default: return 1;
        !           373: } /* end switch */
        !           374: 
        !           375: sdonoff(onoff);
        !           376: return 0;
        !           377: } /* binmode */
        !           378: 

unix.superglobalmegacorp.com

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