Annotation of pmsdk/samples/browse/avbrowse/browse.c, revision 1.1.1.1

1.1       root        1: /*
                      2:     browse.c -- AVIO File Browsing Utility
                      3: 
                      4:     Created by Microsoft Corporation, 1989
                      5: */
                      6: #define        INCL_WINTRACKRECT
                      7: #define        INCL_WINWINDOWMGR
                      8: #define        INCL_WINPOINTERS
                      9: #define INCL_WINFRAMEMGR
                     10: #include <os2.h>
                     11: #include <stdio.h>
                     12: #include <stdlib.h>
                     13: #include <string.h>
                     14: #include "avio.h"
                     15: #include "browse.h"
                     16: #include <opendlg.h>
                     17: /*
                     18:     Constants
                     19: */
                     20: #define MAXLINELEN     120
                     21: #define AVIO_PS_ROWS   25
                     22: #define        AVIO_PS_COLS    80
                     23: /*
                     24:     Global Variables
                     25: */
                     26: FILE   *pfInput;
                     27: PFNWP  pfnOldClient;
                     28: char   *aszLines[NUM_DATA_LINES];
                     29: SHORT  sTopLine = 0;
                     30: DLF    dlfInput;
                     31: HFILE  hfInput;
                     32: USHORT usAction;
                     33: LBINFO lbiData;
                     34: HPOINTER hptrWait;
                     35: HPOINTER hptrArrow;
                     36: HWND   hWndClient;
                     37: HWND   hWndFrame;
                     38: BOOL   fLargeFont = FALSE;
                     39: SHORT  sMaxLine;
                     40: /*
                     41:     Open the input file
                     42: */
                     43: int cdecl main(int argc, char *argv[]) {
                     44:      static CHAR szClientClass[] = "Browse";
                     45:      static CHAR szCaption[]    = "";
                     46:      HAB       hAB;
                     47:      HMQ       hmq;
                     48:      QMSG      qmsg;
                     49:      ULONG     flFrameFlags = FCF_STANDARD | FCF_HORZSCROLL | FCF_VERTSCROLL;
                     50:      ULONG     flFrameStyle = WS_VISIBLE | FS_SCREENALIGN;
                     51:      char      *szInFile;
                     52: 
                     53:      hAB = WinInitialize(0);
                     54:      hmq = WinCreateMsgQueue(hAB, 0);
                     55: 
                     56:      WinRegisterClass(hAB, szClientClass, BrowseWndProc, CS_SYNCPAINT, 0);
                     57: 
                     58:      hWndFrame = WinCreateStdWindow(HWND_DESKTOP, flFrameStyle,
                     59:                                     &flFrameFlags, szClientClass, szCaption,
                     60:                                      0L, NULL, ID_RESOURCE, &hWndClient);
                     61:      /*
                     62:        Get the hourglass and arrow pointers
                     63:      */
                     64:      hptrWait  = WinQuerySysPointer(HWND_DESKTOP, SPTR_WAIT,  FALSE);
                     65:      hptrArrow = WinQuerySysPointer(HWND_DESKTOP, SPTR_ARROW, FALSE);
                     66: 
                     67:      if (argc == 1) pfInput = stdin;
                     68:      else {
                     69:        if (!(pfInput = fopen(argv[1], "r"))) {
                     70:            fprintf(stderr, "***Error:  Could not open %s", szInFile);
                     71:            return(-1);
                     72:        }
                     73:      }
                     74:      ReadFile();
                     75:      /*
                     76:        Setup AVIO PS and force a paint
                     77:        Note:  This subclasses the client and frame windows
                     78:      */
                     79:      lbiData.sPSrows   = AVIO_PS_ROWS;
                     80:      lbiData.sPScols   = AVIO_PS_COLS;
                     81:      lbiData.sRows     = sTopLine;
                     82:      lbiData.sCols     = sMaxLine;
                     83:      lbiData.pfnQL     = (PFNQL) RetrieveLine;
                     84:      lbiData.fLargeFont        = FALSE;
                     85:      AvioInit(&lbiData);
                     86:      /*
                     87:        Process messages
                     88:      */
                     89:      while (WinGetMsg(hAB, &qmsg, NULL, 0, 0)) WinDispatchMsg(hAB, &qmsg);
                     90: 
                     91:      /* Blast the AVIO PS */
                     92:      AvioClose();
                     93: 
                     94:      WinDestroyWindow(hWndFrame);
                     95:      WinDestroyMsgQueue(hmq);
                     96:      WinTerminate(hAB);
                     97:      return 0;
                     98: }
                     99: 
                    100: void ReadFile(void) {
                    101: /*
                    102:     Reads in a file using <stdio.h> fgets() calls.
                    103:     It might be wise to put better word wrap facilities here
                    104: */
                    105:     char       szLine[MAXLINELEN];
                    106: 
                    107:     /* Put up the hourglass */
                    108:     WinSetPointer(HWND_DESKTOP, hptrWait);
                    109: 
                    110:     /* Reinitialize buffer, MaxLineLength */
                    111:     for (; sTopLine > 0; ) free(aszLines[--sTopLine]);
                    112:     sMaxLine = 0;
                    113: 
                    114:     /* Read in the file */
                    115:     while (fgets(szLine, MAXLINELEN, pfInput)) {
                    116: 
                    117:        /* Convert LF (\n) into NULL (\0) */
                    118:        if (szLine[strlen(szLine) - 1] == '\n') {
                    119:            szLine[strlen(szLine) - 1] = 0;
                    120:        } else szLine[MAXLINELEN - 1] = 0;
                    121: 
                    122:        if (StoreLine(szLine)) {
                    123:            fprintf(stderr,"***Error:  Line buffer full\n");
                    124:            return;
                    125:        }
                    126:     }
                    127:     fclose(pfInput);
                    128: 
                    129:     /* Reset the mouse pointer */
                    130:     WinSetPointer(HWND_DESKTOP, hptrArrow);
                    131: 
                    132:     return;
                    133: }
                    134: 
                    135: SHORT StoreLine(char *szLine) {
                    136: /*
                    137:     Put a line into the line buffer; line numbers are free
                    138:     For > 64K data, add code here and in RetrieveLine
                    139: */
                    140:     int                i, cLinePos;
                    141:     BOOL       fDone;
                    142:     /*
                    143:        Check if top line exceeded, or malloc() fails
                    144:     */
                    145:     if (sTopLine == NUM_DATA_LINES)  return -1;
                    146:     /*
                    147:        Compute line length with tabs expanded
                    148:     */
                    149:     cLinePos = 0;
                    150:     for (i = 0; i < MAXLINELEN; i++) {
                    151:        switch(szLine[i]) {
                    152:            case '\0':
                    153:                cLinePos++; i = MAXLINELEN;
                    154:                break;
                    155:            case '\t':
                    156:                do {
                    157:                    cLinePos++;
                    158:                } while (cLinePos % 8);
                    159:                break;
                    160: 
                    161:            default:
                    162:                cLinePos++;
                    163:        }
                    164: 
                    165:     }
                    166:     if (cLinePos > sMaxLine) sMaxLine = cLinePos;
                    167:     if (!(aszLines[sTopLine] = malloc(cLinePos))) return -1;
                    168:     /*
                    169:        Copy szLine into the line buffer.  Expand tabs here.
                    170:     */
                    171:     i = cLinePos = 0; fDone = FALSE;
                    172:     while ((i <= MAXLINELEN) && (!fDone)) {
                    173:        switch(szLine[i]) {
                    174:            case '\t':
                    175:                do {
                    176:                    aszLines[sTopLine][cLinePos++] = ' ';
                    177:                } while (cLinePos % 8);
                    178:                break;
                    179: 
                    180:            default:
                    181:                aszLines[sTopLine][cLinePos++] = szLine[i];
                    182:                fDone = !szLine[i];
                    183:                break;
                    184:        }
                    185:        i++;
                    186:     }
                    187:     sTopLine++;
                    188:     return 0;
                    189: }
                    190: 
                    191: char * _loadds RetrieveLine(USHORT usLineNum) {
                    192: /*
                    193:     Return line numbered usLineNum
                    194: */
                    195:     if (usLineNum >= sTopLine) {               /* Out of range */
                    196:        return NULL;
                    197:     }
                    198:     return aszLines[usLineNum];
                    199: }
                    200: 
                    201: MRESULT CALLBACK BrowseWndProc(hWnd, msg, mp1, mp2)
                    202: HWND hWnd;
                    203: USHORT msg;
                    204: MPARAM mp1;
                    205: MPARAM mp2;
                    206: {
                    207: /*
                    208:     Handle the About... and Open... messages
                    209: */
                    210:     switch(msg) {
                    211:        case WM_COMMAND:
                    212:            switch (COMMANDMSG(&msg)->cmd) {
                    213:                case IDM_ABOUT:
                    214:                    WinDlgBox(HWND_DESKTOP, hWnd, AboutDlgProc,
                    215:                              NULL, IDD_ABOUT, NULL);
                    216:                     return 0;
                    217: 
                    218:                case IDM_OPEN:
                    219:                    /*
                    220:                        Open the file, using the file dialog
                    221:                        then reopen it with stdio calls
                    222:                    */
                    223:                    SetupDLF(&dlfInput, DLG_OPENDLG, &hfInput,
                    224:                        "\\*.*", NULL, "Browse Open File",
                    225:                        "Select a file to be browsed.");
                    226:                    DlgFile(hWnd, &dlfInput);
                    227:                    pfInput = fopen(dlfInput.szOpenFile, "r");
                    228:                    ReadFile();
                    229:                    /*
                    230:                        Close the opened handle
                    231:                    */
                    232:                    DosClose(hfInput);
                    233: 
                    234:                    /* Fix up the screen display */
                    235:                    lbiData.sRows = sTopLine;
                    236:                    lbiData.sCols = sMaxLine;
                    237:                    lbiData.fLargeFont = fLargeFont;
                    238:                    AvioInit(&lbiData);
                    239: 
                    240:                    return 0;
                    241: 
                    242:                case IDM_FONT:
                    243:                    AvioLargeFont(fLargeFont = !fLargeFont);
                    244:                    return 0;
                    245: 
                    246:                default: return 0;
                    247:            }
                    248:            break;
                    249:        default: return WinDefWindowProc(hWnd, msg, mp1, mp2);
                    250:     }
                    251:     return 0L;
                    252: }
                    253: 
                    254: MRESULT CALLBACK AboutDlgProc(hDlg, msg, mp1, mp2)
                    255: /*
                    256:     About... dialog procedure
                    257: */
                    258: HWND   hDlg;
                    259: USHORT msg;
                    260: MPARAM mp1;
                    261: MPARAM mp2;
                    262: {
                    263:     switch(msg) {
                    264:        case WM_COMMAND:
                    265:            switch(COMMANDMSG(&msg)->cmd) {
                    266:                case DID_OK: WinDismissDlg(hDlg, TRUE); break;
                    267:                default: break;
                    268:            }
                    269:        default: return WinDefDlgProc(hDlg, msg, mp1, mp2);
                    270:     }
                    271:     return FALSE;
                    272: }

unix.superglobalmegacorp.com

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