Annotation of coherent/g/usr/bin/vi/amitty.c, revision 1.1

1.1     ! root        1: /* amitty.c */
        !             2: 
        !             3: /*-
        !             4:  *     Mike Rieser                             Dale Rahn
        !             5:  *     2410 Happy Hollow Rd. Apt D-10          540 Vine St.
        !             6:  *     West Lafayette, IN 47906                West Lafayette, IN 47906
        !             7:  *     [email protected]           [email protected]
        !             8:  */
        !             9: 
        !            10: #include <stdio.h>
        !            11: #include <stdlib.h>
        !            12: #include <string.h>
        !            13: #include <exec/memory.h>
        !            14: #include <devices/conunit.h>
        !            15: #include <dos/dos.h>
        !            16: #include <clib/macros.h>
        !            17: #include <clib/exec_protos.h>
        !            18: #include <clib/dos_protos.h>
        !            19: 
        !            20: #if AZTEC_C
        !            21: #include <pragmas/exec_lib.h>
        !            22: #include <pragmas/dos_lib.h>
        !            23: #else
        !            24: #include <pragmas/exec.h>
        !            25: #include <pragmas/dos.h>
        !            26: #endif
        !            27: 
        !            28: #include "config.h"
        !            29: 
        !            30: /*-
        !            31:  * Defines for amigatty.
        !            32:  *
        !            33:  * Note: Amiga <CSI> Control Sequence Introducer is either:
        !            34:  * 0x9b or <ESC>[ == 0x1b 0x5b.
        !            35:  *
        !            36:  * The Amiga always responds with 0x9b.
        !            37:  *
        !            38:  * For you octal fans: 0x9b == \233, 0x1b == \033.
        !            39:  */
        !            40: #define CSI            '\233'
        !            41: #define TIME_FACTOR    (100000)/* convert 1/10 sec to microsecs */
        !            42: 
        !            43: /* Amiga Console Control Sequences */
        !            44: #define ENABLE_SCROLL  ((UBYTE *) "\233>1h")   /* Amiga default */
        !            45: #define DISABLE_SCROLL ((UBYTE *) "\233>1l")
        !            46: #define AUTOWRAP_ON    ((UBYTE *) "\233?7h")   /* Amiga default */
        !            47: #define AUTOWRAP_OFF   ((UBYTE *) "\233?7l")
        !            48: #define CURSOR_ON      ((UBYTE *) "\233 p")    /* Amiga default */
        !            49: #define CURSOR_OFF     ((UBYTE *) "\2330 p")
        !            50: 
        !            51: #define RAW_EVENTS_ON  ((UBYTE *) "\23312{")   /* Set Window Resize Reports */
        !            52: #define RAW_EVENTS_OFF ((UBYTE *) "\23312}")   /* Reset Window Resize Reports */
        !            53: 
        !            54: /* take out for compiling with elvis */
        !            55: 
        !            56: #ifndef ctrl
        !            57: #define        ctrl(ch)                ((ch)&037)
        !            58: #endif
        !            59: 
        !            60: /* Variables */
        !            61: static BPTR  fh = 0, inputFH, outputFH, oldinputFH, oldoutputFH;
        !            62: static UBYTE title[]= "RAW:0/0/999/999/Amiga Elvis 1.5/SIMPLE";
        !            63: static int   amigaterm = 0;
        !            64: 
        !            65: /* Function prototypes for amitty.c */
        !            66: void         amiopenwin(char *termtype);
        !            67: void         amiclosewin(void);
        !            68: void         ttysetup(void);
        !            69: void         ttyshutdown(void);
        !            70: int          ttywrite(char *buf, int len);
        !            71: int          ttyread(char *buf, int len, int time);
        !            72: int          CheckforSpecial(char *buf, long len);
        !            73: LONG         setRawCon(LONG toggle);
        !            74: LONG         sendpkt(struct MsgPort *pid, LONG action, LONG args[], LONG nargs);
        !            75: 
        !            76: /*
        !            77:  * amiopenwin - opens a window if we don't already have one.
        !            78:  */
        !            79: void
        !            80: amiopenwin(char *termtype)
        !            81: {
        !            82:     if (!IsInteractive(Input()))
        !            83:     {
        !            84:        /* open our own window in RAW mode */
        !            85:        if (isOldDOS() || (BPTR) 0 == (fh = Open(title, MODE_READWRITE)))
        !            86:        {
        !            87:            PutStr((UBYTE *) "Couldn't open RAW: window");
        !            88:            clean_exit(2);
        !            89:        } else
        !            90:        {
        !            91:            oldinputFH = SelectInput(fh);
        !            92:            oldoutputFH = SelectOutput(fh);
        !            93:        }
        !            94:     }
        !            95:     inputFH = Input();
        !            96:     outputFH = Output();
        !            97: 
        !            98:     if (!strcmp(termtype, TERMTYPE))
        !            99:     {
        !           100:        amigaterm = 1;
        !           101:        Write(outputFH, AUTOWRAP_OFF, sizeof(AUTOWRAP_OFF));
        !           102:     }
        !           103:     return;
        !           104: }
        !           105: 
        !           106: 
        !           107: /*
        !           108:  * amiclosewin - closes a window if we opened one.
        !           109:  */
        !           110: void
        !           111: amiclosewin()
        !           112: {
        !           113:     if (amigaterm)
        !           114:     {
        !           115:        Write(outputFH, AUTOWRAP_ON, sizeof(AUTOWRAP_ON));      /* Amiga default */
        !           116:     }
        !           117:     if (fh)
        !           118:     {                                  /* Close down the window */
        !           119:        SelectInput(oldinputFH);
        !           120:        SelectOutput(oldoutputFH);
        !           121:        Close(fh);
        !           122:     }
        !           123:     return;
        !           124: }
        !           125: 
        !           126: 
        !           127: /*
        !           128:  * ttysetup - console initalization routine for Amiga Computers.
        !           129:  * 
        !           130:  * Sets raw mode and enables resize notifications.
        !           131:  */
        !           132: void
        !           133: ttysetup()
        !           134: {
        !           135:     if (isOldDOS())
        !           136:     {
        !           137:        setRawCon(DOSTRUE);
        !           138:     } else
        !           139:     {
        !           140:        SetMode(inputFH, 1);            /* Enter RAW mode */
        !           141:     }
        !           142: 
        !           143:     if (amigaterm)
        !           144:     {
        !           145:        Write(outputFH, RAW_EVENTS_ON, sizeof(RAW_EVENTS_ON));
        !           146:     }
        !           147:     return;
        !           148: }
        !           149: 
        !           150: 
        !           151: /*
        !           152:  * ttyshutdown - console shutdown routine for Amiga Computers.
        !           153:  * 
        !           154:  * Resets raw mode and disables resize notifications.
        !           155:  */
        !           156: void
        !           157: ttyshutdown()
        !           158: {
        !           159:     if (amigaterm)
        !           160:     {
        !           161:        Write(outputFH, RAW_EVENTS_OFF, sizeof(RAW_EVENTS_OFF));
        !           162:     }
        !           163:     if (isOldDOS())
        !           164:     {
        !           165:        setRawCon(DOSFALSE);
        !           166:     } else
        !           167:     {
        !           168:        SetMode(inputFH, 0);            /* Leave RAW mode */
        !           169:     }
        !           170: 
        !           171:     return;
        !           172: }
        !           173: 
        !           174: 
        !           175: /*
        !           176:  * ttywrite - amiga version of ttywrite.
        !           177:  * 
        !           178:  * This version makes small writes to the console as suggested in the RKM.
        !           179:  * Also turns off the cursor to speed output to the screen.
        !           180:  */
        !           181: int
        !           182: ttywrite(buf, len)
        !           183:     char        *buf;
        !           184:     int          len;
        !           185: {
        !           186:     int                    cursor_off;
        !           187:     register int    bytes;
        !           188:     register UBYTE *pc = (UBYTE *) buf;
        !           189: 
        !           190:     /* See if turning off the cursor is worthwhile */
        !           191:     if (cursor_off = amigaterm && len > 2 * sizeof(CURSOR_OFF))
        !           192:     {
        !           193:        Write(outputFH, CURSOR_OFF, sizeof(CURSOR_OFF));        /* Turn Cursor OFF */
        !           194:     }
        !           195: 
        !           196:     /* The console.device doesn't like large writes */
        !           197:     for (bytes = 0; len; pc += bytes, len -= bytes)
        !           198:     {
        !           199:        bytes = Write(outputFH, pc, MIN((LONG) len, 256L));
        !           200:     }
        !           201: 
        !           202:     if (cursor_off)
        !           203:     {
        !           204:        Write(outputFH, CURSOR_ON, sizeof(CURSOR_ON));  /* Turn Cursor ON */
        !           205:     }
        !           206:     return pc - buf;
        !           207: }
        !           208: 
        !           209: 
        !           210: /*
        !           211:  * ttyread - amiga version of ttyread.
        !           212:  */
        !           213: int
        !           214: ttyread(buf, len, time)
        !           215:     char        *buf;          /* where to store the gotten characters */
        !           216:     int          len;          /* maximum number of characters to read */
        !           217:     int          time;         /* maximum time in 1/10 sec for reading */
        !           218: {
        !           219:     LONG         bytes = 0;    /* number of bytes actually read */
        !           220: 
        !           221:     if (!time || WaitForChar(inputFH, time * TIME_FACTOR))
        !           222:     {                                  /* Read() if time == 0 or chars waiting */
        !           223:        bytes = Read(inputFH, (UBYTE *) buf, (LONG) len);
        !           224:        bytes = CheckforSpecial(buf, bytes);
        !           225:     }
        !           226:     return bytes;                      /* the number of bytes read in buf */
        !           227: }
        !           228: 
        !           229: 
        !           230: /*
        !           231:  * CheckforSpecial - crude parser for raw console events.
        !           232:  */
        !           233: int
        !           234: CheckforSpecial(buf, len)
        !           235:     char        *buf;
        !           236:     long         len;
        !           237: {
        !           238:     int          isnewsize = 0;
        !           239:     char        *pb, *peor, *pend;
        !           240: 
        !           241:     pb = buf;
        !           242:     pend = &buf[len];
        !           243:     do
        !           244:     {
        !           245:        if (CSI != *pb)
        !           246:            continue;
        !           247: 
        !           248:        if (WaitForChar(inputFH, 1))
        !           249:        {
        !           250:            pend += Read(inputFH, pend, 72);
        !           251:        }
        !           252:        if (peor = strchr((char *) pb, '|'))    /* Window Resize Event */
        !           253:        {                               /* bug == <CSI> seq <CSI> event '|' */
        !           254:            *pb = ctrl('L');            /* force redraw */
        !           255:            isnewsize = 1;
        !           256:            memmove(pb + 1, peor + 1, pend - peor);
        !           257:            pend -= peor - pb;
        !           258:        }
        !           259:     }
        !           260:     while (*pb++);
        !           261: 
        !           262:     if (isnewsize)
        !           263:        getsize(0);
        !           264: 
        !           265:     return pend - buf;
        !           266: }
        !           267: 
        !           268: 
        !           269: /* INDENT OFF */
        !           270: /* sendpkt code - A. Finkel, P. Lindsay, C. Scheppner  CBM */
        !           271: 
        !           272: LONG setRawCon(toggle)
        !           273: LONG toggle;     /* DOSTRUE (-1L)  or  DOSFALSE (0L) */
        !           274:    {
        !           275:    struct MsgPort *conid;
        !           276:    struct Process *me;
        !           277:    LONG myargs[8] ,nargs, res1;
        !           278: 
        !           279:    me = (struct Process *) FindTask(NULL);
        !           280:    conid = (struct MsgPort *) me->pr_ConsoleTask;
        !           281: 
        !           282:    myargs[0]= toggle;
        !           283:    nargs = 1;
        !           284:    res1 = (LONG)sendpkt(conid,ACTION_SCREEN_MODE,myargs,nargs);
        !           285:    return(res1);
        !           286:    }
        !           287: 
        !           288: 
        !           289: 
        !           290: LONG sendpkt(pid,action,args,nargs)
        !           291: struct MsgPort *pid;  /* process indentifier ... (handlers message port ) */
        !           292: LONG action,          /* packet type ... (what you want handler to do )   */
        !           293:      args[],          /* a pointer to a argument list */
        !           294:      nargs;           /* number of arguments in list  */
        !           295:    {
        !           296:    struct MsgPort        *replyport;
        !           297:    struct StandardPacket *packet;
        !           298:  
        !           299:    LONG  count, *pargs, res1;
        !           300: 
        !           301:    replyport = (struct MsgPort *) CreatePort(NULL,0);
        !           302:    if(!replyport) return((LONG)NULL);
        !           303: 
        !           304:    packet = (struct StandardPacket *) 
        !           305:       AllocMem((long)sizeof(struct StandardPacket),MEMF_PUBLIC|MEMF_CLEAR);
        !           306:    if(!packet) 
        !           307:       {
        !           308:       DeletePort(replyport);
        !           309:       return((LONG)NULL);
        !           310:       }
        !           311: 
        !           312:    packet->sp_Msg.mn_Node.ln_Name = (char *)&(packet->sp_Pkt);
        !           313:    packet->sp_Pkt.dp_Link         = &(packet->sp_Msg);
        !           314:    packet->sp_Pkt.dp_Port         = replyport;
        !           315:    packet->sp_Pkt.dp_Type         = action;
        !           316: 
        !           317:    /* copy the args into the packet */
        !           318:    pargs = &(packet->sp_Pkt.dp_Arg1);       /* address of first argument */
        !           319:    for(count=0;count < nargs;count++) 
        !           320:       pargs[count]=args[count];
        !           321:  
        !           322:    PutMsg(pid,(struct Message *)packet); /* send packet */
        !           323: 
        !           324:    WaitPort(replyport);
        !           325:    GetMsg(replyport); 
        !           326: 
        !           327:    res1 = packet->sp_Pkt.dp_Res1;
        !           328: 
        !           329:    FreeMem(packet,(long)sizeof(struct StandardPacket));
        !           330:    DeletePort(replyport); 
        !           331: 
        !           332:    return(res1);
        !           333:    }
        !           334:  

unix.superglobalmegacorp.com

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