Annotation of uae/src/od-dos/video/conio-ui.c, revision 1.1.1.1

1.1       root        1:  /*
                      2:   * UAE - The Un*x Amiga Emulator
                      3:   *
                      4:   * conio frontend for a text-based user interface.
                      5:   *
                      6:   * Copyright 1996 Tim Gunn, Gustavo Goedert
                      7:   */
                      8: 
                      9: #include "sysconfig.h"
                     10: #include "sysdeps.h"
                     11: 
                     12: #include <conio.h>
                     13: #include <ctype.h>
                     14: #include <crt0.h>
                     15: 
                     16: #include "config.h"
                     17: #include "options.h"
                     18: #include "uae.h"
                     19: #include "tui.h"
                     20: 
                     21: void save_state(void);
                     22: void drawbox(int,int,int,int);
                     23: int alphasort(const void *a, const void *b);
                     24: int scandir(const char *dir, struct dirent ***namelist);
                     25: 
                     26: #define TB textbackground
                     27: #define TC textcolor
                     28: #define CURSON _setcursortype(_NORMALCURSOR);
                     29: #define CURSOFF _setcursortype(_NOCURSOR);
                     30: #define SCRON _wscroll = 1;
                     31: #define SCROFF _wscroll = 0;
                     32: 
                     33: int SETTC=15; //standard text colour.
                     34: int SETTB=1;  //standard background color.
                     35: int SETHL=14; //text hilight.
                     36: 
                     37: typedef struct {
                     38:        int left;
                     39:        int top;
                     40:        int right;
                     41:        int bottom;
                     42:        char *memory;
                     43: } WINDOW;
                     44: 
                     45: static int currwin;
                     46: 
                     47: static WINDOW winstack[10]; /* more than enough */
                     48: static int winnr = 0;
                     49: 
                     50: void save_state(void) {
                     51:     int x1, y1, x2, y2;
                     52: 
                     53:     if (winstack[currwin].memory != NULL)
                     54:        free(winstack[currwin].memory);
                     55:     x1 = winstack[currwin].left;
                     56:     y1 = winstack[currwin].top;
                     57:     x2 = winstack[currwin].right;
                     58:     y2 = winstack[currwin].bottom;
                     59:     winstack[currwin].memory = malloc((x2-x1+1)*(y2-y1+1)*2);
                     60:     gettext(x1, y1, x2, y2, winstack[currwin].memory);
                     61: }
                     62: 
                     63: void tui_setup(void)
                     64: {
                     65:     int i;
                     66: 
                     67:     /* enable case on LFN systems (eg. win95) */
                     68:     if (_USE_LFN)
                     69:        _crt0_startup_flags = _CRT0_FLAG_PRESERVE_FILENAME_CASE;
                     70:     _set_screen_lines(50);
                     71:     SCROFF
                     72:     CURSOFF
                     73:     for (i = 0; i < 10; i++)
                     74:        winstack[i].memory = NULL;
                     75:     highvideo();
                     76:     TC(SETTC); TB(SETTB); clrscr();
                     77: 
                     78:     winstack[0].left = 1;
                     79:     winstack[0].top = 1;
                     80:     winstack[0].right = tui_cols();
                     81:     winstack[0].bottom = tui_lines();
                     82:     winstack[0].memory = malloc(tui_cols()*tui_lines()*2);
                     83:     gettext(1, 1, tui_cols(), tui_lines(), winstack[0].memory);
                     84:     window(1, 1, tui_cols(), tui_lines());
                     85:     currwin = 0;
                     86:     winnr = 1;
                     87: }
                     88: 
                     89: int tui_lines(void)
                     90: {
                     91:     return 50;
                     92: }
                     93: 
                     94: int tui_cols(void)
                     95: {
                     96:     return 80;
                     97: }
                     98: 
                     99: void tui_shutdown(void)
                    100: {
                    101:     int i;
                    102: 
                    103:     for (i = 0; i < 10; i++) {
                    104:        if (winstack[i].memory != NULL) {
                    105:            free(winstack[i].memory);
                    106:            winstack[i].memory = NULL;
                    107:        }
                    108:     }
                    109:     winnr = 0;
                    110:     normvideo();
                    111:     SCRON
                    112:     CURSON
                    113:     window(1, 1, tui_cols(), tui_lines());
                    114:     TC(LIGHTGRAY); TB(BLACK); clrscr();
                    115:     _set_screen_lines(25);
                    116: }
                    117: 
                    118: void tui_refresh(void)
                    119: {
                    120:     int i, x1, y1, x2, y2;
                    121: 
                    122:     for (i=0; i<=currwin; i++) {
                    123:        if (winstack[i].memory != NULL) {
                    124:            x1 = winstack[i].left;
                    125:            y1 = winstack[i].top;
                    126:            x2 = winstack[i].right;
                    127:            y2 = winstack[i].bottom;
                    128:            puttext(x1, y1, x2, y2, winstack[i].memory);
                    129:        }
                    130:     }
                    131: }
                    132: 
                    133: void tui_puts(const char *s)
                    134: {
                    135:     cputs(s);
                    136:     save_state();
                    137: }
                    138: 
                    139: void tui_cursoff(void)
                    140: {
                    141: }
                    142: 
                    143: void tui_curson(void)
                    144: {
                    145: }
                    146: 
                    147: void tui_putc(char c)
                    148: {
                    149:     putch(c);
                    150:     save_state();
                    151: }
                    152: 
                    153: void tui_cr(void)
                    154: {
                    155:     tui_puts("\r\n");
                    156:     save_state();
                    157: }
                    158: 
                    159: char tui_getc(void)
                    160: {
                    161:     return getch();
                    162: //    save_state();
                    163: }
                    164: 
                    165: void tui_gotoxy(int x, int y)
                    166: {
                    167:     gotoxy(x, y);
                    168: //    save_state();
                    169: }
                    170: 
                    171: void tui_selwin(int w)
                    172: {
                    173:     window(winstack[w].left, winstack[w].top, winstack[w].right, winstack[w].bottom);
                    174:     currwin = w;
                    175:     tui_refresh();
                    176: }
                    177: 
                    178: void tui_clrwin(int w)
                    179: {
                    180:     tui_selwin(w);
                    181:     clrscr();
                    182:     save_state();
                    183: }
                    184: 
                    185: void drawbox(int x, int y, int x2, int y2) {
                    186:     int i;
                    187:     clrscr();
                    188:     gotoxy(x,y); cprintf("�");
                    189:     for(i=0;i<x2-x-1;i++){ cprintf("�"); }
                    190:     cprintf("�");
                    191:     gotoxy(x,y2); cprintf("�");
                    192:     for(i=0;i<x2-x-1;i++){ cprintf("�"); }
                    193:     cprintf("�");
                    194:     for(i=y+1;i<y2;i++) {
                    195:        gotoxy(x,i); cprintf("�");
                    196:        gotoxy(x2,i); cprintf("�");
                    197:     }
                    198: }
                    199: 
                    200: void tui_drawbox(int w)
                    201: {
                    202:     tui_selwin(w);
                    203:     drawbox(1, 1, winstack[w].right-winstack[w].left+1, winstack[w].bottom-winstack[w].top+1);
                    204:     save_state();
                    205: }
                    206: 
                    207: void tui_hline(int x1, int y1, int x2)
                    208: {
                    209:     int i;
                    210:     gotoxy(x1,y1);
                    211:     for (i=x1; i<=x2; i++)
                    212:        putch('�');
                    213:     save_state();
                    214: }
                    215: 
                    216: int tui_dlog(int x1, int y1, int x2, int y2)
                    217: {
                    218:     winstack[winnr].left = x1;
                    219:     winstack[winnr].top = y1;
                    220:     winstack[winnr].right = x2;
                    221:     winstack[winnr].bottom = y2;
                    222:     window(x1, y1, x2, y2);
                    223:     currwin = winnr;
                    224:     return winnr++;
                    225: }
                    226: 
                    227: void tui_dlogdie(int w)
                    228: {
                    229:     tui_selwin(w);
                    230:     if (winstack[w].memory != NULL) {
                    231:        free(winstack[w].memory);
                    232:        winstack[w].memory = NULL;
                    233:     }
                    234:     winnr--;
                    235:     currwin = w-1;
                    236: }
                    237: 
                    238: int tui_gets(char *buf, int x, int y, int n)
                    239: {
                    240:     int i = 0;
                    241:     tui_gotoxy(x+1, y+1);
                    242:     CURSON
                    243:     for (;;) {
                    244:        int c = getch();
                    245:        int j;
                    246:        if (c == 13) {
                    247:            {
                    248:                char *tmp;
                    249: 
                    250:                while ((tmp = strchr(buf, '\\')))
                    251:                        *tmp = '/';
                    252:            }
                    253:            CURSOFF
                    254:            return 1;
                    255:        } else if (c == 27) {
                    256:            CURSOFF
                    257:            return 0;
                    258:        } else if (c == 8) {
                    259:            if (i>0)
                    260:                i--;
                    261:        } else if (i + 1 < n)
                    262:            buf[i++] = c;
                    263:        tui_gotoxy(x+1, y+1);
                    264:        for (j = 0; j < i; j++)
                    265:            tui_putc(buf[j]);
                    266:        for (; j < n; j++)
                    267:            tui_putc(' ');
                    268:        tui_gotoxy(x+i+1, y+1);
                    269:        buf[i] = 0;
                    270:     }
                    271: }
                    272: 
                    273: int tui_wgets(char *buf, const char *title, int n)
                    274: {
                    275:     int result;
                    276:     int l = strlen(title);
                    277:     int ww = l > n ? l : n;
                    278: //    int w = tui_dlog((tui_cols()-ww-2)/2, tui_lines()/2-1, (tui_cols()+ww+2)/2, tui_lines()/2+1);
                    279:     int w = tui_dlog((tui_cols()-ww-2)/2+1, tui_lines()/2-1, (tui_cols()+ww+2)/2, tui_lines()/2+1);
                    280:     tui_drawbox(w);
                    281:     tui_gotoxy((ww-l)/2+2, 1);
                    282:     tui_puts(title);
                    283:     result = tui_gets(buf, 1, 1, n);
                    284:     tui_dlogdie(w);
                    285:     return result;
                    286: }
                    287: 
                    288: 
                    289: int tui_menubrowse(struct bstring *menu, int xoff, int yoff, int selected, int XXX) //FIXME!!!
                    290: {
                    291:     int count = 0, maxsel = 0, maxw = 0;
                    292:     int i, j, w;
                    293: 
                    294:     const char *mtitle = NULL;
                    295: 
                    296:     for (i = 0; menu[i].val != -3; i++) {
                    297:        int tmp;
                    298:        if (menu[i].val != 0) {
                    299:            count++;
                    300:            if (menu[i].val != -2)
                    301:                maxsel++;
                    302:        } else
                    303:            mtitle = menu[i].data;
                    304:        if ((tmp = strlen(menu[i].data)) > maxw)
                    305:            maxw = tmp;
                    306:     }
                    307:     maxw += 3;
                    308:     w = tui_dlog(xoff, yoff, xoff+maxw, yoff+count+1);
                    309:     tui_selwin(w);
                    310:     tui_drawbox(w);
                    311:     if (mtitle != NULL) {
                    312:        tui_gotoxy(2, 1);
                    313:        tui_puts(mtitle);
                    314:     }
                    315: 
                    316:     for (;;) {
                    317:        int c;
                    318:        int s2;
                    319: 
                    320:        for (i = j = s2 = 0; i < count; i++, j++) {
                    321:            int k, x;
                    322:            int a = s2 == selected ? 1 : 0;
                    323: 
                    324:            while (menu[j].val == 0)
                    325:                j++;
                    326:            tui_gotoxy(2, 2+i);
                    327:            if (a) {
                    328:                TC(SETTB);
                    329:                TB(SETTC);
                    330:            }
                    331:            tui_putc(' ');
                    332:            for (k = x = 0; menu[j].data[k]; k++, x++) {
                    333:                int a2 = 0;
                    334:                c = menu[j].data[k];
                    335:                if (c == '_')
                    336:                    c = menu[j].data[++k], a2 = 1;
                    337:                tui_gotoxy(3+x, 2+i);
                    338:                if (a2)
                    339:                    TC(SETHL);
                    340:                tui_putc(c);
                    341:                if (a2) {
                    342:                    if (a)
                    343:                        TC(SETTB);
                    344:                    else
                    345:                        TC(SETTC);
                    346:                }
                    347:            }
                    348:            for (; x < maxw-2; x++) {
                    349:                tui_gotoxy(3+x, 2+i);
                    350:                tui_putc(' ');
                    351:            }
                    352:            if (a) {
                    353:                TC(SETTC);
                    354:                TB(SETTB);
                    355:            }
                    356:            if (menu[j].val != -1)
                    357:                s2++;
                    358:        }
                    359: 
                    360:        tui_refresh();
                    361:        c = getch();
                    362:        if (c == 27) {
                    363:            tui_dlogdie(w);
                    364:            return -1;
                    365:        } else if (c == 13 || c == ' ') {
                    366:            tui_dlogdie(w);
                    367:            return selected;
                    368:        } else if (c == 0) {
                    369:            c = getch();
                    370:            switch (c) {
                    371:                case 72:
                    372:                   if (selected > 0)
                    373:                       selected--;
                    374:                   break;
                    375:                case 80:
                    376:                   if (selected + 1 < count)
                    377:                       selected++;
                    378:                   break;
                    379:                case 73:
                    380:                   selected = 0;
                    381:                   break;
                    382:                case 81:
                    383:                   selected = count - 1;
                    384:                   break;
                    385:                default:
                    386:                   for (j = i = 0; menu[i].val != -3; i++)
                    387:                       if (menu[i].val == toupper(c)) {
                    388:                           tui_dlogdie(w);
                    389:                           return j;
                    390:                       } else if (menu[i].val == -1 || menu[i].val > 0) {
                    391:                           j++;
                    392:                   }
                    393: 
                    394:                   break;
                    395:            }
                    396:        } else {
                    397:            for (j = i = 0; menu[i].val != -3; i++)
                    398:                if (menu[i].val == toupper(c)) {
                    399:                    tui_dlogdie(w);
                    400:                    return j;
                    401:                } else if (menu[i].val == -1 || menu[i].val > 0) {
                    402:                    j++;
                    403:            }
                    404: 
                    405:        }
                    406:     }
                    407:     return -1; /* Can't get here */
                    408: }
                    409: 
                    410: void tui_errorbox(const char *err)
                    411: {
                    412:     const char *hak = "Hit any key";
                    413:     int n = strlen(hak);
                    414:     int l = strlen(err);
                    415:     int ww = (l > n ? l : n) + 2;
                    416:     int w = tui_dlog((tui_cols()-ww)/2, tui_lines()/2-1, (tui_cols()+ww)/2, tui_lines()/2+1);
                    417:     tui_selwin(w); tui_drawbox(w);
                    418: 
                    419:     tui_gotoxy((ww-6)/2+2, 1);
                    420:     tui_puts("Error!");
                    421:     tui_gotoxy((ww-l)/2+2, 2);
                    422:     tui_puts(err);
                    423:     tui_gotoxy((ww-n)/2+2, 3);
                    424:     tui_puts(hak);
                    425: 
                    426:     tui_refresh();
                    427:     for (;;) {
                    428:        int c = getch();
                    429:        if (c == 13)
                    430:            break;
                    431:     }
                    432:     tui_dlogdie(w);
                    433: }
                    434: 
                    435: static char *pattern;
                    436: static int maxlen;
                    437: 
                    438: static void put_filename(char *s, int x, int y, int HL)
                    439: {
                    440:     char buf[256];
                    441:     int i;
                    442: 
                    443:     tui_gotoxy(x,y);
                    444:     if (strcmp(s, ".") == 0)
                    445:        strcpy(buf, "(none)");
                    446:     else
                    447:        strcpy(buf, s);
                    448:     buf[maxlen] = 0;
                    449:     TC(SETHL);
                    450:     if (HL)
                    451:        TB(SETTC);
                    452:     for (i = 0; i < (int) strlen(buf); i++)
                    453:        tui_putc(buf[i]);
                    454:     for (; i < maxlen; i++)
                    455:        tui_putc(' ');
                    456:     TC(SETTC);
                    457:     if (HL)
                    458:        TB(SETTB);
                    459: }
                    460: 
                    461: static char fsbuf[256];
                    462: 
                    463: static int selectfn(const struct dirent *de)
                    464: {
                    465:     int l1, l2;
                    466: 
                    467: /*    l1 = strlen(pattern + 1);*/
                    468:     l2 = strlen(de->d_name);
                    469: 
                    470:     if (l2 >= tui_cols()-10) /* Restrict length of filenames so we won't mess up the display */
                    471:        return 0;
                    472: 
                    473:     /* No pattern matching for now. But we don't show hidden files. */
                    474:     if (strcmp(de->d_name, ".") != 0 && strcmp(de->d_name, "..") != 0
                    475:        && de->d_name[0] == '.')
                    476:        return 0;
                    477:     if (l2 > maxlen)
                    478:        maxlen = l2;
                    479:     return 1;
                    480: }
                    481: 
                    482: char *tui_filereq(char *s, char *oldfile, const char *title) //FIXME!!!
                    483: {
                    484:     char cwd[256];
                    485:     char *retval = fsbuf;
                    486:     char *tmp;
                    487:     int fin = 0;
                    488: //    chtype moresave[6][2];
                    489: 
                    490:     /* Save wd */
                    491:     if (getcwd(cwd, 256) == NULL)
                    492:        return NULL;
                    493: 
                    494:     /* Change into directory of old file */
                    495:     strcpy(fsbuf, oldfile);
                    496:     tmp = strrchr(fsbuf, '/');
                    497:     if (tmp != NULL) {
                    498:        *tmp = 0;
                    499:        if (strlen(fsbuf) > 0)
                    500:            chdir(fsbuf);
                    501:     }
                    502: 
                    503:     pattern = s;
                    504:     if (s[0] != '*')
                    505:        fprintf(stderr, "Can't handle wildcard %s\n", s);
                    506:     if (s[1] != 0 && strchr(s+1, '*') != NULL)
                    507:        fprintf(stderr, "Can't handle wildcard %s\n", s);
                    508:     for (;!fin;) {
                    509:        struct dirent **names;
                    510:        int i, w, n, l, yp, oldyp, s;
                    511: 
                    512:        maxlen = 0;
                    513:        n = scandir(".", &names);
                    514: 
                    515:        if (n <= 0)
                    516:            return NULL;
                    517:        if (title != NULL && strlen(title) + 6 > maxlen)
                    518:            maxlen = strlen(title) + 6;
                    519:        l = n;
                    520:        if (l > 40)
                    521:            l = 40;
                    522:        yp = s = 0; oldyp = -1;
                    523:        w = tui_dlog(tui_cols() - maxlen - 8, 5, tui_cols() - 5, 5 + l + 1);
                    524:        tui_selwin(w); tui_drawbox(w);
                    525: /*     if (title)
                    526:            mvwaddstr(currwin, 0, 2, title);
                    527:        for (i = 0; i < 6; i++) {
                    528:            moresave[i][0] = mvwinch(currwin, 0, maxlen-3+i);
                    529:            moresave[i][1] = mvwinch(currwin, l+1, maxlen-3+i);
                    530:        }*/
                    531:        for (;;) {
                    532:            int c;
                    533:            char tmp[256];
                    534:            while (s < yp)
                    535:                yp--;
                    536:            while (s >= yp + l)
                    537:                yp++;
                    538:            if (oldyp != yp) {
                    539:                oldyp = yp;
                    540:                for (i = 0; i < l; i++) {
                    541:                    put_filename(names[i + yp]->d_name, 3, 2 + i, 0);
                    542:                }
                    543:            }
                    544:            put_filename(names[s]->d_name, 3, 2 + s - yp, 1);
                    545: 
                    546: /*         if (yp == 0)
                    547:                for (i = 0; i < 6; i++)
                    548:                    mvwaddch(currwin, 0, maxlen-3+i, moresave[i][0]);
                    549:            else
                    550:                mvwaddstr(currwin, 0, maxlen-3, "(more)");
                    551:            if (yp + l == n)
                    552:                for (i = 0; i < 6; i++)
                    553:                    mvwaddch(currwin, l+1, maxlen-3+i, moresave[i][1]);
                    554:            else
                    555:                mvwaddstr(currwin, l+1, maxlen-3, "(more)");
                    556:            tui_refresh();*/
                    557:            c = getch();
                    558:            put_filename(names[s]->d_name, 3, 2 + s - yp, 0);
                    559:            if (c == 27) {
                    560:                retval = NULL; fin = 1;
                    561:                break;
                    562:            } else if (c == 13 || c == ' ') {
                    563:                int err;
                    564: 
                    565:                if (strcmp(names[s]->d_name, ".") == 0) {
                    566:                    fin = 1;
                    567:                    strcpy(fsbuf, "");
                    568:                    break;
                    569:                }
                    570:                err = chdir(names[s]->d_name);
                    571: 
                    572:                if (err == 0)
                    573:                    break;
                    574:                else /*if (errno == ENOTDIR)*/ {
                    575:                    fin = 1;
                    576:                    if (getcwd(fsbuf, 256) == NULL)
                    577:                        retval = NULL;
                    578:                    if (strlen(fsbuf) + strlen(names[s]->d_name) + 2 >= 256)
                    579:                        retval = NULL;
                    580:                    else {
                    581:                        strcat(fsbuf, "/");
                    582:                        strcat(fsbuf, names[s]->d_name);
                    583:                    }
                    584:                    break;
                    585:                } /* else what? */
                    586:            }
                    587:            if (c==0) {
                    588:                c = getch();
                    589:                switch (c) {
                    590:                 case 72:
                    591:                    if (s > 0)
                    592:                        s--;
                    593:                    break;
                    594:                 case 80:
                    595:                    if (s + 1 < n)
                    596:                        s++;
                    597:                    break;
                    598:                 case 73:
                    599:                    if (s > l)
                    600:                        s -= l;
                    601:                    else
                    602:                        s = 0;
                    603:                    break;
                    604:                 case 81:
                    605:                    if (s + l < n)
                    606:                        s += l;
                    607:                    else
                    608:                        s = n - 1;
                    609:                    break;
                    610:                }
                    611:            } else {
                    612:                for (i = 0; i < n; i++)
                    613:                    if (names[i]->d_name[0] == c) {
                    614:                        s = i;
                    615:                        break;
                    616:                    }
                    617:            }
                    618:        }
                    619: #if 0
                    620:        /* @@@ is this right? */
                    621:        for (i = 0; i < n; i++)
                    622:            free(names[i]->d_name);
                    623:        free(names);
                    624: #endif
                    625:        tui_dlogdie(w);
                    626:     }
                    627:     chdir(cwd);
                    628:     return retval;
                    629: }
                    630: 
                    631: int tui_backup_optionsfile(void)
                    632: {
                    633:     char tmp[257];
                    634:     char *ptr;
                    635:     if (access(optionsfile, 00) == 0)
                    636:        return 0;
                    637:     strcpy(tmp, optionsfile);
                    638:     ptr = strrchr(tmp, '.');
                    639:     if (ptr != NULL)
                    640:        *ptr = 0;
                    641:     strcat(tmp, ".bak");
                    642:     return rename(optionsfile, tmp);
                    643: }
                    644: 
                    645: int alphasort(const void *a, const void *b)
                    646: {
                    647:   return strcmp ((*((struct dirent **)a))->d_name, (*((struct dirent **)b))->d_name);
                    648: }
                    649: 
                    650: int scandir(const char *dir, struct dirent ***namelist)
                    651: {
                    652:   DIR *dp = opendir (dir);
                    653:   struct dirent **v = NULL;
                    654:   size_t vsize = 0, i;
                    655:   struct dirent *d;
                    656:   int save;
                    657: 
                    658:   if (dp == NULL)
                    659:     return -1;
                    660: 
                    661:   save = errno;
                    662:   errno = 0;
                    663: 
                    664:   i = 0;
                    665:   while ((d = readdir (dp)) != NULL)
                    666:     if (selectfn(d))
                    667:       {
                    668:        if (i == vsize)
                    669:          {
                    670:            struct dirent **new;
                    671:            if (vsize == 0)
                    672:              vsize = 10;
                    673:            else
                    674:              vsize *= 2;
                    675:            new = (struct dirent **) realloc (v, vsize * sizeof (*v));
                    676:            if (new == NULL)
                    677:              {
                    678:              lose:
                    679:                (void) closedir (dp);
                    680:                while (i > 0)
                    681:                  free (v[--i]);
                    682:                free (v);
                    683:                errno = ENOMEM;
                    684:                return -1;
                    685:              }
                    686:            v = new;
                    687:          }
                    688: 
                    689:        v[i] = (struct dirent *) malloc (sizeof (**v));
                    690:        if (v[i] == NULL)
                    691:          goto lose;
                    692: 
                    693:        *v[i++] = *d;
                    694:       }
                    695: 
                    696:   if (errno != 0)
                    697:     {
                    698:       save = errno;
                    699: 
                    700:       (void) closedir (dp);
                    701: 
                    702:       while (i > 0) free(v[--i]);
                    703:       free(v);
                    704: 
                    705:       errno = save;
                    706:       return -1;
                    707:     }
                    708: 
                    709:   (void) closedir (dp);
                    710:   errno = save;
                    711: 
                    712:   qsort (v, i, sizeof (*v), alphasort);
                    713:   *namelist = v;
                    714:   return i;
                    715: }

unix.superglobalmegacorp.com

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