Annotation of coherent/b/kernel/FWB/cursup.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: /* cursup.c: cursor support; should really be statics */
        !            10: 
        !            11: #include "speech.h"
        !            12: 
        !            13: #define NLINES 25 /* number of lines on the screen */
        !            14: 
        !            15: /* variables for screen memory reading, console only, need not be replicated */
        !            16: static short scrncur; /* screen memory cursor */
        !            17: static short temp_s; /* temp cursor into screen memory */
        !            18: static char *temp_b; /* temp cursor into internal buffer */
        !            19: int sdscreenmode;
        !            20: static char far *screenmem = (char far *) 0xb8000000;
        !            21: 
        !            22: /* get current character.
        !            23:  * assumes there is text in the circular buffer,
        !            24:  * hence the cursor actually points to a valid character.
        !            25:  * Grab the character from the circular buffer or from screen memory,
        !            26:  * depending on the value of the flag sdscreenmode.
        !            27:  * This and subsequent routines access the temp cursor.
        !            28:  * After a letter or word is read, the temp cursor
        !            29:  * is copied to the real cursor via cursor_set(). */
        !            30: getc()
        !            31: {
        !            32: if(sdscreenmode) {
        !            33: if(temp_s & 1) return '\r';
        !            34: return screenmem[temp_s];
        !            35: }
        !            36: return *(temp_b);
        !            37: } /* getc */
        !            38: 
        !            39: /* increment cursor */
        !            40: incptr()
        !            41: {
        !            42: if(sdscreenmode) {
        !            43: if(temp_s++ & 1) return temp_s == NLINES*80*2;
        !            44: if(temp_s % (80*2) != 80*2-1) ++temp_s;
        !            45: return 0;
        !            46: }
        !            47: if(++temp_b == sdc->buftop) temp_b = sdc->bufbot;
        !            48: return temp_b == sdc->bufhead;
        !            49: } /* incptr */
        !            50: 
        !            51: /* decrement cursor */
        !            52: decptr()
        !            53: {
        !            54: char *oldb;
        !            55: if(sdscreenmode) {
        !            56: if(temp_s-- & 1) return 0;
        !            57: if(temp_s < 0) return 1;
        !            58: if(temp_s % (80*2) != 80*2-1) --temp_s;
        !            59: return 0;
        !            60: }
        !            61: oldb = temp_b;
        !            62: if(oldb == sdc->bufbot) temp_b = sdc->buftop;
        !            63: --temp_b;
        !            64: return oldb == sdc->buftail;
        !            65: } /* decptr */
        !            66: 
        !            67: cursor_copy()
        !            68: {
        !            69: if(sdscreenmode) temp_s = scrncur;
        !            70: else temp_b = sdc->bufcur;
        !            71: } /* cursor_copy */
        !            72: 
        !            73: cursor_set()
        !            74: {
        !            75: if(sdscreenmode) scrncur = temp_s;
        !            76: else sdc->bufcur = temp_b;
        !            77: } /* cursor_set */
        !            78: 
        !            79: /* is buffer empty? */
        !            80: bufempty()
        !            81: {
        !            82: return !sdscreenmode && sdc->bufhead == sdc->buftail;
        !            83: } /* bufempty */
        !            84: 
        !            85: /* move cursor to the top of the buffer */
        !            86: buftop()
        !            87: {
        !            88: if(sdscreenmode) scrncur = 0;
        !            89: else sdc->bufcur = sdc->buftail;
        !            90: } /* buftop */
        !            91: 
        !            92: /* move cursor to the bottom of the buffer */
        !            93: bufbot()
        !            94: {
        !            95: if(sdscreenmode) scrncur = NLINES*80*2 - 1;
        !            96: else {
        !            97: temp_b = sdc->bufhead;
        !            98: decptr();
        !            99: sdc->bufcur = temp_b;
        !           100: }
        !           101: } /* bufbot */
        !           102: 
        !           103: /* move temp cursor to the bottom of the buffer */
        !           104: bufbot_temp()
        !           105: {
        !           106: if(sdscreenmode) temp_s = NLINES*80*2 - 2;
        !           107: else temp_b = sdc->bufhead;
        !           108: } /* bufbot_temp */
        !           109: 
        !           110: /* clear the buffer; do not call if sdscreenmode is set */
        !           111: bufclear()
        !           112: {
        !           113: sdc->bufhead = sdc->bufcur = sdc->buftail;
        !           114: } /* bufclear */
        !           115: 
        !           116: /* find cursor on screen; not yet used */
        !           117: static findcur()
        !           118: {
        !           119: register i;
        !           120: for(i=0; i<NLINES*80*2; i+=2)
        !           121: if(screenmem[i] == 0x20 && screenmem[i+1] == 15) { temp_s = i; return 0; }
        !           122: return 1;
        !           123: } /* findcur */
        !           124: 
        !           125: /* the previous routines manipulate a virtual reading cursor that lives within
        !           126:  * the circular buffer or screen memory, depending on the value of the flag
        !           127:  * sdscreenmode.  The following routines exploit the previous routines
        !           128:  * to move the cursor to the next word, last line, etc. */
        !           129: 
        !           130: /* back up cursor until new line is reached */
        !           131: backnl()
        !           132: {
        !           133: short count = 0;
        !           134: while(++count, !decptr())
        !           135: if(getc() == '\r') break;
        !           136: incptr();
        !           137: return count;
        !           138: } /* backnl */
        !           139: 
        !           140: /* advance cursor past newline */
        !           141: nextnl()
        !           142: {
        !           143: while(getc() != '\r')
        !           144: if(incptr()) return 1;
        !           145: return incptr();
        !           146: } /* nextnl */
        !           147: 
        !           148: /* back up cursor to the beginning of the current symbol */
        !           149: backsym()
        !           150: {
        !           151: if(!isalnum(getc())) return;
        !           152: do
        !           153: if(!isalnum(getc())) break;
        !           154: while(!decptr());
        !           155: incptr();
        !           156: } /* backsym */
        !           157: 
        !           158: /* advance cursor to the end of the current symbol */
        !           159: nextsym()
        !           160: {
        !           161: if(!isalnum(getc())) return;
        !           162: do
        !           163: if(!isalnum(getc())) break;
        !           164: while(!incptr());
        !           165: decptr();
        !           166: } /* nextsym */
        !           167: 
        !           168: /* search through the buffer for a string */
        !           169: bufsearch(updown, string)
        !           170: char updown; /* direction of search */
        !           171: char *string;
        !           172: {
        !           173: char fail;
        !           174: 
        !           175: if(sdc->oneline) {
        !           176: if(updown) {
        !           177: backnl();
        !           178: fail = decptr();
        !           179: } else fail = nextnl();
        !           180: } else fail = updown ? decptr() : incptr();
        !           181: if(fail) return 1;
        !           182: 
        !           183: do {
        !           184: if(getc() == *string) {
        !           185: if(wordmatch(string)) return 0; /* success */
        !           186: }
        !           187: fail = updown ? decptr() : incptr();
        !           188: } while(!fail);
        !           189: return 1;
        !           190: } /* bufsearch */
        !           191: 
        !           192: static wordmatch(s)
        !           193: char *s;
        !           194: {
        !           195: short count = 0;
        !           196: 
        !           197: if(!*++s) return 1;
        !           198: 
        !           199: while(!incptr()) {
        !           200: ++count; /* another advance */
        !           201: if(getc() != *s) break;
        !           202: if(!*++s) return 1;
        !           203: } /* while matches */
        !           204: 
        !           205: /* put the cursor back */
        !           206: while(count--)
        !           207: if(decptr()) break;
        !           208: return 0;
        !           209: } /* wordmatch */
        !           210: 
        !           211: #ifdef MSDOS
        !           212: strlen(s)
        !           213: char *s;
        !           214: {
        !           215: int i = 0;
        !           216: while(*s++) ++i;
        !           217: return i;
        !           218: } /* strlen */
        !           219: #endif
        !           220: 

unix.superglobalmegacorp.com

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