Annotation of 43BSD/contrib/X/xterm/util.c, revision 1.1.1.1

1.1       root        1: #include <X/mit-copyright.h>
                      2: 
                      3: /* Copyright    Massachusetts Institute of Technology    1984, 1985    */
                      4: 
                      5: /* util.c */
                      6: 
                      7: #ifndef lint
                      8: static char *rcsid_util_c = "$Header: util.c,v 10.11 86/04/28 15:05:29 jg Exp $";
                      9: #endif lint
                     10: 
                     11: #include <stdio.h>
                     12: #include <X/Xlib.h>
                     13: #include <errno.h>
                     14: #include <signal.h>
                     15: 
                     16: #include "ptyx.h"
                     17: 
                     18: extern errno;
                     19: extern debug;
                     20: #ifdef JUMPSCROLL
                     21: /*
                     22:  * These routines are used for the jump scroll feature
                     23:  */
                     24: FlushScroll(screen)
                     25: register Screen *screen;
                     26: {
                     27:        register int height = screen->bot_marg - screen->top_marg + 1;
                     28:        register int samount = screen->scroll_amt;
                     29:        register int ramount = screen->refresh_amt;
                     30:        register int scrolled = samount * screen->f_height;
                     31:        register int refreshed = ramount * screen->f_height;
                     32:        register int top = screen->top_marg * screen->f_height + screen->border;
                     33:        int rtop;
                     34: 
                     35:   if(samount > 0) {
                     36:     rtop = screen->bot_marg - ramount + 1;
                     37:   } else {
                     38:     rtop = screen->top_marg;
                     39:     top -= scrolled;
                     40:     ramount = -ramount;
                     41:     refreshed = -refreshed;
                     42:   }
                     43: 
                     44:   if (ramount != height) {
                     45: 
                     46:       if (screen->multiscroll && samount == 1 &&
                     47:          screen->top_marg == 0 && screen->bot_marg == screen->max_row) {
                     48:              if (screen->incopy < 0 && screen->scrolls == 0)
                     49:                      CopyWait (screen);
                     50:              screen->scrolls++;
                     51:       } else {
                     52:              if (screen->incopy)
                     53:                      CopyWait (screen);
                     54:              screen->incopy = -1;
                     55:       }
                     56: 
                     57:       XMoveArea (screen->window,
                     58:                 screen->border, top + scrolled, screen->border, top,
                     59:                 screen->width, height * screen->f_height - refreshed);
                     60:   }
                     61:   screen->scroll_amt = 0;
                     62:   screen->refresh_amt = 0;
                     63:   XTileSet (screen->window, screen->border,
                     64:            rtop * screen->f_height + screen->border,
                     65:            screen->width, refreshed, screen->bgndtile);
                     66:   ScrnRefresh(screen, rtop, 0, ramount, screen->max_col + 1);
                     67: }
                     68: 
                     69: AddToRefresh(screen)
                     70: register Screen *screen;
                     71: {
                     72:        register int amount = screen->refresh_amt;
                     73:        register int row = screen->cur_row;
                     74: 
                     75:        if(amount == 0)
                     76:                return(0);
                     77:        if(amount > 0) {
                     78:                register int bottom;
                     79: 
                     80:                if(row == (bottom = screen->bot_marg) - amount) {
                     81:                        screen->refresh_amt++;
                     82:                        return(1);
                     83:                }
                     84:                return(row >= bottom - amount + 1 && row <= bottom);
                     85:        } else {
                     86:                register int top;
                     87: 
                     88:                amount = -amount;
                     89:                if(row == (top = screen->top_marg) + amount) {
                     90:                        screen->refresh_amt--;
                     91:                        return(1);
                     92:                }
                     93:                return(row <= top + amount - 1 && row >= top);
                     94:        }
                     95: }
                     96: #endif JUMPSCROLL
                     97: 
                     98: /* 
                     99:  * scrolls the screen by amount lines, erases bottom, doesn't alter 
                    100:  * cursor position (i.e. cursor moves down amount relative to text).
                    101:  * All done within the scrolling region, of course. 
                    102:  * requires: amount > 0
                    103:  */
                    104: Scroll (screen, amount)
                    105: register Screen *screen;
                    106: register int amount;
                    107: {
                    108:        register int height = screen->bot_marg - screen->top_marg + 1;
                    109:        register int covered;
                    110:        register int border = screen->border;
                    111:        register int top = screen->top_marg * screen->f_height + border;
                    112: 
                    113:        if (amount > height)
                    114:                amount = height;
                    115: #ifdef JUMPSCROLL
                    116:     if(screen->jumpscroll) {
                    117:        if(screen->scroll_amt > 0) {
                    118:                if(screen->refresh_amt + amount > height)
                    119:                        FlushScroll(screen);
                    120:                screen->scroll_amt += amount;
                    121:                screen->refresh_amt += amount;
                    122:        } else {
                    123:                if(screen->scroll_amt < 0)
                    124:                        FlushScroll(screen);
                    125:                screen->scroll_amt = amount;
                    126:                screen->refresh_amt = amount;
                    127:        }
                    128:     } else {
                    129: #endif JUMPSCROLL
                    130: 
                    131:        if (amount == height) {
                    132:                ClearScreen(screen);
                    133:                return;
                    134:        }
                    135: 
                    136:        covered = amount * screen->f_height;
                    137: 
                    138:        if (screen->multiscroll
                    139:        && amount==1
                    140:        && screen->top_marg==0
                    141:        && screen->bot_marg==screen->max_row) {
                    142:                if (screen->incopy<0 && screen->scrolls==0)
                    143:                        CopyWait(screen);
                    144:                screen->scrolls++;
                    145:        } else {
                    146:                if (screen->incopy)
                    147:                        CopyWait(screen);
                    148:                screen->incopy = -1;
                    149:        }
                    150: 
                    151:        XMoveArea(screen->window, border, top + covered, border, top,
                    152:                screen->width, height * screen->f_height - covered);
                    153:        XTileSet(screen->window, border,
                    154:                (screen->bot_marg - amount + 1) * screen->f_height + border,
                    155:                screen->width, covered, screen->bgndtile);
                    156: #ifdef JUMPSCROLL
                    157:        }
                    158: #endif JUMPSCROLL
                    159: 
                    160:        ScrnDeleteLine(screen->buf, screen->bot_marg, screen->top_marg,
                    161:                        amount, screen->max_col + 1);
                    162: }
                    163: 
                    164: 
                    165: /*
                    166:  * Reverse scrolls the screen by amount lines, erases top, doesn't alter
                    167:  * cursor position (i.e. cursor moves up amount relative to text).
                    168:  * All done within the scrolling region, of course.
                    169:  * Requires: amount > 0
                    170:  */
                    171: RevScroll(screen, amount)
                    172: register Screen *screen;
                    173: register int amount;
                    174: {
                    175:        register int height = screen->bot_marg - screen->top_marg + 1;
                    176:        register int border = screen->border;
                    177:        register int top = screen->top_marg * screen->f_height + border;
                    178:        register int covered;
                    179: 
                    180:        amount = (amount < height) ? amount : height;
                    181: #ifdef JUMPSCROLL
                    182:     if(screen->jumpscroll) {
                    183:        if(screen->scroll_amt < 0) {
                    184:                if(-screen->refresh_amt + amount > height)
                    185:                        FlushScroll(screen);
                    186:                screen->scroll_amt -= amount;
                    187:                screen->refresh_amt -= amount;
                    188:        } else {
                    189:                if(screen->scroll_amt > 0)
                    190:                        FlushScroll(screen);
                    191:                screen->scroll_amt = -amount;
                    192:                screen->refresh_amt = -amount;
                    193:        }
                    194:     } else {
                    195: #endif JUMPSCROLL
                    196:        covered = amount * screen->f_height;
                    197: 
                    198:        if (screen->incopy)
                    199:                CopyWait (screen);
                    200:        screen->incopy = -1;
                    201: 
                    202:        XMoveArea (screen->window,
                    203:                border, top,
                    204:                border, top + covered,
                    205:                screen->width, height * screen->f_height - covered);
                    206:        XTileSet (screen->window,
                    207:                border, top,
                    208:                screen->width, covered,
                    209:                screen->bgndtile);
                    210: 
                    211: #ifdef JUMPSCROLL
                    212:        }
                    213: #endif JUMPSCROLL
                    214:        ScrnInsertLine (screen->buf, screen->bot_marg, screen->top_marg,
                    215:                        amount, screen->max_col + 1);
                    216: }
                    217: 
                    218: /*
                    219:  * If cursor not in scrolling region, returns.  Else,
                    220:  * inserts n blank lines at the cursor's position.  Lines above the
                    221:  * bottom margin are lost.
                    222:  */
                    223: InsertLine (screen, n)
                    224: register Screen *screen;
                    225: register int n;
                    226: {
                    227:        register int height;
                    228:        register int bottom = screen->bot_marg;
                    229: 
                    230:        if (screen->cur_row < screen->top_marg ||
                    231:            screen->cur_row > screen->bot_marg) return;
                    232:        
                    233:        if (screen->cur_row + n - 1 > bottom) n = bottom - screen->cur_row + 1;
                    234: #ifdef JUMPSCROLL
                    235:     if(screen->jumpscroll) {
                    236:        if(screen->scroll_amt <= 0&&screen->cur_row <= -screen->refresh_amt) {
                    237:                if(-screen->refresh_amt + n > height)
                    238:                        FlushScroll(screen);
                    239:                screen->scroll_amt -= n;
                    240:                screen->refresh_amt -= n;
                    241:        } else if(screen->scroll_amt)
                    242:                FlushScroll(screen);
                    243:     }
                    244:     if(!screen->scroll_amt) {
                    245: #endif JUMPSCROLL
                    246: 
                    247: 
                    248:        height = n * screen->f_height;
                    249: 
                    250:        screen->do_wrap = 0;
                    251: 
                    252:        if (screen->incopy)
                    253:                CopyWait (screen);
                    254:        screen->incopy = -1;
                    255: 
                    256:        /*
                    257:         * move stuff down.
                    258:         * clear hole.
                    259:         */
                    260:        XMoveArea(screen->window,
                    261:                     screen->border, CursorY (screen),
                    262:                     screen->border, CursorY (screen) + height,
                    263:                     screen->width,
                    264:                     (bottom + 1 - screen->cur_row - n) * screen->f_height);
                    265:        XTileSet(screen->window,
                    266:                screen->border, CursorY (screen),
                    267:                screen->width, height, screen->bgndtile);
                    268: 
                    269: #ifdef JUMPSCROLL
                    270:        }
                    271: #endif JUMPSCROLL
                    272:        /* adjust screen->buf */
                    273:        ScrnInsertLine(screen->buf, bottom, screen->cur_row, n,
                    274:                        screen->max_col + 1);
                    275: }
                    276: 
                    277: /*
                    278:  * If cursor not in scrolling region, returns.  Else, deletes n lines
                    279:  * at the cursor's position, lines added at bottom margin are blank.
                    280:  */
                    281: DeleteLine(screen, n)
                    282: register Screen *screen;
                    283: register int n;
                    284: {
                    285:        register int height;
                    286:        register int bottom = screen->bot_marg;
                    287: 
                    288:        if (screen->cur_row < screen->top_marg
                    289:        || screen->cur_row > screen->bot_marg)
                    290:                return;
                    291:        
                    292:        if (screen->cur_row + n - 1 > bottom)
                    293:                n = bottom - screen->cur_row + 1;
                    294: #ifdef JUMPSCROLL
                    295:     if(screen->jumpscroll) {
                    296:        if(screen->scroll_amt >= 0 && screen->cur_row == screen->top_marg) {
                    297:                if(screen->refresh_amt + n > height)
                    298:                        FlushScroll(screen);
                    299:                screen->scroll_amt += n;
                    300:                screen->refresh_amt += n;
                    301:        } else if(screen->scroll_amt)
                    302:                FlushScroll(screen);
                    303:     }
                    304:     if(!screen->scroll_amt) {
                    305: #endif JUMPSCROLL
                    306: 
                    307:        height = n * screen->f_height;
                    308:        screen->do_wrap = 0;
                    309: 
                    310:        if (screen->incopy)
                    311:                CopyWait(screen);
                    312:        screen->incopy = -1;
                    313: 
                    314:        /*
                    315:         * move stuff up.
                    316:         * clear bottom.
                    317:         */
                    318:        XMoveArea(screen->window,
                    319:                     screen->border, CursorY (screen) + height,
                    320:                     screen->border, CursorY (screen),
                    321:                     screen->width,
                    322:                     (bottom + 1 - screen->cur_row - n) * screen->f_height);
                    323:        XTileSet(screen->window,
                    324:                     screen->border,
                    325:                     (bottom + 1 - n) * screen->f_height + screen->border,
                    326:                     screen->width, height, screen->bgndtile);
                    327: 
                    328: #ifdef JUMPSCROLL
                    329:        }
                    330: #endif JUMPSCROLL
                    331:        /* adjust screen->buf */
                    332:        ScrnDeleteLine(screen->buf, bottom, screen->cur_row, n,
                    333:                        screen->max_col + 1);
                    334: }
                    335: 
                    336: /*
                    337:  * Insert n blanks at the cursor's position, no wraparound.
                    338:  */
                    339: InsertChar (screen, n)
                    340: register Screen *screen;
                    341: register int n;
                    342: {
                    343:        register int width = n * screen->f_width;
                    344: 
                    345: #ifdef JUMPSCROLL
                    346:     if(!AddToRefresh(screen)) {
                    347:        if(screen->scroll_amt)
                    348:                FlushScroll(screen);
                    349: #endif JUMPSCROLL
                    350: 
                    351:        screen->do_wrap = 0;
                    352: 
                    353:        if (screen->incopy)
                    354:                CopyWait (screen);
                    355:        screen->incopy = -1;
                    356: 
                    357:        XMoveArea(screen->window,
                    358:                     CursorX (screen), CursorY (screen),
                    359:                     CursorX (screen) + width, CursorY (screen),
                    360:                     screen->width - (screen->cur_col + n) * screen->f_width,
                    361:                     screen->f_height);
                    362:        XTileSet(screen->window,
                    363:                     CursorX (screen), CursorY (screen),
                    364:                     width, screen->f_height, screen->bgndtile);
                    365: 
                    366: #ifdef JUMPSCROLL
                    367:        }
                    368: #endif JUMPSCROLL
                    369:        /* adjust screen->buf */
                    370:        ScrnInsertChar(screen->buf, screen->cur_row, screen->cur_col, n,
                    371:                        screen->max_col + 1);
                    372: }
                    373: 
                    374: /*
                    375:  * Deletes n chars at the cursor's position, no wraparound.
                    376:  */
                    377: DeleteChar (screen, n)
                    378: register Screen *screen;
                    379: register int   n;
                    380: {
                    381:        register int width; 
                    382: 
                    383:        if (screen->cur_col + n > screen->max_col + 1)
                    384:                n = screen->max_col + 1 - screen->cur_col;
                    385: 
                    386: #ifdef JUMPSCROLL
                    387:     if(!AddToRefresh(screen)) {
                    388:        if(screen->scroll_amt)
                    389:                FlushScroll(screen);
                    390: #endif JUMPSCROLL
                    391: 
                    392:        width = n * screen->f_width;
                    393: 
                    394:        screen->do_wrap = 0;
                    395: 
                    396:        if (screen->incopy)
                    397:                CopyWait (screen);
                    398:        screen->incopy = -1;
                    399: 
                    400:        XMoveArea(screen->window,
                    401:                     CursorX (screen) + width, CursorY (screen),
                    402:                     CursorX (screen), CursorY (screen),
                    403:                     screen->width - (screen->cur_col + n) * screen->f_width,
                    404:                     screen->f_height);
                    405:        XTileSet (screen->window,
                    406:                     screen->border + screen->width - width, CursorY (screen),
                    407:                     width, screen->f_height, screen->bgndtile);
                    408: 
                    409: #ifdef JUMPSCROLL
                    410:        }
                    411: #endif JUMPSCROLL
                    412:        /* adjust screen->buf */
                    413:        ScrnDeleteChar (screen->buf, screen->cur_row, screen->cur_col, n,
                    414:                        screen->max_col + 1);
                    415: 
                    416: }
                    417: 
                    418: /*
                    419:  * Clear from cursor position to beginning of display, inclusive.
                    420:  */
                    421: ClearAbove (screen)
                    422: register Screen *screen;
                    423: {
                    424: #ifdef JUMPSCROLL
                    425:        if(screen->scroll_amt)
                    426:                FlushScroll(screen);
                    427: #endif JUMPSCROLL
                    428:        ClearLeft(screen);
                    429:        
                    430:        XTileSet(screen->window, screen->border, 0,
                    431:                screen->width, CursorY (screen), screen->bgndtile);
                    432:        ClearBufRows(screen, 0, screen->cur_row - 1);
                    433: }
                    434: 
                    435: /*
                    436:  * Clear from cursor position to end of display, inclusive.
                    437:  */
                    438: ClearBelow (screen)
                    439: register Screen *screen;
                    440: {
                    441:        register int sy = CursorY (screen) + screen->f_height;
                    442: 
                    443: #ifdef JUMPSCROLL
                    444:        if(screen->scroll_amt)
                    445:                FlushScroll(screen);
                    446: #endif JUMPSCROLL
                    447:        ClearRight(screen);
                    448:        XTileSet(screen->window, screen->border, sy,
                    449:             screen->width, screen->height - sy + screen->border, 
                    450:             screen->bgndtile);
                    451:        ClearBufRows(screen, screen->cur_row + 1, screen->max_row);
                    452: }
                    453: 
                    454: /* 
                    455:  * Clear last part of cursor's line, inclusive.
                    456:  */
                    457: ClearRight (screen)
                    458: register Screen *screen;
                    459: {
                    460:        screen->do_wrap = 0;
                    461: 
                    462: #ifdef JUMPSCROLL
                    463:     if(!AddToRefresh(screen)) {
                    464:        if(screen->scroll_amt)
                    465:                FlushScroll(screen);
                    466: #endif JUMPSCROLL
                    467:        XTileSet(screen->window,
                    468:             CursorX (screen), CursorY (screen),
                    469:             screen->width-screen->cur_col * screen->f_width,screen->f_height,
                    470:             screen->bgndtile);
                    471: #ifdef JUMPSCROLL
                    472:     }
                    473: #endif JUMPSCROLL
                    474:        bzero((char *)(screen->buf [screen->cur_row] + screen->cur_col),
                    475:               sizeof (short) * (screen->max_col - screen->cur_col + 1));
                    476: }
                    477: 
                    478: /*
                    479:  * Clear first part of cursor's line, inclusive.
                    480:  */
                    481: ClearLeft (screen)
                    482: register Screen *screen;
                    483: {
                    484:        screen->do_wrap = 0;
                    485: 
                    486: #ifdef JUMPSCROLL
                    487:     if(!AddToRefresh(screen)) {
                    488:        if(screen->scroll_amt)
                    489:                FlushScroll(screen);
                    490: #endif JUMPSCROLL
                    491: 
                    492:        XTileSet (screen->window,
                    493:             screen->border, CursorY (screen),
                    494:             (screen->cur_col + 1) * screen->f_width,
                    495:             screen->f_height, screen->bgndtile);
                    496: #ifdef JUMPSCROLL
                    497:     }
                    498: #endif JUMPSCROLL
                    499:        bzero ((char *)screen->buf [screen->cur_row],
                    500:                sizeof (short) * (screen->cur_col + 1));
                    501: }
                    502: 
                    503: /* 
                    504:  * Erase the cursor's line.
                    505:  */
                    506: ClearLine(screen)
                    507: register Screen *screen;
                    508: {
                    509:        screen->do_wrap = 0;
                    510: 
                    511: #ifdef JUMPSCROLL
                    512:     if(!AddToRefresh(screen)) {
                    513:        if(screen->scroll_amt)
                    514:                FlushScroll(screen);
                    515: #endif JUMPSCROLL
                    516:        XTileSet (screen->window,
                    517:             screen->border, CursorY (screen),
                    518:             screen->width, screen->f_height, screen->bgndtile);
                    519: #ifdef JUMPSCROLL
                    520:     }
                    521: #endif JUMPSCROLL
                    522:        bzero ((char *)screen->buf [screen->cur_row],
                    523:                sizeof (short) * (screen->max_col + 1));
                    524: }
                    525: 
                    526: ClearScreen(screen)
                    527: register Screen *screen;
                    528: {
                    529:        screen->do_wrap = 0;
                    530:        
                    531: #ifdef JUMPSCROLL
                    532:        if(screen->scroll_amt)
                    533:                FlushScroll(screen);
                    534: #endif JUMPSCROLL
                    535:        XClear(screen->window);
                    536:        ClearBufRows (screen, 0, screen->max_row);
                    537: }
                    538: 
                    539: CopyWait(screen)
                    540: register Screen *screen;
                    541: {
                    542:        XEvent reply;
                    543:        XEvent *rep = &reply;
                    544: 
                    545:        while (1) {
                    546:                XWindowEvent (screen->window, ExposeRegion|ExposeCopy, &reply);
                    547:                switch (reply.type) {
                    548:                case ExposeRegion:
                    549:                        if (((XExposeEvent *)rep)->detail == ExposeCopy &&
                    550:                            screen->incopy <= 0) {
                    551:                                screen->incopy = 1;
                    552:                                if (screen->scrolls > 0)
                    553:                                        screen->scrolls--;
                    554:                        }
                    555:                        HandleExposure (screen, &reply);
                    556:                        break;
                    557:                case ExposeCopy:
                    558:                        if (screen->incopy <= 0 && screen->scrolls > 0)
                    559:                                screen->scrolls--;
                    560:                        if (screen->scrolls == 0) {
                    561:                                screen->incopy = 0;
                    562:                                return;
                    563:                        }
                    564:                        screen->incopy = -1;
                    565:                        break;
                    566:                }
                    567:        }
                    568: }
                    569: /*
                    570:  * This routine handles exposure events
                    571:  */
                    572: HandleExposure (screen, reply)
                    573: register Screen *screen;
                    574: register XExposeEvent *reply;
                    575: {
                    576:        int toprow, leftcol, nrows, ncols;
                    577:        extern Terminal term;   /* kludge */
                    578:        XExposeRegionEvent event;
                    579: 
                    580:        toprow = (reply->y - screen->border) / screen->f_height;
                    581:        leftcol = (reply->x - screen->border) / screen->f_width;
                    582:        nrows = (reply->y + reply->height - 1 - screen->border) /
                    583:                        screen->f_height - toprow + 1;
                    584:        ncols = (reply->x + reply->width - 1 - screen->border) /
                    585:                        screen->f_width - leftcol + 1;
                    586:        toprow -= screen->scrolls;
                    587:        if (toprow < 0) {
                    588:                nrows += toprow;
                    589:                toprow = 0;
                    590:        }
                    591:        if (toprow + nrows - 1 > screen->max_row)
                    592:                nrows = screen->max_row - toprow + 1;
                    593:        if (leftcol + ncols - 1 > screen->max_col)
                    594:                ncols = screen->max_col - leftcol + 1;
                    595: 
                    596:        if (nrows > 0 && ncols > 0) {
                    597:                if (screen->TekEmu && reply->detail != ExposeCopy)
                    598:                        /* Clear to avoid possible dangling cursor */
                    599:                        XTileSet (screen->window,
                    600:                             leftcol * screen->f_width + screen->border,
                    601:                             toprow * screen->f_height + screen->border,
                    602:                             ncols * screen->f_width,
                    603:                             nrows * screen->f_height,
                    604:                             screen->bgndtile);
                    605:                ScrnRefresh (screen, toprow, leftcol, nrows, ncols);
                    606:                /* only do the tek refresh on the last refresh event */
                    607:                if (screen->TekEmu) {
                    608:                        XSync(0);       /* make sure they are all here */
                    609:                        if (XPending() != 0) {
                    610:                                XPeekEvent(&event);
                    611:                                if (event.type != ExposeRegion) {
                    612:                                        if (reply->detail != ExposeCopy)
                    613:                                                TekRefresh(&term);
                    614:                                }
                    615:                        }
                    616:                        else {
                    617:                                if (reply->detail != ExposeCopy)
                    618:                                        TekRefresh (&term);
                    619:                        }
                    620:                }
                    621:                if (screen->cur_row >= toprow &&
                    622:                    screen->cur_row < toprow + nrows &&
                    623:                    screen->cur_col >= leftcol &&
                    624:                    screen->cur_col < leftcol + ncols)
                    625:                        return (1);
                    626:        }
                    627:        return (0);
                    628: }
                    629: 
                    630: Panic(s, a)
                    631: char   *s;
                    632: {
                    633:        fprintf(stderr, "PANIC! ");
                    634:        fprintf(stderr, s, a);
                    635:        fprintf(stderr, "\r\n");
                    636:        fflush(stderr);
                    637: }
                    638: 
                    639: Error ()
                    640: {
                    641:        fprintf (stderr, "Error %d: ", errno);
                    642:        perror ("");
                    643:        Cleanup(66);
                    644: }
                    645: 
                    646: /*
                    647:  * cleanup by sending SIGHUP to client processes
                    648:  */
                    649: Cleanup (code)
                    650: int code;
                    651: {
                    652:        extern Terminal term;
                    653:        register Screen *screen;
                    654:        register long pgrp;
                    655:        screen = &term.screen;
                    656:        if (screen->pid > 1) {
                    657:                pgrp = getpgrp(screen->pid);
                    658:                if (pgrp > 1) killpg(pgrp, SIGHUP);
                    659:        }
                    660:        exit(code);
                    661: }
                    662: 
                    663: /*
                    664:  * sets the value of var to be arg in the Unix 4.2 BSD environment env.
                    665:  * Var should end with '=' (bindings are of the form "var=value").
                    666:  * This procedure assumes the memory for the first level of environ
                    667:  * was allocated using malloc.
                    668:  */
                    669: Setenv (var, value)
                    670: register char *var, *value;
                    671: {
                    672:        extern char **environ;
                    673:        register int index = 0;
                    674: 
                    675:        while (environ [index] != NULL) {
                    676:            if (strncmp (environ [index], var, strlen (var)) == 0) {
                    677:                /* found it */
                    678:                environ [index] = (char *) malloc (strlen (var) + strlen (value));
                    679:                strcpy (environ [index], var);
                    680:                strcat (environ [index], value);
                    681:                return;
                    682:            }
                    683:            index ++;
                    684:        }
                    685: 
                    686:        if (debug) printf ("expanding env\n");
                    687:        environ = (char **) realloc((char *)environ, sizeof(char *) * (index+2));
                    688:        if (environ == NULL) {
                    689:            fprintf (stderr, "Setenv: malloc out of memory\n");
                    690:            exit (1);
                    691:        }
                    692: 
                    693:        environ [index] = (char *) malloc (strlen (var) + strlen (value));
                    694:        strcpy (environ [index], var);
                    695:        strcat (environ [index], value);
                    696:        environ [++index] = NULL;
                    697: }
                    698: 
                    699: /*
                    700:  * returns a pointer to the first occurrence of s2 in s1,
                    701:  * or NULL if there are none.
                    702:  */
                    703: char *strindex (s1, s2)
                    704: register char  *s1, *s2;
                    705: {
                    706:        register char   *s3;
                    707:        char            *index();
                    708: 
                    709:        while ((s3=index(s1, *s2)) != NULL) {
                    710:                if (strncmp(s3, s2, strlen(s2)) == 0)
                    711:                        return (s3);
                    712:                s1 = ++s3;
                    713:        }
                    714:        return (NULL);
                    715: }

unix.superglobalmegacorp.com

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