Annotation of pmsdk/samples/opendlg/file1.c, revision 1.1

1.1     ! root        1: /*
        !             2:     FILE1.C -- Dialog Directory Listbox and Open File functions
        !             3:     Created by Microsoft Corporation, 1989
        !             4: */
        !             5: 
        !             6: #define  INCL_DOS
        !             7: #include "tool.h"
        !             8: 
        !             9: /****************************************************************************\
        !            10: * This function builds a directory list in a list box.
        !            11: \****************************************************************************/
        !            12: 
        !            13: int FAR PASCAL DlgDirList(hwnd, lpszPath, idDirList, idFileList,
        !            14:                           idStaticPath, attr)
        !            15: HWND hwnd;
        !            16: PSZ  lpszPath;
        !            17: int idDirList;
        !            18: int idFileList;
        !            19: int idStaticPath;
        !            20: USHORT attr;
        !            21:     {
        !            22:     CHAR szPath[MAX_FNAME_LEN];
        !            23:     CHAR chTmp;
        !            24:     PSZ  lpszFile, lpszNull;
        !            25:     HPOINTER hPointer;
        !            26: 
        !            27:     /* ensure path is legal and expand to full search path */
        !            28:     if (!DlgParseFile(lpszPath, (PSZ)szPath, FALSE, TRUE))
        !            29:         return FALSE;
        !            30: 
        !            31:     /* set pointer to hours glass */
        !            32:     hPointer = WinQueryPointer(HWND_DESKTOP); 
        !            33:     WinSetPointer(HWND_DESKTOP, WinQuerySysPointer(HWND_DESKTOP, SPTR_WAIT, FALSE));
        !            34: 
        !            35:     /* set current drive */
        !            36:     DosSelectDisk(*szPath - 'A' + 1);
        !            37: 
        !            38:     /* temporarily put zero after directory spec and set current directory */
        !            39:     lpszFile = FileInPath((PSZ)szPath);
        !            40:     lpszNull = lpszFile;
        !            41:     if (lpszNull > (PSZ)szPath + 3)
        !            42:         lpszNull--;
        !            43:     chTmp = *lpszNull;
        !            44:     *lpszNull = '\0';
        !            45:     DosChDir((PSZ)szPath, 0l);
        !            46:     if (idStaticPath)
        !            47:         WinSetWindowText(WinWindowFromID(hwnd, idStaticPath),
        !            48:                          DlgFitPathToBox(hwnd, idStaticPath, (PSZ)szPath));
        !            49:     *lpszNull = chTmp;
        !            50: 
        !            51:     /* fill list box with file names */
        !            52:     if (idDirList && idFileList)
        !            53:         {
        !            54:         /* fill them up with new entries */
        !            55:         DlgFillListBoxes(hwnd, idDirList, idFileList, attr, lpszFile);
        !            56:         }
        !            57: 
        !            58:     /* reset pointer to previous figure */
        !            59:     WinSetPointer(HWND_DESKTOP, hPointer);
        !            60: 
        !            61:     return TRUE;
        !            62:     }
        !            63: 
        !            64: 
        !            65: 
        !            66: 
        !            67: /****************************************************************************\
        !            68: * This function gets the file name selected by the user.
        !            69: \****************************************************************************/
        !            70: 
        !            71: int FAR PASCAL DlgDirSelect(hwnd, lpszIn, idListBox)
        !            72: HWND hwnd;
        !            73: PSZ  lpszIn;
        !            74: int idListBox;
        !            75:     {
        !            76:     CHAR sz[MAX_FNAME_LEN];
        !            77:     int item;
        !            78:     PSZ  lpsz, lpszFile;
        !            79:     BOOL fDir;
        !            80: 
        !            81:     /* get currently selected list entry */
        !            82:     item = (int) WinSendDlgItemMsg(hwnd, idListBox, LM_QUERYSELECTION, 0L, 0L);
        !            83:     if (item == LIT_NONE)
        !            84:         return FALSE;
        !            85:     WinSendDlgItemMsg(hwnd, idListBox, LM_QUERYITEMTEXT,
        !            86:                       MPFROM2SHORT(item, MAX_FNAME_LEN), (MPARAM)(PSZ)sz);
        !            87:     lpszFile = sz;
        !            88: 
        !            89:     /* extract name */
        !            90:     if (fDir = (*sz == '['))
        !            91:         {
        !            92:         lpszFile = NextChar(lpszFile);
        !            93:         if (*lpszFile == '-')
        !            94:             {
        !            95:             /* drive selection */
        !            96:             lpszFile = NextChar(lpszFile);
        !            97:             *(lpszFile+1) = ':';
        !            98:             *(lpszFile+2) = '\0';
        !            99:             }
        !           100:         else
        !           101:             {
        !           102:             /* directory selection */
        !           103:             lpsz = lpszFile;
        !           104:             while (*lpsz != ']')
        !           105:                 lpsz = NextChar(lpsz);
        !           106:             *lpsz = '\\';
        !           107:             }
        !           108:         }
        !           109: 
        !           110:     lstrcpy(lpszIn, lpszFile);
        !           111:     return (fDir);
        !           112:     }
        !           113: 
        !           114: 
        !           115: 
        !           116: 
        !           117: /****************************************************************************\
        !           118: * This function tries to open pdlf=>szFileName.  If the file does not
        !           119: * exist, the function asks to create it.
        !           120: *
        !           121: *  Returns:
        !           122: *    TDF_NOOPEN  - Illegal Filename or user didn't want to create
        !           123: *    TDF_OLDOPEN - Existing file
        !           124: *    TDF_NEWOPEN - File was created
        !           125: \****************************************************************************/
        !           126: 
        !           127: USHORT PASCAL DlgOpenFile(pdlf, hwnd)
        !           128: PDLF pdlf;
        !           129: HWND hwnd;
        !           130:     {
        !           131:     /* check for legal dos name */
        !           132:     if (!DlgParseFile((PSZ)pdlf->szFileName, (PSZ)pdlf->szOpenFile,
        !           133:                       FALSE, FALSE))
        !           134:         {
        !           135:         DlgAlertBox(hwnd, IDS_IFN, pdlf, MB_OK | MB_ICONEXCLAMATION);
        !           136:         return (TDF_NOOPEN);
        !           137:         }
        !           138:     /* see if file already exists */
        !           139:     if (DlgParseFile((PSZ)pdlf->szFileName, (PSZ)pdlf->szOpenFile,
        !           140:                       TRUE, FALSE))
        !           141:         {
        !           142:         if (OpenFile((PSZ)pdlf->szFileName, pdlf->phFile,
        !           143:                         (PSZ)pdlf->szOpenFile, OF_READ))
        !           144:             return (TDF_OLDOPEN);
        !           145:         else
        !           146:             {
        !           147:             DlgAlertBox(hwnd, IDS_EOF, pdlf, MB_OK | MB_ICONEXCLAMATION);
        !           148:             return (TDF_NOOPEN);
        !           149:             }
        !           150:         }
        !           151:     /* file doesn't exist: create new one? */
        !           152:     else if (DlgAlertBox(hwnd, IDS_FNF, pdlf, MB_YESNO | MB_ICONQUESTION) == MBID_YES)
        !           153:         {
        !           154:         if (OpenFile((PSZ)pdlf->szFileName, pdlf->phFile,
        !           155:                         (PSZ)pdlf->szOpenFile, OF_CREATE))
        !           156:             return (TDF_NEWOPEN);
        !           157:         else
        !           158:             DlgAlertBox(hwnd, IDS_ECF, pdlf, MB_OK | MB_ICONEXCLAMATION);
        !           159:         }
        !           160:     return(TDF_NOOPEN);
        !           161:     }
        !           162: 
        !           163: 
        !           164: 
        !           165: 
        !           166: /****************************************************************************\
        !           167: * This function returns the OS/2 file handle if operation is successful,
        !           168: * 0 otherwise.
        !           169: *
        !           170: * Effects:  Depend on wMode:
        !           171: *     OF_READ:      open file for reading only
        !           172: *     OF_WRITE:     open file for writing only
        !           173: *     OF_READWRITE: open file for reading and writing
        !           174: *     OF_CREATE:    create the file if it does not exist
        !           175: *     OF_REOPEN:    open file using info in the reopen buffer
        !           176: *     OF_EXIST:     test file existence
        !           177: *     OF_PARSE:     fill reopen buffer, with no other action
        !           178: \****************************************************************************/
        !           179: 
        !           180: 
        !           181: BOOL CALLBACK OpenFile(lpszFile, lpHandle, lpszOpenFile, wMode)
        !           182: PSZ  lpszFile;
        !           183: PHFILE lpHandle;
        !           184: PSZ  lpszOpenFile;
        !           185: USHORT wMode;
        !           186:     {
        !           187:     HFILE hFile = NULL;
        !           188:     USHORT wAction = NULL;
        !           189:     USHORT wAttrs = NULL;
        !           190:     USHORT wOpenFlag, wOpenMode;
        !           191:     CHAR sz[MAX_FNAME_LEN];
        !           192: 
        !           193:     /* if reopen specified, use earlier pathname */
        !           194:     if (wMode & OF_REOPEN)
        !           195:         {
        !           196:         lstrcpy((PSZ)sz, lpszOpenFile);
        !           197:         lpszFile = (PSZ)sz;
        !           198:         }
        !           199: 
        !           200:     /* parse file */
        !           201:     if (!DlgParseFile(lpszFile, lpszOpenFile, wMode&OF_EXIST, FALSE))
        !           202:         {
        !           203:         *lpszOpenFile = '\0';
        !           204:         return FALSE;
        !           205:         }
        !           206:     /* return if implementing boolean test OF_PARSE or OF_EXIST */
        !           207:     if (wMode & (OF_PARSE | OF_EXIST))
        !           208:         {
        !           209:         return TRUE;
        !           210:         }
        !           211: 
        !           212:     if (wMode & OF_READ)
        !           213:         {
        !           214:         wOpenFlag = 0x01;               /* fail if it doesn't exist */
        !           215:         wOpenMode = 0x20;               /* read only */
        !           216:         }
        !           217:     else if (wMode & OF_WRITE)
        !           218:         {
        !           219:         wOpenFlag = 0x11;               /* create if necessary */
        !           220:         wOpenMode = 0x11;               /* write only */
        !           221:         }
        !           222:     else if (wMode & OF_READWRITE)
        !           223:         {
        !           224:         wOpenFlag = 0x11;               /* create if necessary */
        !           225:         wOpenMode = 0x12;               /* read-write */
        !           226:         }
        !           227:     else if (wMode & OF_CREATE)
        !           228:         {
        !           229:         /* create and close file */
        !           230:         wOpenFlag = 0x10;               /* fail if exists */
        !           231:         wOpenMode = 0x10;               /* read only */
        !           232:         }
        !           233:     else
        !           234:         {
        !           235:         return FALSE;
        !           236:         }
        !           237: 
        !           238:     if (DosOpen(lpszFile, (PHFILE)&hFile, &wAction,
        !           239:                 (ULONG) 0, 0, wOpenFlag, wOpenMode, (ULONG) 0))
        !           240:         return FALSE;
        !           241: 
        !           242:     if (wMode & OF_CREATE)
        !           243:         {
        !           244:         if (DosClose(hFile))
        !           245:             return FALSE;
        !           246:         }
        !           247:     else
        !           248:         *lpHandle = hFile;
        !           249: 
        !           250:     return TRUE;
        !           251:     }
        !           252: 
        !           253: 
        !           254: 
        !           255: 
        !           256: /****************************************************************************\
        !           257: * This function puts a path string into a static box.
        !           258: \****************************************************************************/
        !           259: 
        !           260: PSZ  PASCAL DlgFitPathToBox(hwnd, idStatic, lpch)
        !           261: HWND hwnd;
        !           262: int idStatic;
        !           263: PSZ  lpch;
        !           264:     {
        !           265:     WRECT rc;
        !           266:     int cxField;
        !           267:     char chDrive;
        !           268:     HPS hps;
        !           269: 
        !           270:     /* get length of static field */
        !           271:     WinQueryWindowRect(WinWindowFromID(hwnd, idStatic), (PRECTL)&rc);
        !           272:     cxField = rc.xRight - rc.xLeft;
        !           273: 
        !           274:     hps = WinGetPS(hwnd);
        !           275:     if (cxField < LOUSHORT(GetTextExtent(hps, lpch,
        !           276:                                            lstrlen(lpch))))
        !           277:         {
        !           278:         chDrive = *lpch;
        !           279:         /* chop characters off front of string until text is short enough */
        !           280:         do
        !           281:             do
        !           282:                 lpch = NextChar(lpch);
        !           283:             while (*(lpch+6) != '\\' &&
        !           284:                    *(lpch+6) != '\0');
        !           285:         while (cxField < LOUSHORT(GetTextExtent(hps, lpch,
        !           286:                                                  lstrlen(lpch))));
        !           287:         /* insert header */
        !           288:         *lpch++ = chDrive;
        !           289:         *lpch++ = ':';
        !           290:         *lpch++ = '\\';
        !           291:         *lpch++ = '.';
        !           292:         *lpch++ = '.';
        !           293:         *lpch++ = '.';
        !           294:         lpch -= 6;
        !           295:         }
        !           296:     WinReleasePS(hps);
        !           297:     return (lpch);
        !           298:     }
        !           299: 
        !           300: 
        !           301: 
        !           302: 
        !           303: /****************************************************************************\
        !           304: * This function fills a list box with appropriate file names from the
        !           305: * current directory.
        !           306: \****************************************************************************/
        !           307: 
        !           308: int PASCAL DlgFillListBoxes(hwnd, idDirList, idFileList, attr, lpszFileSpec)
        !           309: HWND   hwnd;
        !           310: int    idDirList;
        !           311: int    idFileList;
        !           312: USHORT attr;
        !           313: PSZ    lpszFileSpec;
        !           314:     {
        !           315:     USHORT usFiles, usDrive;
        !           316:     int i;
        !           317:     PSZ  lpsz;
        !           318:     HDIR hDir;
        !           319:     ULONG lrgfDrives;
        !           320:     FILEFINDBUF ffb;
        !           321:     CHAR sz[20];
        !           322:     int cDrives;
        !           323:     int result = -1;
        !           324:     HWND hwndFiles, hwndDirs;
        !           325: 
        !           326:     /* get listbox window handles */
        !           327:     hwndFiles = WinWindowFromID(hwnd, idFileList);
        !           328:     hwndDirs = WinWindowFromID(hwnd, idDirList);
        !           329: 
        !           330:     /* disable updates to listboxes */
        !           331:     WinEnableWindowUpdate(hwndFiles, FALSE);
        !           332:     WinEnableWindowUpdate(hwndDirs, FALSE);
        !           333: 
        !           334:     /* empty list boxes of any old entries */
        !           335:     WinSendMsg(hwndFiles, LM_DELETEALL, 0L, 0L);
        !           336:     WinSendMsg(hwndDirs, LM_DELETEALL, 0L, 0L);
        !           337: 
        !           338:     /* put files that lMatch search spec in file listbox */
        !           339:     usFiles = 1;
        !           340:     hDir = 0xFFFF;
        !           341:     if (!DosFindFirst(lpszFileSpec, (PHDIR)&hDir,
        !           342:         attr&~(BITATTRDIR|BITATTRDRIVE), (PFILEFINDBUF)&ffb, sizeof(FILEFINDBUF),
        !           343:         &usFiles, 0L))
        !           344:         {
        !           345:         do
        !           346:             {
        !           347:             /* add string to list box */
        !           348:             result = (int) WinSendMsg(hwndFiles, LM_INSERTITEM,
        !           349:                                       MPFROM2SHORT(LIT_SORTASCENDING, 0),
        !           350:                                       (MPARAM)(PSZ)&(ffb.achName[0]));
        !           351:             usFiles = 1;
        !           352:             }
        !           353:         while (result >= 0 && !DosFindNext(hDir,
        !           354:                                            (PFILEFINDBUF)&ffb,
        !           355:                                            sizeof(FILEFINDBUF),
        !           356:                                            &usFiles));
        !           357:         DosFindClose(hDir);
        !           358:         }
        !           359: 
        !           360:     if (result != LIT_MEMERROR && (attr   & BITATTRDIR))
        !           361:         {
        !           362:         /* get directories */
        !           363:         usFiles = 1;
        !           364:         hDir = 0xFFFF;
        !           365:        if (!DosFindFirst((PSZ)szStarStar, (PHDIR)&hDir, BITATTRDIR,
        !           366:             (PFILEFINDBUF)&ffb, sizeof(FILEFINDBUF), &usFiles, 0l))
        !           367:             {
        !           368:             do
        !           369:                 {
        !           370:                 /* extract file name */
        !           371:                 if (ffb.attrFile & BITATTRDIR)
        !           372:                     {
        !           373:                     /* put brackets around directory */
        !           374:                    lpsz = (PSZ)&(ffb.achName[0]);
        !           375:                     if (*lpsz == '.' && *(lpsz+1) == '\0')
        !           376:                         /* forget about current directory name '.' */
        !           377:                        continue;
        !           378:                     sz[0] = '[';
        !           379:                     lstrcpy((PSZ)&sz[1], lpsz);
        !           380:                     sz[ffb.cchName    + 1] = ']';
        !           381:                     sz[ffb.cchName    + 2] = '\0';
        !           382:                     lpsz = (PSZ)sz;
        !           383:                     /* add string to list box */
        !           384:                     result = (int) WinSendMsg(hwndDirs, LM_INSERTITEM,
        !           385:                                               MPFROM2SHORT(LIT_SORTASCENDING, 0),
        !           386:                                               (MPARAM)lpsz);
        !           387:                     }
        !           388:                 usFiles = 1;
        !           389:                 }
        !           390:             while (result >= -1 && !DosFindNext(hDir,
        !           391:                                                (PFILEFINDBUF)&ffb,
        !           392:                                                sizeof(FILEFINDBUF),
        !           393:                                                &usFiles));
        !           394:             DosFindClose(hDir);
        !           395:             }
        !           396:         }
        !           397: 
        !           398:     if (result != LIT_MEMERROR && (attr   & BITATTRDRIVE))
        !           399:         /* get drives */
        !           400:         {
        !           401:         sz[0] = '[';
        !           402:         sz[1] = sz[3] = '-';
        !           403:         sz[4] = ']';
        !           404:         sz[5] = '\0';
        !           405: 
        !           406:         DosQCurDisk(&usDrive, (unsigned long far *)&lrgfDrives);
        !           407:         cDrives = 0;
        !           408:         for (i=0; 'A' + i <= 'Z'; i++)
        !           409:             {
        !           410:             if (lrgfDrives & 1L)
        !           411:                 {
        !           412:                 sz[2] = (char)('A' + i);
        !           413:                 /* add drive to list */
        !           414:                 result = (int) WinSendMsg(hwndDirs, LM_INSERTITEM,
        !           415:                                          MPFROM2SHORT(LIT_END, 0),
        !           416:                                           (MPARAM)(PSZ)sz);
        !           417:                 cDrives++;
        !           418:                 }
        !           419:             lrgfDrives >>= 1;
        !           420:             }
        !           421:         }
        !           422: 
        !           423:     /* enable and show updated listboxes */
        !           424:     WinShowWindow(hwndFiles, TRUE);
        !           425:     WinShowWindow(hwndDirs, TRUE);
        !           426: 
        !           427:     return result;
        !           428:     }
        !           429: 
        !           430: 
        !           431: 
        !           432: 
        !           433: /****************************************************************************\
        !           434: * This function parses a string into an fully expanded file name or search
        !           435: * path.  If fExist is true then the file must exist or the search path must
        !           436: * correspond to at least one existing file.  In all cases, the corresponding
        !           437: * directory must exist.  The string must be a file name, ie. no wildcards,
        !           438: * unless fWildOkay is true.  Returns TRUE if string is parsed correctly.
        !           439: \****************************************************************************/
        !           440: 
        !           441: BOOL PASCAL DlgParseFile(lpszIn, lpszExp, fExist, fWildOkay)
        !           442: PSZ  lpszIn, lpszExp;
        !           443: BOOL fExist, fWildOkay;
        !           444:     {
        !           445:     CHAR szPath[MAX_FNAME_LEN];
        !           446:     PSZ  lpszFile, lpsz;
        !           447: 
        !           448:     /* go past any path spec to first char in file name */
        !           449:     lpszFile = FileInPath(lpszIn);
        !           450: 
        !           451:     /* check validity of file name */
        !           452:     if (!fExist && !DlgValidName(lpszFile, fWildOkay))
        !           453:         {
        !           454:         *lpszExp = '\0';
        !           455:         return FALSE;
        !           456:         }
        !           457: 
        !           458:     /* copy path part to path string */
        !           459:     lpsz = (PSZ)szPath;
        !           460:     if (lpszIn == lpszFile)
        !           461:         *lpsz++ = '.';
        !           462:     else
        !           463:         {
        !           464:         while (lpszIn < lpszFile && lpsz < ((PSZ)szPath + MAX_FNAME_LEN - 1))
        !           465:             *lpsz++ = *lpszIn++;
        !           466:         }
        !           467:     *lpsz = '\0';
        !           468: 
        !           469:     /* let DOS do the dirty work */
        !           470:     if (fExist)
        !           471:         {
        !           472:         /* test existence of file while parsing path */
        !           473:         if (DosSearchPath(0, (PSZ)szPath, lpszFile, lpszExp, MAX_FNAME_LEN))
        !           474:             {
        !           475:             *lpszExp = '\0';
        !           476:             return FALSE;
        !           477:             }
        !           478:         }
        !           479:     else
        !           480:         {
        !           481:         /* use dummy wild card while parsing path */
        !           482:        if (DosSearchPath(0, (PSZ)szPath, (PSZ)szStarStar, lpszExp, MAX_FNAME_LEN))
        !           483:             {
        !           484:             *lpszExp = '\0';
        !           485:             return FALSE;
        !           486:             }
        !           487:         /* replace wild card part with true file name converted to CAPS */
        !           488:         lpsz = lpszExp;
        !           489:         while (*lpsz != '?' && *lpsz != '*' && *lpsz != '\0')
        !           490:             lpsz++;
        !           491:         while (*lpszFile != '\0')
        !           492:             {
        !           493:             *lpsz++ = *lpszFile++;
        !           494:             }
        !           495:         *lpsz = '\0';
        !           496:         Upper(lpszExp);
        !           497:         }
        !           498:     return TRUE;
        !           499:     }
        !           500: 
        !           501: 
        !           502: 
        !           503: 
        !           504: /****************************************************************************\
        !           505: * This function determines if a string forms a legal file name or search
        !           506: * path.  Wildcard characters are acceptable if fWildOkay is true.  Returns
        !           507: * TRUE if string is legal.
        !           508: \****************************************************************************/
        !           509: 
        !           510: BOOL PASCAL DlgValidName(lpszName, fWildOkay)
        !           511: PSZ  lpszName;
        !           512: BOOL fWildOkay;
        !           513:     {
        !           514:     int cLen;
        !           515:     PSZ  lpsz;
        !           516: 
        !           517:     /* check file name */
        !           518:     if (*lpszName == '\0')
        !           519:         return FALSE;
        !           520:     cLen = 0;
        !           521:     lpsz = lpszName;
        !           522:     while (*lpsz != '\0' && *lpsz != '.')
        !           523:         {
        !           524:         if (++cLen > 8 || *lpsz < 0x20)
        !           525:             return FALSE;
        !           526:         switch (*lpsz++)
        !           527:             {
        !           528:             case '*':
        !           529:             case '?':
        !           530:                 if (fWildOkay)
        !           531:                     break;
        !           532:             case '\"':
        !           533:             case '\\':
        !           534:             case '/':
        !           535:             case '[':
        !           536:             case ']':
        !           537:             case ':':
        !           538:             case '|':
        !           539:             case '<':
        !           540:             case '>':
        !           541:             case '+':
        !           542:             case '=':
        !           543:             case ';':
        !           544:             case ',':
        !           545:                 return FALSE;
        !           546:             }
        !           547:         }
        !           548: 
        !           549:     /* check extension */
        !           550:     if (*lpsz++ == '\0')
        !           551:         return TRUE;
        !           552:     cLen = 0;
        !           553:     while (*lpsz != '\0')
        !           554:         {
        !           555:         if (++cLen > 3 || *lpsz < 0x20)
        !           556:             return FALSE;
        !           557:         switch (*lpsz++)
        !           558:             {
        !           559:             case '*':
        !           560:             case '?':
        !           561:                 if (fWildOkay)
        !           562:                     break;
        !           563:             case '.':
        !           564:             case '\"':
        !           565:             case '\\':
        !           566:             case '/':
        !           567:             case '[':
        !           568:             case ']':
        !           569:             case ':':
        !           570:             case '|':
        !           571:             case '<':
        !           572:             case '>':
        !           573:             case '+':
        !           574:             case '=':
        !           575:             case ';':
        !           576:             case ',':
        !           577:                 return FALSE;
        !           578:             }
        !           579:         }
        !           580:     return TRUE;
        !           581:     }

unix.superglobalmegacorp.com

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