Annotation of hatari/src/gui-sdl/dlgFileSelect.c, revision 1.1

1.1     ! root        1: /*
        !             2:   Hatari - dlgFileSelect.c
        !             3:  
        !             4:   This file is distributed under the GNU Public License, version 2 or at
        !             5:   your option any later version. Read the file gpl.txt for details.
        !             6:  
        !             7:   A file selection dialog for the graphical user interface for Hatari.
        !             8: */
        !             9: char DlgFileSelect_rcsid[] = "Hatari $Id: dlgFileSelect.c,v 1.6 2004/04/28 09:04:59 thothy Exp $";
        !            10: 
        !            11: #include <SDL.h>
        !            12: #include <sys/stat.h>
        !            13: #include <unistd.h>
        !            14: #include <dirent.h>
        !            15: 
        !            16: #include "main.h"
        !            17: #include "screen.h"
        !            18: #include "sdlgui.h"
        !            19: #include "file.h"
        !            20: #include "zip.h"
        !            21: 
        !            22: 
        !            23: #define SGFSDLG_FILENAME  5
        !            24: #define SGFSDLG_UPDIR     6
        !            25: #define SGFSDLG_ROOTDIR   7
        !            26: #define SGFSDLG_ENTRY1    10
        !            27: #define SGFSDLG_ENTRY16   25
        !            28: #define SGFSDLG_UP        26
        !            29: #define SGFSDLG_DOWN      27
        !            30: #define SGFSDLG_OKAY      28
        !            31: #define SGFSDLG_CANCEL    29
        !            32: 
        !            33: 
        !            34: #define DLGPATH_SIZE 62
        !            35: static char dlgpath[DLGPATH_SIZE+1];    /* Path name in the dialog */
        !            36: 
        !            37: #define DLGFNAME_SIZE 56
        !            38: static char dlgfname[DLGFNAME_SIZE+1];  /* Name of the selected file in the dialog */
        !            39: 
        !            40: #define DLGFILENAMES_SIZE 59
        !            41: static char dlgfilenames[16][DLGFILENAMES_SIZE+1];  /* Visible file names in the dialog */
        !            42: 
        !            43: /* The dialog data: */
        !            44: static SGOBJ fsdlg[] =
        !            45: {
        !            46:        { SGBOX, 0, 0, 0,0, 64,25, NULL },
        !            47:        { SGTEXT, 0, 0, 25,1, 13,1, "Choose a file" },
        !            48:        { SGTEXT, 0, 0, 1,2, 7,1, "Folder:" },
        !            49:        { SGTEXT, 0, 0, 1,3, DLGPATH_SIZE,1, dlgpath },
        !            50:        { SGTEXT, 0, 0, 1,4, 6,1, "File:" },
        !            51:        { SGTEXT, 0, 0, 7,4, DLGFNAME_SIZE,1, dlgfname },
        !            52:        { SGBUTTON, 0, 0, 55,1, 4,1, ".." },
        !            53:        { SGBUTTON, 0, 0, 60,1, 3,1, "/" },
        !            54:        { SGBOX, 0, 0, 1,6, 62,16, NULL },
        !            55:        { SGBOX, 0, 0, 62,7, 1,14, NULL },
        !            56:        { SGTEXT, SG_EXIT, 0, 2,6, DLGFILENAMES_SIZE,1, dlgfilenames[0] },
        !            57:        { SGTEXT, SG_EXIT, 0, 2,7, DLGFILENAMES_SIZE,1, dlgfilenames[1] },
        !            58:        { SGTEXT, SG_EXIT, 0, 2,8, DLGFILENAMES_SIZE,1, dlgfilenames[2] },
        !            59:        { SGTEXT, SG_EXIT, 0, 2,9, DLGFILENAMES_SIZE,1, dlgfilenames[3] },
        !            60:        { SGTEXT, SG_EXIT, 0, 2,10, DLGFILENAMES_SIZE,1, dlgfilenames[4] },
        !            61:        { SGTEXT, SG_EXIT, 0, 2,11, DLGFILENAMES_SIZE,1, dlgfilenames[5] },
        !            62:        { SGTEXT, SG_EXIT, 0, 2,12, DLGFILENAMES_SIZE,1, dlgfilenames[6] },
        !            63:        { SGTEXT, SG_EXIT, 0, 2,13, DLGFILENAMES_SIZE,1, dlgfilenames[7] },
        !            64:        { SGTEXT, SG_EXIT, 0, 2,14, DLGFILENAMES_SIZE,1, dlgfilenames[8] },
        !            65:        { SGTEXT, SG_EXIT, 0, 2,15, DLGFILENAMES_SIZE,1, dlgfilenames[9] },
        !            66:        { SGTEXT, SG_EXIT, 0, 2,16, DLGFILENAMES_SIZE,1, dlgfilenames[10] },
        !            67:        { SGTEXT, SG_EXIT, 0, 2,17, DLGFILENAMES_SIZE,1, dlgfilenames[11] },
        !            68:        { SGTEXT, SG_EXIT, 0, 2,18, DLGFILENAMES_SIZE,1, dlgfilenames[12] },
        !            69:        { SGTEXT, SG_EXIT, 0, 2,19, DLGFILENAMES_SIZE,1, dlgfilenames[13] },
        !            70:        { SGTEXT, SG_EXIT, 0, 2,20, DLGFILENAMES_SIZE,1, dlgfilenames[14] },
        !            71:        { SGTEXT, SG_EXIT, 0, 2,21, DLGFILENAMES_SIZE,1, dlgfilenames[15] },
        !            72:        { SGBUTTON, SG_TOUCHEXIT, 0, 62,6, 1,1, "\x01" },           /* Arrow up */
        !            73:        { SGBUTTON, SG_TOUCHEXIT, 0, 62,21, 1,1, "\x02" },          /* Arrow down */
        !            74:        { SGBUTTON, 0, 0, 14,23, 8,1, "Okay" },
        !            75:        { SGBUTTON, 0, 0, 34,23, 8,1, "Cancel" },
        !            76:        { -1, 0, 0, 0,0, 0,0, NULL }
        !            77: };
        !            78: 
        !            79: 
        !            80: 
        !            81: /*-----------------------------------------------------------------------*/
        !            82: /*
        !            83:   Update the file name strings in the dialog.
        !            84:   Returns FALSE if it failed, TRUE on success.
        !            85: */
        !            86: static int DlgFileSelect_RefreshEntries(struct dirent **files, char *path,
        !            87:                                         BOOL browsingzip, int entries, int ypos)
        !            88: {
        !            89:        int i;
        !            90:        char *tempstr = malloc(FILENAME_MAX);
        !            91: 
        !            92:        if (!tempstr)
        !            93:        {
        !            94:                perror("DlgFileSelect_RefreshEntries");
        !            95:                return FALSE;
        !            96:        }
        !            97: 
        !            98:        /* Copy entries to dialog: */
        !            99:        for(i=0; i<16; i++)
        !           100:        {
        !           101:                if( i+ypos < entries )
        !           102:                {
        !           103:                        struct stat filestat;
        !           104:                        /* Prepare entries: */
        !           105:                        strcpy(tempstr, "  ");
        !           106:                        strcat(tempstr, files[i+ypos]->d_name);
        !           107:                        File_ShrinkName(dlgfilenames[i], tempstr, DLGFILENAMES_SIZE);
        !           108:                        /* Mark folders: */
        !           109:                        strcpy(tempstr, path);
        !           110:                        strcat(tempstr, files[i+ypos]->d_name);
        !           111: 
        !           112:                        if( browsingzip )
        !           113:                        {
        !           114:                                if( tempstr[strlen(tempstr)-1] == '/'  )
        !           115:                                        dlgfilenames[i][0] = SGFOLDER;    /* Mark folders */
        !           116:                        }
        !           117:                        else
        !           118:                        {
        !           119:                                if( stat(tempstr, &filestat)==0 && S_ISDIR(filestat.st_mode) )
        !           120:                                        dlgfilenames[i][0] = SGFOLDER;    /* Mark folders */
        !           121:                                if (ZIP_FileNameIsZIP(tempstr) && browsingzip == FALSE)
        !           122:                                        dlgfilenames[i][0] = SGFOLDER;    /* Mark .ZIP archives as folders */
        !           123:                        }
        !           124:                }
        !           125:                else
        !           126:                        dlgfilenames[i][0] = 0;  /* Clear entry */
        !           127:        }
        !           128: 
        !           129:        free(tempstr);
        !           130:        return TRUE;
        !           131: }
        !           132: 
        !           133: 
        !           134: /*-----------------------------------------------------------------------*/
        !           135: /*
        !           136:   Show and process a file selection dialog.
        !           137:   Returns TRUE if the use selected "okay", FALSE if "cancel".
        !           138:   input: zip_path = pointer to buffer to contain file path within a selected
        !           139:   zip file, or NULL if browsing zip files is disallowed.
        !           140:   bAllowNew: TRUE if the user is allowed to insert new file names.
        !           141: */
        !           142: int SDLGui_FileSelect(char *path_and_name, char *zip_path, BOOL bAllowNew)
        !           143: {
        !           144:        int i,n;
        !           145:        int entries = 0;                    /* How many files are in the actual directory? */
        !           146:        int ypos = 0;
        !           147:        struct dirent **files = NULL;
        !           148:        char *pStringMem;
        !           149:        char *path, *fname;                 /* The actual file and path names */
        !           150:        BOOL reloaddir = TRUE;              /* Do we have to reload the directory file list? */
        !           151:        BOOL refreshentries = TRUE;         /* Do we have to update the file names in the dialog? */
        !           152:        int retbut;
        !           153:        int oldcursorstate;
        !           154:        int selection = -1;                 /* The actual selection, -1 if none selected */
        !           155:        char *zipfilename;                  /* Filename in zip file */
        !           156:        char *zipdir;
        !           157:        BOOL browsingzip = FALSE;           /* Are we browsing an archive? */
        !           158:        zip_dir *zipfiles = NULL;
        !           159: 
        !           160:        /* Allocate memory for the file and path name strings: */
        !           161:        pStringMem = malloc(4 * FILENAME_MAX);
        !           162:        path = pStringMem;
        !           163:        fname = pStringMem + FILENAME_MAX;
        !           164:        zipfilename = pStringMem + 2 * FILENAME_MAX;
        !           165:        zipdir = pStringMem + 3 * FILENAME_MAX;
        !           166: 
        !           167:        zipfilename[0] = 0;
        !           168: 
        !           169:        SDLGui_CenterDlg(fsdlg);
        !           170:        if (bAllowNew)
        !           171:        {
        !           172:                fsdlg[SGFSDLG_FILENAME].type = SGEDITFIELD;
        !           173:                fsdlg[SGFSDLG_FILENAME].flags |= SG_EXIT;
        !           174:        }
        !           175:        else
        !           176:        {
        !           177:                fsdlg[SGFSDLG_FILENAME].type = SGTEXT;
        !           178:                fsdlg[SGFSDLG_FILENAME].flags &= ~SG_EXIT;
        !           179:        }
        !           180: 
        !           181:        /* Prepare the path and filename variables */
        !           182:        File_splitpath(path_and_name, path, fname, NULL);
        !           183:        File_ShrinkName(dlgpath, path, DLGPATH_SIZE);
        !           184:        File_ShrinkName(dlgfname, fname, DLGFNAME_SIZE);
        !           185: 
        !           186:        /* Save old mouse cursor state and enable cursor anyway */
        !           187:        oldcursorstate = SDL_ShowCursor(SDL_QUERY);
        !           188:        if (oldcursorstate == SDL_DISABLE)
        !           189:                SDL_ShowCursor(SDL_ENABLE);
        !           190: 
        !           191:        do
        !           192:        {
        !           193:                if (reloaddir)
        !           194:                {
        !           195:                        if (strlen(path) >= FILENAME_MAX)
        !           196:                        {
        !           197:                                fprintf(stderr, "SDLGui_FileSelect: Path name too long!\n");
        !           198:                                free(pStringMem);
        !           199:                                return FALSE;
        !           200:                        }
        !           201: 
        !           202:                        /* Free old allocated memory: */
        !           203:                        if (files != NULL)
        !           204:                        {
        !           205:                                for(i=0; i<entries; i++)
        !           206:                                {
        !           207:                                        free(files[i]);
        !           208:                                }
        !           209:                                free(files);
        !           210:                                files = NULL;
        !           211:                        }
        !           212: 
        !           213:                        if (browsingzip)
        !           214:                        {
        !           215:                                files = ZIP_GetFilesDir(zipfiles, zipdir, &entries);
        !           216:                        }
        !           217:                        else
        !           218:                        {
        !           219:                                /* Load directory entries: */
        !           220:                                entries = scandir(path, &files, 0, alphasort);
        !           221:                        }
        !           222: 
        !           223:                        if (entries < 0)
        !           224:                        {
        !           225:                                fprintf(stderr, "SDLGui_FileSelect: Path not found.\n");
        !           226:                                free(pStringMem);
        !           227:                                return FALSE;
        !           228:                        }
        !           229: 
        !           230:                        reloaddir = FALSE;
        !           231:                        refreshentries = TRUE;
        !           232:                }/* reloaddir */
        !           233: 
        !           234:                /* Update the file name strings in the dialog? */
        !           235:                if (refreshentries)
        !           236:                {
        !           237:                        if (!DlgFileSelect_RefreshEntries(files, path, browsingzip, entries, ypos))
        !           238:                        {
        !           239:                                free(pStringMem);
        !           240:                                return FALSE;
        !           241:                        }
        !           242:                        refreshentries = FALSE;
        !           243:                }
        !           244: 
        !           245:                /* Show dialog: */
        !           246:                retbut = SDLGui_DoDialog(fsdlg);
        !           247: 
        !           248:                /* Has the user clicked on a file or folder? */
        !           249:                if( retbut>=SGFSDLG_ENTRY1 && retbut<=SGFSDLG_ENTRY16 && retbut-SGFSDLG_ENTRY1+ypos<entries)
        !           250:                {
        !           251:                        char *tempstr;
        !           252:                        struct stat filestat;
        !           253: 
        !           254:                        tempstr = malloc(FILENAME_MAX);
        !           255:                        if (!tempstr)
        !           256:                        {
        !           257:                                perror("Error while allocating temporary memory in SDLGui_FileSelect()");
        !           258:                                free(pStringMem);
        !           259:                                return FALSE;
        !           260:                        }
        !           261: 
        !           262:                        if( browsingzip == TRUE )
        !           263:                        {
        !           264:                                strcpy(tempstr, zipdir);
        !           265:                                strcat(tempstr, files[retbut-SGFSDLG_ENTRY1+ypos]->d_name);
        !           266:                                if(tempstr[strlen(tempstr)-1] == '/')
        !           267:                                {
        !           268:                                        /* handle the ../ directory */
        !           269:                                        if(strcmp(files[retbut-SGFSDLG_ENTRY1+ypos]->d_name, "../") == 0)
        !           270:                                        {
        !           271:                                                /* close the zip file */
        !           272:                                                if( strcmp(tempstr, "../") == 0 )
        !           273:                                                {
        !           274:                                                        reloaddir = refreshentries = TRUE;
        !           275:                                                        /* free zip file entries */
        !           276:                                                        ZIP_FreeZipDir(zipfiles);
        !           277:                                                        zipfiles = NULL;
        !           278:                                                        /* Copy the path name to the dialog */
        !           279:                                                        File_ShrinkName(dlgpath, path, DLGPATH_SIZE);
        !           280:                                                        browsingzip = FALSE;
        !           281:                                                }
        !           282:                                                else
        !           283:                                                {
        !           284:                                                        i=strlen(tempstr)-1;
        !           285:                                                        n=0;
        !           286:                                                        while(i > 0 && n < 3)
        !           287:                                                                if( tempstr[i--] == '/' )
        !           288:                                                                        n++;
        !           289:                                                        if(tempstr[i+1] == '/')
        !           290:                                                                tempstr[i+2] = '\0';
        !           291:                                                        else
        !           292:                                                                tempstr[0] = '\0';
        !           293: 
        !           294:                                                        strcpy(zipdir, tempstr);
        !           295:                                                        File_ShrinkName(dlgpath, zipdir, DLGPATH_SIZE);
        !           296:                                                }
        !           297:                                        }
        !           298:                                        else /* not the "../" directory */
        !           299:                                        {
        !           300:                                                strcpy(zipdir, tempstr);
        !           301:                                                File_ShrinkName(dlgpath, zipdir, DLGPATH_SIZE);
        !           302:                                        }
        !           303:                                        reloaddir = TRUE;
        !           304:                                        /* Copy the path name to the dialog */
        !           305:                                        selection = -1;                /* Remove old selection */
        !           306:                                        zipfilename[0] = '\0';
        !           307:                                        dlgfname[0] = 0;
        !           308:                                        ypos = 0;
        !           309: 
        !           310:                                }
        !           311:                                else
        !           312:                                {
        !           313:                                        /* Select a file in the zip */
        !           314:                                        selection = retbut-SGFSDLG_ENTRY1+ypos;
        !           315:                                        strcpy(zipfilename, files[selection]->d_name);
        !           316:                                        File_ShrinkName(dlgfname, zipfilename, DLGFNAME_SIZE);
        !           317:                                }
        !           318: 
        !           319:                        } /* if browsingzip */
        !           320:                        else
        !           321:                        {
        !           322:                                strcpy(tempstr, path);
        !           323:                                strcat(tempstr, files[retbut-SGFSDLG_ENTRY1+ypos]->d_name);
        !           324:                                if( stat(tempstr, &filestat)==0 && S_ISDIR(filestat.st_mode) )
        !           325:                                {
        !           326:                                        /* Set the new directory */
        !           327:                                        strcpy(path, tempstr);
        !           328:                                        if( strlen(path)>=3 )
        !           329:                                        {
        !           330:                                                if(path[strlen(path)-2]=='/' && path[strlen(path)-1]=='.')
        !           331:                                                        path[strlen(path)-2] = 0;  /* Strip a single dot at the end of the path name */
        !           332:                                                if(path[strlen(path)-3]=='/' && path[strlen(path)-2]=='.' && path[strlen(path)-1]=='.')
        !           333:                                                {
        !           334:                                                        /* Handle the ".." folder */
        !           335:                                                        char *ptr;
        !           336:                                                        if( strlen(path)==3 )
        !           337:                                                                path[1] = 0;
        !           338:                                                        else
        !           339:                                                        {
        !           340:                                                                path[strlen(path)-3] = 0;
        !           341:                                                                ptr = strrchr(path, '/');
        !           342:                                                                if(ptr)
        !           343:                                                                        *(ptr+1) = 0;
        !           344:                                                        }
        !           345:                                                }
        !           346:                                        }
        !           347:                                        File_AddSlashToEndFileName(path);
        !           348:                                        reloaddir = TRUE;
        !           349:                                        /* Copy the path name to the dialog */
        !           350:                                        File_ShrinkName(dlgpath, path, DLGPATH_SIZE);
        !           351:                                        selection = -1;                /* Remove old selection */
        !           352:                                        dlgfname[0] = 0;
        !           353:                                        ypos = 0;
        !           354:                                }
        !           355:                                else if (ZIP_FileNameIsZIP(tempstr) && zip_path != NULL)
        !           356:                                {
        !           357:                                        /* open a zip file */
        !           358:                                        zipfiles = ZIP_GetFiles(tempstr);
        !           359:                                        if( zipfiles != NULL && browsingzip == FALSE )
        !           360:                                        {
        !           361:                                                selection = retbut-SGFSDLG_ENTRY1+ypos;
        !           362:                                                strcpy(fname, files[selection]->d_name);
        !           363:                                                File_ShrinkName(dlgfname, fname, DLGFNAME_SIZE);
        !           364:                                                browsingzip=TRUE;
        !           365:                                                strcpy(zipdir, "");
        !           366:                                                File_ShrinkName(dlgpath, zipdir, DLGPATH_SIZE);
        !           367:                                                reloaddir = refreshentries = TRUE;
        !           368:                                                ypos = 0;
        !           369:                                        }
        !           370: 
        !           371:                                }
        !           372:                                else
        !           373:                                {
        !           374:                                        /* Select a file */
        !           375:                                        selection = retbut-SGFSDLG_ENTRY1+ypos;
        !           376:                                        strcpy(fname, files[selection]->d_name);
        !           377:                                        File_ShrinkName(dlgfname, fname, DLGFNAME_SIZE);
        !           378:                                }
        !           379: 
        !           380:                        } /* not browsingzip */
        !           381: 
        !           382:                        free(tempstr);
        !           383:                }
        !           384:                else    /* Has the user clicked on another button? */
        !           385:                {
        !           386:                        switch(retbut)
        !           387:                        {
        !           388:                        case SGFSDLG_UPDIR:                 /* Change path to parent directory */
        !           389: 
        !           390:                                if( browsingzip )
        !           391:                                {
        !           392:                                        /* close the zip file */
        !           393:                                        if( strcmp(zipdir, "") == 0 )
        !           394:                                        {
        !           395:                                                reloaddir = refreshentries = TRUE;
        !           396:                                                /* free zip file entries */
        !           397:                                                ZIP_FreeZipDir(zipfiles);
        !           398:                                                zipfiles = NULL;
        !           399:                                                /* Copy the path name to the dialog */
        !           400:                                                File_ShrinkName(dlgpath, path, DLGPATH_SIZE);
        !           401:                                                browsingzip = FALSE;
        !           402:                                                reloaddir = TRUE;
        !           403:                                                selection = -1;         /* Remove old selection */
        !           404:                                                fname[0] = 0;
        !           405:                                                dlgfname[0] = 0;
        !           406:                                                ypos = 0;
        !           407:                                        }
        !           408:                                        else
        !           409:                                        {
        !           410:                                                i=strlen(zipdir)-1;
        !           411:                                                n=0;
        !           412:                                                while(i > 0 && n < 2)
        !           413:                                                        if( zipdir[i--] == '/' )
        !           414:                                                                n++;
        !           415:                                                if(zipdir[i+1] == '/')
        !           416:                                                        zipdir[i+2] = '\0';
        !           417:                                                else
        !           418:                                                        zipdir[0] = '\0';
        !           419: 
        !           420:                                                File_ShrinkName(dlgpath, zipdir, DLGPATH_SIZE);
        !           421:                                                reloaddir = TRUE;
        !           422:                                                selection = -1;         /* Remove old selection */
        !           423:                                                zipfilename[0] = '\0';
        !           424:                                                dlgfname[0] = 0;
        !           425:                                                ypos = 0;
        !           426:                                        }
        !           427:                                }  /* not a zip file: */
        !           428:                                else if( strlen(path)>2 )
        !           429:                                {
        !           430:                                        char *ptr;
        !           431:                                        File_CleanFileName(path);
        !           432:                                        ptr = strrchr(path, '/');
        !           433:                                        if(ptr)
        !           434:                                                *(ptr+1) = 0;
        !           435:                                        File_AddSlashToEndFileName(path);
        !           436:                                        reloaddir = TRUE;
        !           437:                                        File_ShrinkName(dlgpath, path, DLGPATH_SIZE);  /* Copy the path name to the dialog */
        !           438:                                        selection = -1;             /* Remove old selection */
        !           439:                                        fname[0] = 0;
        !           440:                                        dlgfname[0] = 0;
        !           441:                                        ypos = 0;
        !           442:                                }
        !           443:                                break;
        !           444:                        case SGFSDLG_ROOTDIR:               /* Change to root directory */
        !           445:                                if( browsingzip )
        !           446:                                {
        !           447:                                        /* free zip file entries */
        !           448:                                        ZIP_FreeZipDir(zipfiles);
        !           449:                                        zipfiles = NULL;
        !           450:                                        browsingzip = FALSE;
        !           451:                                }
        !           452: 
        !           453:                                strcpy(path, "/");
        !           454:                                reloaddir = TRUE;
        !           455:                                strcpy(dlgpath, path);
        !           456:                                selection = -1;                 /* Remove old selection */
        !           457:                                fname[0] = 0;
        !           458:                                dlgfname[0] = 0;
        !           459:                                ypos = 0;
        !           460:                                break;
        !           461:                        case SGFSDLG_UP:                    /* Scroll up */
        !           462:                                if( ypos>0 )
        !           463:                                {
        !           464:                                        --ypos;
        !           465:                                        refreshentries = TRUE;
        !           466:                                }
        !           467:                                SDL_Delay(20);
        !           468:                                break;
        !           469:                        case SGFSDLG_DOWN:                  /* Scroll down */
        !           470:                                if( ypos+17<=entries )
        !           471:                                {
        !           472:                                        ++ypos;
        !           473:                                        refreshentries = TRUE;
        !           474:                                }
        !           475:                                SDL_Delay(20);
        !           476:                                break;
        !           477:                        case SGFSDLG_FILENAME:              /* User entered new filename */
        !           478:                                strcpy(fname, dlgfname);
        !           479:                                break;
        !           480:                        } /* switch */
        !           481:                } /* other button code */
        !           482: 
        !           483: 
        !           484:        } /* do */
        !           485: 
        !           486: 
        !           487:        while (retbut!=SGFSDLG_OKAY && retbut!=SGFSDLG_CANCEL && !bQuitProgram);
        !           488: 
        !           489:        if (oldcursorstate == SDL_DISABLE)
        !           490:                SDL_ShowCursor(SDL_DISABLE);
        !           491: 
        !           492:        File_makepath(path_and_name, path, fname, NULL);
        !           493: 
        !           494:        /* Free old allocated memory: */
        !           495:        if (files != NULL)
        !           496:        {
        !           497:                for(i=0; i<entries; i++)
        !           498:                {
        !           499:                        free(files[i]);
        !           500:                }
        !           501:                free(files);
        !           502:                files = NULL;
        !           503:        }
        !           504: 
        !           505:        if (browsingzip)
        !           506:        {
        !           507:                /* free zip file entries */
        !           508:                ZIP_FreeZipDir(zipfiles);
        !           509:                zipfiles = NULL;
        !           510:        }
        !           511: 
        !           512:        if (zip_path != NULL)
        !           513:        {
        !           514:                if( browsingzip )
        !           515:                {
        !           516:                        strcpy(zip_path, zipdir);
        !           517:                        strcat(zip_path, zipfilename);
        !           518:                }
        !           519:                else
        !           520:                        zip_path[0] = '\0';
        !           521:        }
        !           522: 
        !           523:        free(pStringMem);
        !           524: 
        !           525:        return(retbut == SGFSDLG_OKAY);
        !           526: }
        !           527: 

unix.superglobalmegacorp.com

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