home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / games / volume14 / umoria4 / part11 < prev    next >
Internet Message Format  |  1992-08-31  |  59KB

  1. Path: uunet!zephyr.ens.tek.com!master!saab!billr
  2. From: billr@saab.CNA.TEK.COM (Bill Randle)
  3. Newsgroups: comp.sources.games
  4. Subject: v14i043:  umoria4 - single player dungeon simulation (ver. 5.5), Part11/39
  5. Message-ID: <3401@master.CNA.TEK.COM>
  6. Date: 20 Aug 92 18:03:52 GMT
  7. Sender: news@master.CNA.TEK.COM
  8. Lines: 2464
  9. Approved: billr@saab.CNA.TEK.COM
  10.  
  11. Submitted-by: grabiner@math.harvard.edu (David Grabiner)
  12. Posting-number: Volume 14, Issue 43
  13. Archive-name: umoria4/Part11
  14. Supersedes: umoria3: Volume 9, Issue 55-97; Volume 10, Issue 15-17
  15. Environment: Curses, Unix, Mac, MS-DOS, Atari-ST, Amiga, VMS
  16.  
  17.  
  18.  
  19. #! /bin/sh
  20. # This is a shell archive.  Remove anything before this line, then unpack
  21. # it by saving it into a file and typing "sh file".  To overwrite existing
  22. # files, type "sh file -c".  You can also feed this as standard input via
  23. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  24. # will see the following message at the end:
  25. #        "End of archive 11 (of 39)."
  26. # Contents:  mac/scrnmgr/ScrnMgr.c.1 util/mc/symtab.c
  27. # Wrapped by billr@saab on Thu Aug 20 09:11:28 1992
  28. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  29. if test -f 'mac/scrnmgr/ScrnMgr.c.1' -a "${1}" != "-c" ; then 
  30.   echo shar: Will not clobber existing file \"'mac/scrnmgr/ScrnMgr.c.1'\"
  31. else
  32. echo shar: Extracting \"'mac/scrnmgr/ScrnMgr.c.1'\" \(41420 characters\)
  33. sed "s/^X//" >'mac/scrnmgr/ScrnMgr.c.1' <<'END_OF_FILE'
  34. X/* mac/scrnmgr/ScrnMgr.c: a screen management package for the Mac
  35. X
  36. X   Copyright (c) 1989-1991 Curtis McCauley, James E. Wilson
  37. X
  38. X   You may copy this subroutine package freely, modify it as you desire,
  39. X   and distribute it at will, as long as the copyright notice in the source
  40. X   material is not disturbed, excepting that no one may use this package or
  41. X   any part of it for commercial purposes of any kind without the express
  42. X   written consent of its author. */
  43. X
  44. X/*    Think C port by Benjamin Schreiber, 1991.  */
  45. X
  46. X#ifndef THINK_C
  47. X
  48. X#include <Types.h>
  49. X#include <OSUtils.h>
  50. X#include <Files.h>
  51. X#include <Quickdraw.h>
  52. X#include <Windows.h>
  53. X#include <Memory.h>
  54. X#include <Controls.h>
  55. X#include <Resources.h>
  56. X#include <Desk.h>
  57. X#include <Dialogs.h>
  58. X#include <Events.h>
  59. X#include <Fonts.h>
  60. X#include <Menus.h>
  61. X#include <OSEvents.h>
  62. X#include <SegLoad.h>
  63. X#include <TextEdit.h>
  64. X#include <ToolUtils.h>
  65. X#include <Packages.h>
  66. X#include <Retrace.h>
  67. X#include <Script.h>
  68. X#include <Traps.h>
  69. X#include <SysEqu.h>
  70. X
  71. X#include <StdDef.h>
  72. X#include <String.h>
  73. X#include <Strings.h>
  74. X
  75. X#else
  76. X
  77. X/* defined(THINK_C) */
  78. X
  79. X#include <VRetraceMgr.h>
  80. X#include <ScriptMgr.h>
  81. X#include <MultiFinder.h>    /* This may not be necessary.  */
  82. X
  83. X#include <string.h>
  84. X#include <stddef.h>
  85. X
  86. X#define p2cstr    PtoCstr        /* Correct difference in names.  */
  87. X#define c2pstr    CtoPstr
  88. X
  89. Xtypedef char Str63[64];
  90. X
  91. X/* Cover up error in THINK C library.  */
  92. X#define ok    OK
  93. X#define cancel    Cancel
  94. X#define normal    0
  95. X
  96. X#endif
  97. X
  98. X
  99. X#include "ScrnMgr.h"
  100. X
  101. X#define osEvent                    app4Evt
  102. X#define suspendResumeMessage    1
  103. X#define resumeMask                1
  104. X
  105. X#define infoResType            (ResType) 'INFO'
  106. X#define infoResID            1
  107. X
  108. X#define ABS(i)                ((i < 0) ? -i : i)
  109. X
  110. X#define menuBarID1            128
  111. X#define menuBarID2            228
  112. X
  113. X#define appleID                128
  114. X#define fileID1                129
  115. X#define fileID2                229
  116. X#define editID1                130
  117. X#define editID2                230
  118. X#define screenID            131
  119. X#define fontSizeID            132
  120. X#define appID1                133
  121. X#define appID2                233
  122. X
  123. X#define aboutItem            1
  124. X
  125. X#define openItem            1
  126. X#define closeItem            2
  127. X#define quitItem            4
  128. X
  129. X#define undoItem            1
  130. X#define cutItem                3
  131. X#define copyItem            4
  132. X#define pasteItem            5
  133. X#define clearItem            6
  134. X
  135. X#define colorsItem            1
  136. X
  137. X#define aboutDlgID            128
  138. X#define aboutDfltBorder        2
  139. X
  140. X#define aboutStrID            128
  141. X
  142. X#define colorsDlgID            129
  143. X#define colorsDfltBorder    23
  144. X#define foregroundRect        19
  145. X#define backgroundRect        20
  146. X#define foreColors            3
  147. X#define backColors            11
  148. X
  149. X#define yesOrNoDlgID        130
  150. X#define yesOrNoDfltBorder    3
  151. X#define yesOrNoText            4
  152. X
  153. X#define fontNameID            129
  154. X
  155. X#define fontSizeCount        50
  156. X#define minFontSize            1
  157. X#define maxFontSize            100
  158. X#define dfltFontSize        9
  159. X
  160. X#define acurID                128
  161. X
  162. X#define titleMargin            20
  163. X#define titleMinHgt            8
  164. X#define titleMinWid            8
  165. X#define titleDfltLeft        32
  166. X#define titleDfltTop        64
  167. X
  168. X#define ESC                    '\x1B'
  169. X#define BACKQUOTE            '\x60'
  170. X
  171. Xtypedef struct Info {
  172. X    Rect bounds;
  173. X    short size;
  174. X    long colorStdFore;
  175. X    long colorStdBack;
  176. X} Info, *InfoPtr;
  177. X
  178. Xtypedef struct Acur {
  179. X    short frames;
  180. X    short next;
  181. X    union {
  182. X        struct { short id; short fill; } cursID;
  183. X        Cursor **cursHandle;
  184. X    } table[1];
  185. X} Acur, *AcurPtr, **AcurHandle;
  186. X
  187. Xtypedef struct Evt {
  188. X    char keycode;
  189. X    char modifiers;
  190. X    char ascii;
  191. X    short h;
  192. X    short v;
  193. X} Evt, *EvtPtr;
  194. X
  195. X#define qSize            32
  196. X
  197. Xtypedef struct SaveScreenRec {
  198. X    struct SaveScreenRec **link;    /* link to previous saved screen        */
  199. X    char **chars;                    /* handle to saved character buffer        */
  200. X    char **attrs;                    /* handle to saved attribute buffer        */
  201. X    Point cursor;                    /* saved cursor location                */
  202. X} SaveScreenRec, *SaveScreenPtr, **SaveScreenHandle;
  203. X
  204. Xtypedef struct ScreenRec {
  205. X    WindowPtr window;                /* the screen window                    */
  206. X    EventRecord event;                /* the last event                        */
  207. X    SysEnvRec env;                    /* the outside world                    */
  208. X    long wneImplemented;            /* do we have WaitNextEvent?            */
  209. X    long backgrounding;                /* are we in the background?            */
  210. X    long reconfigFlag;                /* true if user want to change options    */
  211. X    long colorFlag;                    /* true if multiple colors supported    */
  212. X    long cmdKeyFlag;                /* true if cmd key equivalents ok        */
  213. X    long mouseFlag;                    /* true if mouse clicks are captured    */
  214. X    long escMapFlag;                /* true if backquote maps to escape        */
  215. X    long waitFlag;                    /* true if in wait                        */
  216. X    long waitRate;                    /* how fast to spin the cursor            */
  217. X    long colorStdFore;                /* standard foreground color            */
  218. X    long colorStdBack;                /* standard background color            */
  219. X    long windowW;                    /* its content width in pixels            */
  220. X    long windowH;                    /* its content height in pixels            */
  221. X    short txFont;                    /* the font number in use                */
  222. X    short txSize;                    /* the font size in use                    */
  223. X    short txNum;                    /* index into fontSizes table + 1        */
  224. X    short **fontSizes;                /* a table of available sizes            */
  225. X    FontInfo info;                    /* font info for the current font        */
  226. X    Point cursor;                    /* cursor location in char coords        */
  227. X    Point charPDims;                /* char cell size in pixels                */
  228. X    Point scrnCDims;                /* screen size in chars                    */
  229. X    Point origin;                    /* logical origin of screen for drawing */
  230. X    Rect stdStateGRect;                /* original standard state                */
  231. X    Rect scrnCRect;                    /* screen bounds in chars                */
  232. X    Rect scrnLRect;                    /* screen bounds in pixels                */
  233. X    Rect scrnXLRect;                /* screen bounds in pixels plus margin    */
  234. X    Rect sizeLimitPRect;            /* limits to growth                        */
  235. X    Rect dragLimitGRect;            /* limits to movement                    */
  236. X    Rect hScrollPRect;                /* horiz scroll bar bounds                */
  237. X    Rect vScrollPRect;                /* vert scroll bar bounds                */
  238. X    Rect growPRect;                    /* grow icon bounds                        */
  239. X    Rect picPRect;                    /* picture area bounds                    */
  240. X    Rect picLRect;                    /* drawing is clipped here (pic area)    */
  241. X    Rect drawLRect;                    /* drawing is clipped here (screen area)*/
  242. X    Rect drawXCRect;                /* rect to draw in char coords            */
  243. X    Rect drawXLRect;                /* rect to draw in pixel coords            */
  244. X    Rect mouseCRect;                /* watch mouse activity in this area    */
  245. X    Rect mouseLRect;                /* watch mouse activity in this area    */
  246. X    ControlHandle hScrollHandle;    /* handle to horiz scroll control        */
  247. X    ControlHandle vScrollHandle;    /* handle to vert scroll control        */
  248. X    short infoResFile;                /* ref no of resource file                */
  249. X    Handle infoHandle;                /* handle to info resource                */
  250. X    Handle versHandle;                /* handle to vers. string, for about dlg */
  251. X    char **chars;                    /* handle to character buffer            */
  252. X    char **attrs;                    /* handle to attribute buffer            */
  253. X    short **updLeft;                /* handle to left margin for updates    */
  254. X    short **updRight;                /* handle to right margin for updates    */
  255. X    long keyFlush;                    /* tick count at last key flush            */
  256. X    long mouseFlush;                /* tick count at last mouse flush        */
  257. X    long qBegin;                    /* index to first elem in queue            */
  258. X    long qEnd;                        /* index to next elem to be stored        */
  259. X    Evt qBuffer[qSize];                /* queue of keystrokes                    */
  260. X    long cursorLevel;                /* greater than zero when cursor visible*/
  261. X    long cursorColor;                /* color of cursor lines                */
  262. X    long cursorLines;                /* number of lines in cursor            */
  263. X    long cursorBlink;                /* ticks between cursor blinks            */
  264. X    long cursorStatus;                /* non-zero when cursor in on screen    */
  265. X    long cursorChangeTick;            /* when to change cursor status            */
  266. X    void (*aboutProc)(void);        /* what to call when about is selected  */
  267. X    void (*quitProc)(void);            /* what to call when quit is selected   */
  268. X    void (*fileMenuProc)(long item);/* file menu handler                    */
  269. X    void (*appMenuProc)(long item);    /* app menu handler                        */
  270. X    long quitReturns;                /* true if quit proc will always return */
  271. X    AcurHandle acur;                /* table of cursors                        */
  272. X    VBLTask vbl;                    /* for animating said cursors            */
  273. X    SaveScreenHandle stack;            /* stack of saved screens                */
  274. X} ScreenRec;
  275. X
  276. XScreenRec theScreen;
  277. X
  278. Xstatic long colors[8] = {
  279. X    whiteColor, blackColor,
  280. X    redColor, greenColor, blueColor,
  281. X    cyanColor, magentaColor, yellowColor
  282. X};
  283. X
  284. Xstatic void DisposeStackTop()
  285. X
  286. X{
  287. X    SaveScreenHandle next;
  288. X
  289. X    if (theScreen.stack != NULL) {
  290. X
  291. X        next = (*theScreen.stack)->link;
  292. X
  293. X        DisposHandle((Handle) (*theScreen.stack)->chars);
  294. X        DisposHandle((Handle) (*theScreen.stack)->attrs);
  295. X
  296. X        DisposHandle((Handle) theScreen.stack);
  297. X
  298. X        theScreen.stack = next;
  299. X
  300. X    }
  301. X
  302. X    return;
  303. X}
  304. X
  305. Xstatic long WNETest(envp)
  306. XSysEnvRec *envp;
  307. X
  308. X{
  309. X#ifndef THINK_C
  310. X    long hasWNE;
  311. X
  312. X    if (envp->machineType < 0)
  313. X        hasWNE = false;
  314. X
  315. X    else
  316. X        hasWNE =
  317. X        NGetTrapAddress(_WaitNextEvent, ToolTrap) != GetTrapAddress(_Unimplemented);
  318. X
  319. X    return(hasWNE);
  320. X#else
  321. X    return 0;
  322. X#endif
  323. X}
  324. X
  325. Xstatic long NoEscTest(envp)
  326. XSysEnvRec *envp;
  327. X
  328. X{
  329. X    long hasNoEsc;
  330. X
  331. X    switch (envp->keyBoardType) {
  332. X
  333. X        case envAExtendKbd:
  334. X        case envStandADBKbd:
  335. X            hasNoEsc = false;
  336. X            break;
  337. X
  338. X        default:
  339. X            hasNoEsc = true;
  340. X            break;
  341. X
  342. X    }
  343. X
  344. X    return(hasNoEsc);
  345. X}
  346. X
  347. Xstatic void FlushQueue()
  348. X
  349. X{
  350. X    theScreen.qBegin = theScreen.qEnd = 0;
  351. X    return;
  352. X}
  353. X
  354. Xstatic void PushQueue(keycode, modifiers, ascii, h, v)
  355. Xchar keycode;
  356. Xchar modifiers;
  357. Xchar ascii;
  358. Xshort h;
  359. Xshort v;
  360. X
  361. X{
  362. X    long end;
  363. X    EvtPtr next;
  364. X
  365. X    end = (theScreen.qEnd + 1) & (qSize - 1);
  366. X    if (end != theScreen.qBegin) {
  367. X        next = &theScreen.qBuffer[theScreen.qEnd];
  368. X        next->keycode = keycode;
  369. X        next->modifiers = modifiers;
  370. X        next->ascii = ascii;
  371. X        next->h = h;
  372. X        next->v = v;
  373. X        theScreen.qEnd = end;
  374. X    }
  375. X    else {
  376. X        /* should I beep? */
  377. X    }
  378. X
  379. X    return;
  380. X}
  381. X
  382. Xstatic long LenQueue()
  383. X
  384. X{
  385. X    return(ABS(theScreen.qEnd - theScreen.qBegin));
  386. X}
  387. X
  388. Xstatic long PopQueue(keycode, modifiers, ascii, h, v)
  389. Xchar *keycode;
  390. Xchar *modifiers;
  391. Xchar *ascii;
  392. Xshort *h;
  393. Xshort *v;
  394. X
  395. X{
  396. X    long flag;
  397. X    EvtPtr next;
  398. X
  399. X    if (theScreen.qEnd != theScreen.qBegin) {
  400. X        flag = true;
  401. X        next = &theScreen.qBuffer[theScreen.qBegin];
  402. X        if (keycode != NULL) *keycode = next->keycode;
  403. X        if (modifiers != NULL) *modifiers = next->modifiers;
  404. X        if (ascii != NULL ) *ascii = next->ascii;
  405. X        if (h != NULL ) *h = next->h;
  406. X        if (v != NULL ) *v = next->v;
  407. X        theScreen.qBegin = (theScreen.qBegin + 1) & (qSize - 1);
  408. X    }
  409. X    else {
  410. X        flag = false;
  411. X    }
  412. X
  413. X    return(flag);
  414. X}
  415. X
  416. Xstatic int GtoC(gh, gv, ch, cv)
  417. Xshort gh, gv;
  418. Xshort *ch, *cv;
  419. X
  420. X{
  421. X    int flag;
  422. X    Point temp;
  423. X
  424. X    temp.h = gh;
  425. X    temp.v = gv;
  426. X
  427. X    SetOrigin(theScreen.origin.h, theScreen.origin.v);
  428. X    GlobalToLocal(&temp);
  429. X    SetOrigin(0, 0);
  430. X
  431. X    if ( PtInRect(temp, &theScreen.mouseLRect)
  432. X        && PtInRect(temp, &theScreen.picLRect) ) {
  433. X        flag = true;
  434. X        *ch = temp.h / theScreen.charPDims.h;
  435. X        *cv = temp.v / theScreen.charPDims.v;
  436. X    }
  437. X    else
  438. X        flag = false;
  439. X
  440. X    return(flag);
  441. X}
  442. X
  443. Xstatic void DefaultCursor()
  444. X
  445. X{
  446. X    theScreen.cursorLevel = 0;
  447. X    theScreen.cursorColor = attrColorBlack;
  448. X    theScreen.cursorLines = 2;
  449. X    theScreen.cursorBlink = 0;
  450. X    theScreen.cursorStatus = 0;
  451. X    theScreen.cursorChangeTick = 0;
  452. X
  453. X    return;
  454. X}
  455. X
  456. Xstatic void Prolog()
  457. X
  458. X{
  459. X#ifdef THINK_C
  460. X    InitGraf(&thePort);
  461. X#else
  462. X    InitGraf(&qd.thePort);
  463. X#endif
  464. X    InitFonts();
  465. X    FlushEvents(everyEvent, 0);
  466. X    InitWindows();
  467. X    InitMenus();
  468. X    TEInit();
  469. X    InitDialogs(NULL);
  470. X    InitCursor();
  471. X
  472. X    return;
  473. X}
  474. X
  475. Xstatic void LoadCursors()
  476. X
  477. X{
  478. X    short i, count;
  479. X    Cursor **c;
  480. X
  481. X    theScreen.acur = (AcurHandle) GetResource('acur', acurID);
  482. X
  483. X    count = (*theScreen.acur)->frames;
  484. X
  485. X    for (i = 0; i < count; i++) {
  486. X        c = GetCursor((*theScreen.acur)->table[i].cursID.id);
  487. X        (*theScreen.acur)->table[i].cursHandle = c;
  488. X    }
  489. X
  490. X    return;
  491. X}
  492. X
  493. Xstatic long GetFontSizes()
  494. X
  495. X{
  496. X    long i, j;
  497. X    short fsize, sizes[fontSizeCount];
  498. X    char **fname;
  499. X
  500. X    fname = (char **) GetString(fontNameID);
  501. X
  502. X    if (fname == NULL)
  503. X        theScreen.txFont = 0;
  504. X    else {
  505. X        HLock(fname);
  506. X        GetFNum(*fname, &theScreen.txFont);
  507. X        HUnlock(fname);
  508. X    }
  509. X
  510. X    for (i = 0, fsize = minFontSize;
  511. X         (i < fontSizeCount) && (fsize < maxFontSize);
  512. X         fsize++)
  513. X        if (RealFont(theScreen.txFont, fsize))
  514. X            sizes[i++] = fsize;
  515. X
  516. X    if (i == 0)
  517. X        sizes[i++] = dfltFontSize;
  518. X
  519. X    theScreen.fontSizes = (short **) NewHandle(sizeof(short) * (i + 1));
  520. X
  521. X    if (theScreen.fontSizes != NULL)
  522. X        for (j = 0; j < i; j++)
  523. X            (*theScreen.fontSizes)[j] = sizes[j];
  524. X
  525. X    (*theScreen.fontSizes)[i++] = 0;
  526. X
  527. X    return(theScreen.fontSizes != NULL);
  528. X}
  529. X
  530. Xstatic void SetUpMenus()
  531. X
  532. X{
  533. X    long i, n, offset;
  534. X    Handle h;
  535. X    MenuHandle appMenuHndl, fontMenuHndl;
  536. X    Str255 ftitle;
  537. X
  538. X    SetMenuBar(GetNewMBar(theScreen.cmdKeyFlag ? menuBarID1 : menuBarID2));
  539. X    AddResMenu(GetMHandle(appleID), (ResType) 'DRVR');
  540. X    if (theScreen.colorFlag || !theScreen.env.hasColorQD) {
  541. X        InsertMenu(GetMenu(fontSizeID), 0);
  542. X        fontMenuHndl = GetMHandle(fontSizeID);
  543. X        offset = 1;
  544. X    }
  545. X    else {
  546. X        InsertMenu(GetMenu(screenID), 0);
  547. X        fontMenuHndl = GetMHandle(screenID);
  548. X        offset = 3;
  549. X    }
  550. X
  551. X    h = (Handle) GetString(aboutStrID);
  552. X    if (h != NULL) {
  553. X        MoveHHi(h);
  554. X        HLock(h);
  555. X        SetItem(GetMHandle(appleID), aboutItem, *h);
  556. X        HUnlock(h);
  557. X    }
  558. X
  559. X    for (i = 0; n = (*theScreen.fontSizes)[i]; i++) {
  560. X        NumToString(n, ftitle);
  561. X        (void) c2pstr(strcat(p2cstr((char *)ftitle), " point"));
  562. X        AppendMenu(fontMenuHndl, ftitle);
  563. X        if (n == theScreen.txSize) {
  564. X            theScreen.txNum = i + offset;
  565. X            CheckItem(fontMenuHndl, theScreen.txNum, true);
  566. X        }
  567. X    }
  568. X
  569. X    if (theScreen.appMenuProc != NULL) {
  570. X        appMenuHndl = GetMenu(theScreen.cmdKeyFlag ? appID1 : appID2);
  571. X        if (appMenuHndl != NULL) InsertMenu(appMenuHndl, 0);
  572. X    }
  573. X
  574. X    DrawMenuBar();
  575. X
  576. X    return;
  577. X}
  578. X
  579. Xstatic void LoadInfo(resourceFile, rfCreator, rfType)
  580. XStr255 resourceFile;
  581. XOSType rfCreator, rfType;
  582. X
  583. X{
  584. X    ResType dfltType;
  585. X    short dfltID;
  586. X    Str63 dfltName;
  587. X    short saveVol;
  588. X
  589. X    (void) GetVol(NULL, &saveVol);
  590. X    (void) SetVol(NULL, theScreen.env.sysVRefNum);
  591. X
  592. X    (void) Create(resourceFile, 0, rfCreator, rfType);
  593. X    CreateResFile(resourceFile);
  594. X
  595. X    theScreen.infoResFile = OpenResFile(resourceFile);
  596. X
  597. X    theScreen.infoHandle = GetResource(infoResType, infoResID);
  598. X
  599. X    if ( (theScreen.infoResFile != -1) &&
  600. X         (theScreen.infoResFile != HomeResFile(theScreen.infoHandle)) ) {
  601. X        GetResInfo(theScreen.infoHandle, &dfltID, &dfltType, dfltName);
  602. X        DetachResource(theScreen.infoHandle);
  603. X        AddResource(theScreen.infoHandle, dfltType, dfltID, dfltName);
  604. X    }
  605. X
  606. X    (void) SetVol(NULL, saveVol);
  607. X
  608. X    return;
  609. X}
  610. X
  611. Xstatic void UseInfo(boundsRectPtr, sizePtr, colorStdForePtr, colorStdBackPtr)
  612. XRect *boundsRectPtr;
  613. Xshort *sizePtr;
  614. Xlong *colorStdForePtr;
  615. Xlong *colorStdBackPtr;
  616. X
  617. X{
  618. X    InfoPtr theInfo;
  619. X
  620. X    LoadResource(theScreen.infoHandle);
  621. X
  622. X    theInfo = (InfoPtr) *theScreen.infoHandle;
  623. X
  624. X    *boundsRectPtr = theInfo->bounds;
  625. X    *sizePtr = theInfo->size;
  626. X
  627. X    if (theScreen.env.hasColorQD) {
  628. X        *colorStdForePtr = theInfo->colorStdFore;
  629. X        *colorStdBackPtr = theInfo->colorStdBack;
  630. X    }
  631. X    else {
  632. X        *colorStdForePtr = attrColorBlack;
  633. X        *colorStdBackPtr = attrColorWhite;
  634. X    }
  635. X
  636. X    return;
  637. X}
  638. X
  639. Xstatic void SaveInfo()
  640. X
  641. X{
  642. X    Point topLeft, bottomRight;
  643. X    InfoPtr theInfo;
  644. X
  645. X    if (theScreen.infoResFile == -1) return;
  646. X
  647. X    LoadResource(theScreen.infoHandle);
  648. X    HLock(theScreen.infoHandle);
  649. X
  650. X    theInfo = (InfoPtr) *theScreen.infoHandle;
  651. X
  652. X#ifdef THINK_C
  653. X    topLeft.h = thePort->portRect.left;
  654. X    topLeft.v = thePort->portRect.top;
  655. X
  656. X    bottomRight.h = thePort->portRect.right;
  657. X    bottomRight.v = thePort->portRect.bottom;
  658. X#else
  659. X    topLeft.h = qd.thePort->portRect.left;
  660. X    topLeft.v = qd.thePort->portRect.top;
  661. X
  662. X    bottomRight.h = qd.thePort->portRect.right;
  663. X    bottomRight.v = qd.thePort->portRect.bottom;
  664. X#endif
  665. X
  666. X    LocalToGlobal(&topLeft);
  667. X    LocalToGlobal(&bottomRight);
  668. X
  669. X    if ( (topLeft.h     != theInfo->bounds.left)   ||
  670. X         (topLeft.v     != theInfo->bounds.top)    ||
  671. X         (bottomRight.h != theInfo->bounds.right)  ||
  672. X         (bottomRight.v != theInfo->bounds.bottom)    ) {
  673. X
  674. X        theInfo->bounds.left   = topLeft.h;
  675. X        theInfo->bounds.top    = topLeft.v;
  676. X        theInfo->bounds.right  = bottomRight.h;
  677. X        theInfo->bounds.bottom = bottomRight.v;
  678. X        ChangedResource(theScreen.infoHandle);
  679. X
  680. X    }
  681. X
  682. X    if ( theScreen.txSize != theInfo->size ) {
  683. X
  684. X        theInfo->size = theScreen.txSize;
  685. X        ChangedResource(theScreen.infoHandle);
  686. X
  687. X    }
  688. X
  689. X    if ( (theScreen.colorStdFore != theInfo->colorStdFore) ||
  690. X         (theScreen.colorStdBack != theInfo->colorStdBack)    ) {
  691. X
  692. X        theInfo->colorStdFore = theScreen.colorStdFore;
  693. X        theInfo->colorStdBack = theScreen.colorStdBack;
  694. X        ChangedResource(theScreen.infoHandle);
  695. X
  696. X    }
  697. X
  698. X    HUnlock(theScreen.infoHandle);
  699. X
  700. X    return;
  701. X}
  702. X
  703. Xstatic void AdjustPortBounds(bounds)
  704. XRect *bounds;
  705. X
  706. X{
  707. X    long repos;
  708. X    long wid, hgt;
  709. X    Rect test, sect;
  710. X#ifndef THINK_C
  711. X    GDHandle gdh;
  712. X#endif
  713. X
  714. X    test.left = bounds->left;
  715. X    test.top = bounds->top - titleMargin;
  716. X    test.right = bounds->right;
  717. X    test.bottom = bounds->top;
  718. X
  719. X#ifdef THINK_C            /* Ignore color issues. -- BS  */
  720. X
  721. X    (void) SectRect (&screenBits.bounds, &test, §);
  722. X    wid = sect.right - sect.left;
  723. X    hgt = sect.bottom - sect.top;
  724. X    if ((wid < titleMinWid) || (hgt < titleMinHgt))
  725. X        OffsetRect (bounds,
  726. X            (screenBits.bounds.left + titleDfltLeft) - bounds->left\,
  727. X            (screenBits.bounds.top + titleDfltTop) - bounds->top);
  728. X
  729. X#else
  730. X
  731. X    repos = true;
  732. X
  733. X    if (!theScreen.env.hasColorQD) {
  734. X
  735. X        (void) SectRect(&qd.screenBits.bounds, &test, §);
  736. X        wid = sect.right - sect.left;
  737. X        hgt = sect.bottom - sect.top;
  738. X        if ( (wid >= titleMinWid) && (hgt >= titleMinHgt) ) repos = false;
  739. X
  740. X    }
  741. X
  742. X    else {
  743. X
  744. X        gdh = GetDeviceList();
  745. X
  746. X        while ( (gdh != NULL) && (repos) ) {
  747. X
  748. X            if ( ((*gdh)->gdFlags && (1 << screenDevice)) &&
  749. X                    ((*gdh)->gdFlags && (1 << screenActive)) ) {
  750. X
  751. X                (void) SectRect(&(*gdh)->gdRect, &test, §);
  752. X                wid = sect.right - sect.left;
  753. X                hgt = sect.bottom - sect.top;
  754. X                if ( (wid >= titleMinWid) && (hgt >= titleMinHgt) ) repos = false;
  755. X
  756. X            }
  757. X
  758. X            gdh = GetNextDevice(gdh);
  759. X
  760. X        }
  761. X
  762. X    }
  763. X
  764. X    if (repos)
  765. X        OffsetRect(bounds,
  766. X            (qd.screenBits.bounds.left + titleDfltLeft) - bounds->left,
  767. X            (qd.screenBits.bounds.top + titleDfltTop) - bounds->top);
  768. X#endif
  769. X
  770. X    return;
  771. X}
  772. X
  773. Xstatic void SetScreenParameters()
  774. X
  775. X{
  776. X    long stdWid, stdHgt;
  777. X    Rect stdState;
  778. X    WStateData **zoomInfo;
  779. X
  780. X    GetFontInfo(&theScreen.info);
  781. X    theScreen.charPDims.h = theScreen.info.widMax;
  782. X    theScreen.charPDims.v = theScreen.info.ascent
  783. X                         + theScreen.info.descent
  784. X                         + theScreen.info.leading;
  785. X
  786. X    theScreen.scrnCRect.left = 0;
  787. X    theScreen.scrnCRect.right = theScreen.scrnCDims.h;
  788. X    theScreen.scrnCRect.top = 0;
  789. X    theScreen.scrnCRect.bottom = theScreen.scrnCDims.v;
  790. X
  791. X    theScreen.scrnLRect = theScreen.scrnCRect;
  792. X    theScreen.scrnLRect.right *= theScreen.charPDims.h;
  793. X    theScreen.scrnLRect.bottom *= theScreen.charPDims.v;
  794. X
  795. X    theScreen.scrnXLRect = theScreen.scrnLRect;
  796. X    InsetRect(&theScreen.scrnXLRect, -4, -4);
  797. X
  798. X    theScreen.sizeLimitPRect.left = 64;
  799. X    theScreen.sizeLimitPRect.top = 64;
  800. X
  801. X    theScreen.sizeLimitPRect.right =
  802. X        theScreen.scrnXLRect.right - theScreen.scrnXLRect.left + 16;
  803. X    if (theScreen.sizeLimitPRect.right < 65) theScreen.sizeLimitPRect.right = 65;
  804. X
  805. X    theScreen.sizeLimitPRect.bottom =
  806. X        theScreen.scrnXLRect.bottom - theScreen.scrnXLRect.top + 16;
  807. X    if (theScreen.sizeLimitPRect.bottom < 65)
  808. X      theScreen.sizeLimitPRect.bottom = 65;
  809. X
  810. X#ifdef THINK_C
  811. X    theScreen.dragLimitGRect = screenBits.bounds;
  812. X#else
  813. X    theScreen.dragLimitGRect = qd.screenBits.bounds;
  814. X#endif
  815. X    theScreen.dragLimitGRect.top += GetMBarHeight();
  816. X    InsetRect(&theScreen.dragLimitGRect, -4, -4);
  817. X
  818. X    stdState = theScreen.stdStateGRect;
  819. X    stdWid = stdState.right - stdState.left - theScreen.sizeLimitPRect.right + 1;
  820. X    stdHgt = stdState.bottom - stdState.top
  821. X      - theScreen.sizeLimitPRect.bottom + 1;
  822. X
  823. X    if (stdWid > 0) {
  824. X        InsetRect(&stdState, stdWid / 2, 0);
  825. X        stdState.right -= stdWid % 2;
  826. X    }
  827. X
  828. X    if (stdHgt > 0) {
  829. X        InsetRect(&stdState, 0, stdHgt / 2);
  830. X        stdState.bottom -= stdHgt % 2;
  831. X    }
  832. X
  833. X    zoomInfo = (WStateData **) ((WindowPeek) theScreen.window)->dataHandle;
  834. X    (*zoomInfo)->stdState = stdState;
  835. X
  836. X    theScreen.mouseLRect = theScreen.mouseCRect;
  837. X    theScreen.mouseLRect.left *= theScreen.charPDims.h;
  838. X    theScreen.mouseLRect.top *= theScreen.charPDims.v;
  839. X    theScreen.mouseLRect.right *= theScreen.charPDims.h;
  840. X    theScreen.mouseLRect.bottom *= theScreen.charPDims.v;
  841. X
  842. X    return;
  843. X}
  844. X
  845. Xstatic void SetScreenPortSize()
  846. X
  847. X{
  848. X    long oldW, oldH;
  849. X    long newW, newH;
  850. X
  851. X    oldW = theScreen.window->portRect.right;
  852. X    oldH = theScreen.window->portRect.bottom;
  853. X
  854. X    if (oldW > theScreen.sizeLimitPRect.right-1)
  855. X        newW = theScreen.sizeLimitPRect.right-1;
  856. X    else if (oldW < theScreen.sizeLimitPRect.left)
  857. X        newW = theScreen.sizeLimitPRect.left;
  858. X    else
  859. X        newW = oldW;
  860. X
  861. X    if (oldH > theScreen.sizeLimitPRect.bottom-1)
  862. X        newH = theScreen.sizeLimitPRect.bottom-1;
  863. X    else if (oldH < theScreen.sizeLimitPRect.top)
  864. X        newH = theScreen.sizeLimitPRect.top;
  865. X    else
  866. X        newH = oldH;
  867. X
  868. X    if ( (newW != oldW) || (newH != oldH) )
  869. X        SizeWindow(theScreen.window, newW, newH, true);
  870. X
  871. X    return;
  872. X}
  873. X
  874. Xstatic void SetScreenPortRects()
  875. X
  876. X{
  877. X    ClipRect(&theScreen.window->portRect);
  878. X
  879. X    theScreen.windowW = theScreen.window->portRect.right;
  880. X    theScreen.windowH =    theScreen.window->portRect.bottom;
  881. X
  882. X    theScreen.vScrollPRect =
  883. X    theScreen.hScrollPRect =
  884. X    theScreen.growPRect    =
  885. X    theScreen.picPRect     = theScreen.window->portRect;
  886. X
  887. X    theScreen.vScrollPRect.right += 1;
  888. X    theScreen.vScrollPRect.top -= 1;
  889. X    theScreen.vScrollPRect.left = theScreen.vScrollPRect.right - 16;
  890. X    theScreen.vScrollPRect.bottom -= 14;
  891. X
  892. X    theScreen.hScrollPRect.bottom += 1;
  893. X    theScreen.hScrollPRect.left -= 1;
  894. X    theScreen.hScrollPRect.top = theScreen.hScrollPRect.bottom - 16;
  895. X    theScreen.hScrollPRect.right -= 14;
  896. X
  897. X    theScreen.growPRect.top = theScreen.growPRect.bottom - 15;
  898. X    theScreen.growPRect.left = theScreen.growPRect.right - 15;
  899. X    theScreen.growPRect.bottom += 1;
  900. X    theScreen.growPRect.right += 1;
  901. X
  902. X    theScreen.picPRect.right -= 15;
  903. X    theScreen.picPRect.bottom -= 15;
  904. X
  905. X    return;
  906. X}
  907. X
  908. Xstatic void SetScreenDrawRects()
  909. X
  910. X{
  911. X    theScreen.picLRect = theScreen.picPRect;
  912. X    OffsetRect(&theScreen.picLRect, theScreen.origin.h, theScreen.origin.v);
  913. X
  914. X    SectRect(&theScreen.picLRect, &theScreen.scrnLRect, &theScreen.drawLRect);
  915. X
  916. X    theScreen.drawXCRect = theScreen.drawLRect;
  917. X    theScreen.drawXCRect.right += theScreen.charPDims.h - 1;
  918. X    theScreen.drawXCRect.bottom += theScreen.charPDims.v - 1;
  919. X    theScreen.drawXCRect.left /= theScreen.charPDims.h;
  920. X    theScreen.drawXCRect.right /= theScreen.charPDims.h;
  921. X    theScreen.drawXCRect.top /= theScreen.charPDims.v;
  922. X    theScreen.drawXCRect.bottom /= theScreen.charPDims.v;
  923. X
  924. X    theScreen.drawXLRect = theScreen.drawXCRect;
  925. X    theScreen.drawXLRect.left *= theScreen.charPDims.h;
  926. X    theScreen.drawXLRect.right *= theScreen.charPDims.h;
  927. X    theScreen.drawXLRect.top *= theScreen.charPDims.v;
  928. X    theScreen.drawXLRect.bottom *= theScreen.charPDims.v;
  929. X
  930. X    return;
  931. X}
  932. X
  933. Xstatic int RepositionScreen(deltaH, deltaV)
  934. Xint deltaH, deltaV;
  935. X
  936. X{
  937. X    int changed;
  938. X    int newH, newV;
  939. X    int min, max;
  940. X    RgnHandle updtRgn;
  941. X
  942. X    newH = GetCtlValue(theScreen.hScrollHandle) + deltaH;
  943. X    if (newH < (min = GetCtlMin(theScreen.hScrollHandle))) newH = min;
  944. X    if (newH > (max = GetCtlMax(theScreen.hScrollHandle))) newH = max;
  945. X
  946. X    newV = GetCtlValue(theScreen.vScrollHandle) + deltaV;
  947. X    if (newV < (min = GetCtlMin(theScreen.vScrollHandle))) newV = min;
  948. X    if (newV > (max = GetCtlMax(theScreen.vScrollHandle))) newV = max;
  949. X
  950. X    if ( (newH != theScreen.origin.h) || (newV != theScreen.origin.v) ) {
  951. X        if (newH != theScreen.origin.h)
  952. X            SetCtlValue(theScreen.hScrollHandle, newH);
  953. X        if (newV != theScreen.origin.v)
  954. X            SetCtlValue(theScreen.vScrollHandle, newV);
  955. X        updtRgn = NewRgn();
  956. X        ScrollRect(&theScreen.picPRect,
  957. X            theScreen.origin.h - newH,
  958. X            theScreen.origin.v - newV,
  959. X            updtRgn);
  960. X        InvalRgn(updtRgn);
  961. X        DisposeRgn(updtRgn);
  962. X        theScreen.origin.h = newH;
  963. X        theScreen.origin.v = newV;
  964. X        SetScreenDrawRects();
  965. X        changed = true;
  966. X    }
  967. X
  968. X    else
  969. X        changed = false;
  970. X
  971. X    return(changed);
  972. X}
  973. X
  974. X/* ARGH!  This routine needs error checking code. */
  975. X
  976. Xlong InitScreenMgr(h, v, title, resFile, rfCreator, rfType, fileMenuProc,
  977. X          appMenuProc, colorFlag)
  978. Xlong h, v;
  979. Xchar *title;
  980. Xchar *resFile;
  981. XOSType rfCreator, rfType;
  982. Xvoid (*fileMenuProc)(long item);
  983. Xvoid (*appMenuProc)(long item);
  984. Xlong colorFlag;
  985. X
  986. X{
  987. X    long bytes, i;
  988. X    Rect bounds;
  989. X    WStateData **zoomInfo;
  990. X    Str63 pstrTitle, pstrResFile;
  991. X
  992. X    Prolog();
  993. X
  994. X    SysEnvirons(curSysEnvVers, &theScreen.env);
  995. X
  996. X    theScreen.wneImplemented = WNETest(&theScreen.env);
  997. X
  998. X    theScreen.escMapFlag = NoEscTest(&theScreen.env);
  999. X
  1000. X    theScreen.backgrounding = false;
  1001. X
  1002. X#if 1
  1003. X    {
  1004. X      char keys[128];
  1005. X      GetKeys ((KeyMap *) &keys);
  1006. X      theScreen.reconfigFlag = keys[7] & 0x04;
  1007. X    }
  1008. X#else
  1009. X    theScreen.reconfigFlag = ((char *) KeyMapLM)[7] & 0x04;
  1010. X#endif
  1011. X
  1012. X    strncpy(pstrTitle, title, 63);
  1013. X    strncpy(pstrResFile, resFile, 63);
  1014. X    pstrTitle[63] = '\0';
  1015. X    pstrResFile[63] = '\0';
  1016. X    c2pstr(pstrTitle);
  1017. X    c2pstr(pstrResFile);
  1018. X
  1019. X    LoadInfo(pstrResFile, rfCreator, rfType);
  1020. X
  1021. X    UseInfo(&bounds,
  1022. X        &theScreen.txSize,
  1023. X        &theScreen.colorStdFore,
  1024. X        &theScreen.colorStdBack);
  1025. X
  1026. X    theScreen.versHandle = GetResource (rfCreator, 0);
  1027. X
  1028. X    AdjustPortBounds(&bounds);
  1029. X
  1030. X    LoadCursors();
  1031. X
  1032. X    theScreen.waitFlag = false;
  1033. X
  1034. X    theScreen.txNum = -1;
  1035. X
  1036. X    theScreen.fileMenuProc = fileMenuProc;
  1037. X    theScreen.appMenuProc = appMenuProc;
  1038. X
  1039. X    theScreen.colorFlag = colorFlag;
  1040. X
  1041. X    switch (theScreen.env.keyBoardType) {
  1042. X
  1043. X        /* These are the old machines that we know.  */
  1044. X        case envUnknownKbd:
  1045. X        case envMacKbd:
  1046. X        case envMacAndPad:
  1047. X        case envMacPlusKbd:
  1048. X          theScreen.cmdKeyFlag = false;
  1049. X          break;
  1050. X
  1051. X        case envAExtendKbd:
  1052. X        case envStandADBKbd:
  1053. X        case 10:        /* Mac Classic.  */
  1054. X          /* Anything else is probably new and has ctrl.  */
  1055. X        default:
  1056. X          theScreen.cmdKeyFlag = true;
  1057. X
  1058. X    }
  1059. X
  1060. X    theScreen.mouseFlag = false;
  1061. X    theScreen.mouseCRect.left    =
  1062. X    theScreen.mouseCRect.top    =
  1063. X    theScreen.mouseCRect.right    =
  1064. X    theScreen.mouseCRect.bottom    = 0;
  1065. X
  1066. X    bytes = h * v;
  1067. X    theScreen.chars = (char **) NewHandle(bytes);
  1068. X    theScreen.attrs = (char **) NewHandle(bytes);
  1069. X
  1070. X    memset(*theScreen.chars, ' ', bytes);
  1071. X    memset(*theScreen.attrs, attrNormal, bytes);
  1072. X
  1073. X    bytes = v * sizeof(short);
  1074. X    theScreen.updLeft  = (short **) NewHandle(bytes);
  1075. X    theScreen.updRight = (short **) NewHandle(bytes);
  1076. X
  1077. X    for (i = 0; i < v; i++) {
  1078. X        (*theScreen.updLeft)[i] = h;
  1079. X        (*theScreen.updRight)[i] = 0;
  1080. X    }
  1081. X
  1082. X    theScreen.cursor.h = 0;
  1083. X    theScreen.cursor.v = 0;
  1084. X
  1085. X    theScreen.scrnCDims.h = h;
  1086. X    theScreen.scrnCDims.v = v;
  1087. X
  1088. X    FlushQueue();
  1089. X
  1090. X    DefaultCursor();
  1091. X
  1092. X    GetFontSizes();
  1093. X
  1094. X    SetUpMenus();
  1095. X
  1096. X    theScreen.window = NewWindow(NULL, &bounds, pstrTitle,
  1097. X                                 false, zoomDocProc,
  1098. X                                 (WindowPtr) -1, true, 0);
  1099. X
  1100. X    SetPort(theScreen.window);
  1101. X
  1102. X    zoomInfo = (WStateData **) ((WindowPeek) theScreen.window)->dataHandle;
  1103. X    theScreen.stdStateGRect = (*zoomInfo)->stdState;
  1104. X
  1105. X    TextFont(theScreen.txFont);
  1106. X    TextSize(theScreen.txSize);
  1107. X
  1108. X    SetScreenParameters();
  1109. X    SetScreenPortSize();
  1110. X    SetScreenPortRects();
  1111. X
  1112. X    theScreen.origin.h = theScreen.scrnXLRect.left;
  1113. X    theScreen.origin.v = theScreen.scrnXLRect.top;
  1114. X
  1115. X    SetScreenDrawRects();
  1116. X
  1117. X    theScreen.hScrollHandle = NewControl(theScreen.window,
  1118. X        &theScreen.hScrollPRect, "", true,
  1119. X        theScreen.origin.h,
  1120. X        theScreen.scrnXLRect.left,
  1121. X        theScreen.scrnXLRect.right - theScreen.picPRect.right,
  1122. X        scrollBarProc, 0L);
  1123. X    theScreen.vScrollHandle = NewControl(theScreen.window,
  1124. X        &theScreen.vScrollPRect, "", true,
  1125. X        theScreen.origin.v,
  1126. X        theScreen.scrnXLRect.top,
  1127. X        theScreen.scrnXLRect.bottom - theScreen.picPRect.bottom,
  1128. X        scrollBarProc, 0L);
  1129. X
  1130. X    ShowWindow(theScreen.window);
  1131. X    EraseRect(&theScreen.picPRect);
  1132. X
  1133. X    theScreen.aboutProc = NULL;
  1134. X    theScreen.quitProc = NULL;
  1135. X
  1136. X    theScreen.keyFlush = theScreen.mouseFlush = TickCount();
  1137. X
  1138. X    theScreen.stack = NULL;
  1139. X
  1140. X    return(scrnErrOk);
  1141. X}
  1142. X
  1143. Xstatic void ChangeScreenFontSize(num)
  1144. Xlong num;
  1145. X
  1146. X{
  1147. X    Point oldCharPDims;
  1148. X
  1149. X    DisposeControl(theScreen.hScrollHandle);
  1150. X    DisposeControl(theScreen.vScrollHandle);
  1151. X
  1152. X    oldCharPDims = theScreen.charPDims;
  1153. X
  1154. X    theScreen.txSize = (*theScreen.fontSizes)[num];
  1155. X
  1156. X    TextSize(theScreen.txSize);
  1157. X
  1158. X    SetScreenParameters();
  1159. X    SetScreenPortSize();
  1160. X    SetScreenPortRects();
  1161. X
  1162. X    theScreen.origin.h *= theScreen.charPDims.h;
  1163. X    theScreen.origin.h /= oldCharPDims.h;
  1164. X    if (theScreen.origin.h < theScreen.scrnXLRect.left)
  1165. X        theScreen.origin.h = theScreen.scrnXLRect.left;
  1166. X    if (theScreen.origin.h > theScreen.scrnXLRect.right
  1167. X        - theScreen.picPRect.right)
  1168. X        theScreen.origin.h = theScreen.scrnXLRect.right - theScreen.picPRect.right;
  1169. X    theScreen.origin.v *= theScreen.charPDims.v;
  1170. X    theScreen.origin.v /= oldCharPDims.v;
  1171. X    if (theScreen.origin.v < theScreen.scrnXLRect.top)
  1172. X        theScreen.origin.v = theScreen.scrnXLRect.top;
  1173. X    if (theScreen.origin.v > theScreen.scrnXLRect.bottom -
  1174. X        theScreen.picPRect.bottom)
  1175. X        theScreen.origin.v = theScreen.scrnXLRect.bottom
  1176. X          - theScreen.picPRect.bottom;
  1177. X
  1178. X    SetScreenDrawRects();
  1179. X
  1180. X    theScreen.hScrollHandle = NewControl(theScreen.window,
  1181. X        &theScreen.hScrollPRect, "", true,
  1182. X        theScreen.origin.h,
  1183. X        theScreen.scrnXLRect.left,
  1184. X        theScreen.scrnXLRect.right - theScreen.picPRect.right,
  1185. X        scrollBarProc, 0L);
  1186. X    theScreen.vScrollHandle = NewControl(theScreen.window,
  1187. X        &theScreen.vScrollPRect, "", true,
  1188. X        theScreen.origin.v,
  1189. X        theScreen.scrnXLRect.top,
  1190. X        theScreen.scrnXLRect.bottom - theScreen.picPRect.bottom,
  1191. X        scrollBarProc, 0L);
  1192. X
  1193. X    InvalRect(&theScreen.picPRect);
  1194. X    InvalRect(&theScreen.growPRect);
  1195. X
  1196. X    return;
  1197. X}
  1198. X
  1199. Xvoid CloseScreenMgr()
  1200. X
  1201. X{
  1202. X    SaveInfo();
  1203. X
  1204. X    while (theScreen.stack != NULL)
  1205. X        DisposeStackTop();
  1206. X
  1207. X    DisposHandle((Handle) theScreen.fontSizes);
  1208. X
  1209. X    DisposHandle((Handle) theScreen.chars);
  1210. X    DisposHandle((Handle) theScreen.attrs);
  1211. X
  1212. X    DisposeWindow(theScreen.window);
  1213. X
  1214. X    return;
  1215. X}
  1216. X
  1217. Xpascal void DrawDefaultBorder(theWindow, theItem)
  1218. XWindowPtr theWindow;
  1219. Xshort theItem;
  1220. X
  1221. X{
  1222. X    short itsType;
  1223. X    Handle itsHandle;
  1224. X    Rect itsRect;
  1225. X
  1226. X    GetDItem((DialogPtr) theWindow, theItem, &itsType, &itsHandle, &itsRect);
  1227. X    PenSize(3, 3);
  1228. X    ForeColor(redColor);
  1229. X    FrameRoundRect(&itsRect, 16, 16);
  1230. X    ForeColor(blackColor);
  1231. X    PenSize(1, 1);
  1232. X
  1233. X    return;
  1234. X}
  1235. X
  1236. Xpascal void DrawGroupRect(theWindow, theItem)
  1237. XWindowPtr theWindow;
  1238. Xshort theItem;
  1239. X
  1240. X{
  1241. X    short itsType;
  1242. X    Handle itsHandle;
  1243. X    Rect itsRect;
  1244. X
  1245. X    GetDItem((DialogPtr) theWindow, theItem, &itsType, &itsHandle, &itsRect);
  1246. X    FrameRect(&itsRect);
  1247. X
  1248. X    return;
  1249. X}
  1250. X
  1251. Xstatic void DoAboutDialog()
  1252. X
  1253. X{
  1254. X    DialogPtr theDialog;
  1255. X    short itemHit;
  1256. X    short itsType;
  1257. X    Handle itsHandle;
  1258. X    Rect itsRect;
  1259. X    long h, v;
  1260. X
  1261. X    theDialog = GetNewDialog(aboutDlgID, nil, (WindowPtr) -1);
  1262. X
  1263. X    CenterScreenDLOG(aboutDlgID, fixThird, fixThird, &h, &v);
  1264. X    MoveWindow((WindowPtr) theDialog, (short) h, (short) v, false);
  1265. X
  1266. X    GetDItem(theDialog, ok, &itsType, &itsHandle, &itsRect);
  1267. X    InsetRect(&itsRect, -4, -4);
  1268. X
  1269. X    SetDItem(theDialog, aboutDfltBorder, userItem,
  1270. X         (Handle) DrawDefaultBorder, &itsRect);
  1271. X
  1272. X    if (theScreen.versHandle) {
  1273. X      MoveHHi (theScreen.versHandle);
  1274. X      HLock (theScreen.versHandle);
  1275. X      ParamText(*(theScreen.versHandle), nil, nil, nil);
  1276. X      }
  1277. X
  1278. X    ShowWindow((WindowPtr) theDialog);
  1279. X
  1280. X    do {
  1281. X        ModalDialog(nil, &itemHit);
  1282. X    } while (itemHit != ok);
  1283. X
  1284. X    if (theScreen.versHandle)
  1285. X      HUnlock(theScreen.versHandle);
  1286. X
  1287. X    DisposDialog(theDialog);
  1288. X
  1289. X    return;
  1290. X}
  1291. X
  1292. Xstatic void DoColorsDialog()
  1293. X
  1294. X{
  1295. X    DialogPtr theDialog;
  1296. X    long saveForeColor, saveBackColor;
  1297. X    short itemHit;
  1298. X    short itsType;
  1299. X    Handle itsHandle, fgHandle, bgHandle;
  1300. X    Rect itsRect;
  1301. X    GrafPtr savePort;
  1302. X    long redrawFlag;
  1303. X    long h, v;
  1304. X
  1305. X    theDialog = GetNewDialog(colorsDlgID, nil, (WindowPtr) -1);
  1306. X
  1307. X    CenterScreenDLOG(colorsDlgID, fixHalf, fixThird, &h, &v);
  1308. X    MoveWindow((WindowPtr) theDialog, (short) h, (short) v, false);
  1309. X
  1310. X    GetDItem(theDialog, ok, &itsType, &itsHandle, &itsRect);
  1311. X    InsetRect(&itsRect, -4, -4);
  1312. X
  1313. X    SetDItem(theDialog, colorsDfltBorder, userItem,
  1314. X         (Handle) DrawDefaultBorder, &itsRect);
  1315. X
  1316. X    GetDItem(theDialog, foregroundRect, &itsType, &itsHandle, &itsRect);
  1317. X    SetDItem(theDialog, foregroundRect, itsType, (Handle) DrawGroupRect,
  1318. X         &itsRect);
  1319. X    GetDItem(theDialog, backgroundRect, &itsType, &itsHandle, &itsRect);
  1320. X    SetDItem(theDialog, backgroundRect, itsType, (Handle) DrawGroupRect,
  1321. X         &itsRect);
  1322. X
  1323. X    GetDItem(theDialog, foreColors+theScreen.colorStdFore, &itsType,
  1324. X         &fgHandle, &itsRect);
  1325. X    SetCtlValue((ControlHandle) fgHandle, true);
  1326. X
  1327. X    GetDItem(theDialog, backColors+theScreen.colorStdBack, &itsType,
  1328. X         &bgHandle, &itsRect);
  1329. X    SetCtlValue((ControlHandle) bgHandle, true);
  1330. X
  1331. X    ShowWindow((WindowPtr) theDialog);
  1332. X
  1333. X    saveForeColor = theScreen.colorStdFore;
  1334. X    saveBackColor = theScreen.colorStdBack;
  1335. X
  1336. X    do {
  1337. X        redrawFlag = false;
  1338. X        ModalDialog(nil, &itemHit);
  1339. X        if ( (itemHit >= foreColors) &&
  1340. X            (itemHit <= (foreColors+7)) &&
  1341. X            (itemHit != (foreColors+theScreen.colorStdFore)) ) {
  1342. X                theScreen.colorStdFore = itemHit - foreColors;
  1343. X                SetCtlValue((ControlHandle) fgHandle, false);
  1344. X                GetDItem(theDialog, foreColors+theScreen.colorStdFore,
  1345. X                    &itsType, &fgHandle, &itsRect);
  1346. X                SetCtlValue((ControlHandle) fgHandle, true);
  1347. X                redrawFlag = true;
  1348. X        }
  1349. X        else if ( (itemHit >= backColors) &&
  1350. X            (itemHit <= (backColors+7)) &&
  1351. X            (itemHit != (backColors+theScreen.colorStdBack)) ) {
  1352. X                theScreen.colorStdBack = itemHit - backColors;
  1353. X                SetCtlValue((ControlHandle) bgHandle, false);
  1354. X                GetDItem(theDialog, backColors+theScreen.colorStdBack,
  1355. X                    &itsType, &bgHandle, &itsRect);
  1356. X                SetCtlValue((ControlHandle) bgHandle, true);
  1357. X                redrawFlag = true;
  1358. X        }
  1359. X        if (redrawFlag) {
  1360. X            GetPort(&savePort);
  1361. X            SetPort(theScreen.window);
  1362. X            InvalRect(&theScreen.picPRect);
  1363. X            UpdateScreen();
  1364. X            SetPort(savePort);
  1365. X        }
  1366. X    } while ( (itemHit != ok) && (itemHit != cancel) );
  1367. X
  1368. X    if (itemHit == cancel)
  1369. X        if ( (theScreen.colorStdFore != saveForeColor) ||
  1370. X            (theScreen.colorStdBack != saveBackColor) ) {
  1371. X            theScreen.colorStdFore = saveForeColor;
  1372. X            theScreen.colorStdBack = saveBackColor;
  1373. X            GetPort(&savePort);
  1374. X            SetPort(theScreen.window);
  1375. X            InvalRect(&theScreen.picPRect);
  1376. X            UpdateScreen();
  1377. X            SetPort(savePort);
  1378. X        }
  1379. X
  1380. X    DisposDialog(theDialog);
  1381. X
  1382. X    return;
  1383. X}
  1384. X
  1385. Xstatic void DoAppleMenu(item)
  1386. Xlong item;
  1387. X
  1388. X{
  1389. X    GrafPtr savePort;
  1390. X    Str255 daName;
  1391. X
  1392. X    switch (item) {
  1393. X
  1394. X        case aboutItem:        if (theScreen.aboutProc != NULL)
  1395. X                                (*theScreen.aboutProc)();
  1396. X                            else
  1397. X                                DoAboutDialog();
  1398. X                            break;
  1399. X
  1400. X        default:            GetItem(GetMHandle(appleID), item, daName);
  1401. X                            GetPort(&savePort);
  1402. X                            OpenDeskAcc(daName);
  1403. X                            SetPort(savePort);
  1404. X                            break;
  1405. X
  1406. X    }
  1407. X
  1408. X    return;
  1409. X}
  1410. X
  1411. Xstatic void DoFileMenu(item)
  1412. Xlong item;
  1413. X
  1414. X{
  1415. X    switch (item) {
  1416. X
  1417. X        case closeBoxItem:    HideWindow(theScreen.window);
  1418. X                            break;
  1419. X
  1420. X        case openItem:        ShowWindow(theScreen.window);
  1421. X                            break;
  1422. X
  1423. X        case closeItem:        HideWindow(theScreen.window);
  1424. X                            break;
  1425. X
  1426. X        case quitItem:        if (theScreen.quitProc != NULL) {
  1427. X                                if (!theScreen.quitReturns) HiliteMenu(0);
  1428. X                                (*theScreen.quitProc)();
  1429. X                            }
  1430. X                            break;
  1431. X
  1432. X    }
  1433. X
  1434. X    return;
  1435. X}
  1436. X
  1437. Xstatic void DoEditMenu(item)
  1438. Xlong item;
  1439. X
  1440. X{
  1441. X    switch (item) {
  1442. X
  1443. X        case undoItem:
  1444. X        case cutItem:
  1445. X        case copyItem:
  1446. X        case pasteItem:
  1447. X        case clearItem:        SystemEdit(item-1);
  1448. X                            break;
  1449. X
  1450. X    }
  1451. X
  1452. X    return;
  1453. X}
  1454. X
  1455. Xstatic void DoFontChange(hndl, item, offset)
  1456. XMenuHandle hndl;
  1457. Xlong item, offset;
  1458. X
  1459. X{
  1460. X    if (item != theScreen.txNum) {
  1461. X        if (theScreen.txNum > 0)
  1462. X            CheckItem(hndl, theScreen.txNum, false);
  1463. X        ChangeScreenFontSize(item - offset);
  1464. X        theScreen.txNum = item;
  1465. X        CheckItem(hndl, theScreen.txNum, true);
  1466. X    }
  1467. X
  1468. X    return;
  1469. X}
  1470. X
  1471. Xstatic void DoScreenMenu(item)
  1472. Xlong item;
  1473. X
  1474. X{
  1475. X    switch (item) {
  1476. X
  1477. X        case colorsItem:    DoColorsDialog();
  1478. X                            break;
  1479. X
  1480. X        default:            DoFontChange(GetMHandle(screenID), item, 3);
  1481. X                            break;
  1482. X
  1483. X    }
  1484. X
  1485. X    return;
  1486. X}
  1487. X
  1488. Xstatic void DoFontSizeMenu(item)
  1489. Xlong item;
  1490. X
  1491. X{
  1492. X    DoFontChange(GetMHandle(fontSizeID), item, 1L);
  1493. X    return;
  1494. X}
  1495. X
  1496. Xstatic void DoMenuItem(select)
  1497. Xlong select;
  1498. X
  1499. X{
  1500. X    long menuID, menuItem;
  1501. X
  1502. X    menuID = HiWord(select);
  1503. X    menuItem = LoWord(select);
  1504. X
  1505. X    switch (menuID) {
  1506. X
  1507. X        case appleID:        DoAppleMenu(menuItem);
  1508. X                            break;
  1509. X
  1510. X        case fileID1:
  1511. X        case fileID2:        if (theScreen.fileMenuProc != NULL)
  1512. X                                (*theScreen.fileMenuProc)(menuItem);
  1513. X                            else
  1514. X                                DoFileMenu(menuItem);
  1515. X                            break;
  1516. X
  1517. X        case editID1:
  1518. X        case editID2:        DoEditMenu(menuItem);
  1519. X                            break;
  1520. X
  1521. X        case screenID:        DoScreenMenu(menuItem);
  1522. X                            break;
  1523. X
  1524. X        case fontSizeID:    DoFontSizeMenu(menuItem);
  1525. X                            break;
  1526. X
  1527. X        case appID1:
  1528. X        case appID2:        if (theScreen.appMenuProc != NULL)
  1529. X                                (*theScreen.appMenuProc)(menuItem);
  1530. X                            break;
  1531. X
  1532. X    }
  1533. X
  1534. X    HiliteMenu(0);
  1535. X
  1536. X    return;
  1537. X}
  1538. X
  1539. Xstatic void DoDrag(whichWindow, cursorLoc)
  1540. XWindowPtr whichWindow;
  1541. XPoint *cursorLoc;
  1542. X
  1543. X{
  1544. X    if (whichWindow == theScreen.window)
  1545. X        DragWindow(whichWindow, *cursorLoc, &theScreen.dragLimitGRect);
  1546. X
  1547. X    return;
  1548. X}
  1549. X
  1550. Xstatic void HandlePreGrow(oldWidth, oldHeight, newWidth, newHeight)
  1551. Xlong oldWidth, oldHeight, newWidth, newHeight;
  1552. X
  1553. X{
  1554. X    if (newWidth > oldWidth) {
  1555. X        InvalRect(&theScreen.vScrollPRect);
  1556. X        InvalRect(&theScreen.growPRect);
  1557. X    }
  1558. X    if (newHeight > oldHeight) {
  1559. X        InvalRect(&theScreen.hScrollPRect);
  1560. X        InvalRect(&theScreen.growPRect);
  1561. X    }
  1562. X    return;
  1563. X}
  1564. X
  1565. Xstatic void HandlePostGrow(oldWidth, oldHeight, newWidth, newHeight)
  1566. Xlong oldWidth, oldHeight, newWidth, newHeight;
  1567. X
  1568. X{
  1569. X    if ( (newWidth < oldWidth) || (newHeight < oldHeight) )
  1570. X        InvalRect(&theScreen.growPRect);
  1571. X    HideControl(theScreen.hScrollHandle);
  1572. X    HideControl(theScreen.vScrollHandle);
  1573. X    if (newWidth != oldWidth) {
  1574. X        MoveControl(theScreen.vScrollHandle,
  1575. X            theScreen.vScrollPRect.left, theScreen.vScrollPRect.top);
  1576. X        SizeControl(theScreen.hScrollHandle,
  1577. X            theScreen.hScrollPRect.right - theScreen.hScrollPRect.left,
  1578. X            theScreen.hScrollPRect.bottom - theScreen.hScrollPRect.top);
  1579. X        SetCtlMax(theScreen.hScrollHandle,
  1580. X            theScreen.scrnXLRect.right - theScreen.picPRect.right);
  1581. X    }
  1582. X    if (newHeight != oldHeight) {
  1583. X        MoveControl(theScreen.hScrollHandle,
  1584. X            theScreen.hScrollPRect.left, theScreen.hScrollPRect.top);
  1585. X        SizeControl(theScreen.vScrollHandle,
  1586. X            theScreen.vScrollPRect.right - theScreen.vScrollPRect.left,
  1587. X            theScreen.vScrollPRect.bottom - theScreen.vScrollPRect.top);
  1588. X        SetCtlMax(theScreen.vScrollHandle,
  1589. X            theScreen.scrnXLRect.bottom - theScreen.picPRect.bottom);
  1590. X    }
  1591. X    RepositionScreen(0, 0);
  1592. X    ShowControl(theScreen.hScrollHandle);
  1593. X    ShowControl(theScreen.vScrollHandle);
  1594. X    ValidRect(&theScreen.hScrollPRect);
  1595. X    ValidRect(&theScreen.vScrollPRect);
  1596. X    return;
  1597. X}
  1598. X
  1599. Xstatic void DoGrow(whichWindow, cursorLoc)
  1600. XWindowPtr whichWindow;
  1601. XPoint *cursorLoc;
  1602. X
  1603. X{
  1604. X    long newSize;
  1605. X    long oldWidth, oldHeight;
  1606. X    long newWidth, newHeight;
  1607. X
  1608. X    if (whichWindow == theScreen.window) {
  1609. X        oldWidth = theScreen.windowW;
  1610. X        oldHeight = theScreen.windowH;
  1611. X        newSize = GrowWindow(whichWindow, *cursorLoc, &theScreen.sizeLimitPRect);
  1612. X        if (newSize) {
  1613. X            newWidth = LoWord(newSize);
  1614. X            newHeight = HiWord(newSize);
  1615. X            HandlePreGrow(oldWidth, oldHeight, newWidth, newHeight);
  1616. X            SizeWindow(whichWindow, newWidth, newHeight, true);
  1617. X            SetScreenPortRects();
  1618. X            SetScreenDrawRects();
  1619. X            HandlePostGrow(oldWidth, oldHeight, newWidth, newHeight);
  1620. X        }
  1621. X
  1622. X    }
  1623. X
  1624. X    return;
  1625. X}
  1626. X
  1627. Xstatic void DoZoom(whichWindow, part)
  1628. XWindowPtr whichWindow;
  1629. Xlong part;
  1630. X
  1631. X{
  1632. X    WStateData **zoomInfo;
  1633. X    Rect newSize;
  1634. X    long oldWidth, oldHeight;
  1635. X    long newWidth, newHeight;
  1636. X
  1637. X    if (whichWindow == theScreen.window) {
  1638. X        oldWidth = theScreen.windowW;
  1639. X        oldHeight = theScreen.windowH;
  1640. X        zoomInfo = (WStateData **) ((WindowPeek) whichWindow)->dataHandle;
  1641. X        if (part == inZoomIn)
  1642. X            newSize = ((*zoomInfo)->userState);
  1643. X        else
  1644. X            newSize = ((*zoomInfo)->stdState);
  1645. X        newWidth = newSize.right - newSize.left;
  1646. X        newHeight = newSize.bottom - newSize.top;
  1647. X        HandlePreGrow(oldWidth, oldHeight, newWidth, newHeight);
  1648. X        EraseRect(&theScreen.window->portRect);
  1649. X        ZoomWindow(whichWindow, part, false);
  1650. X        SetScreenPortRects();
  1651. X        SetScreenDrawRects();
  1652. X        HandlePostGrow(oldWidth, oldHeight, newWidth, newHeight);
  1653. X    }
  1654. X
  1655. X    return;
  1656. X}
  1657. X
  1658. Xstatic pascal void ActOnScroll(theControl, partCode)
  1659. XControlHandle theControl;
  1660. Xshort partCode;
  1661. X
  1662. X{
  1663. X    int delta;
  1664. X
  1665. X    if (theControl == theScreen.hScrollHandle) {
  1666. X
  1667. X        switch (partCode) {
  1668. X            case inUpButton:
  1669. X                delta = -theScreen.charPDims.h;
  1670. X                break;
  1671. X            case inDownButton:
  1672. X                delta = theScreen.charPDims.h;
  1673. X                break;
  1674. X            case inPageUp:
  1675. X                delta = theScreen.charPDims.h - theScreen.picPRect.right;
  1676. X                break;
  1677. X            case inPageDown:
  1678. X                delta = theScreen.picPRect.right - theScreen.charPDims.h;
  1679. X                break;
  1680. X            default:
  1681. X                delta = 0;
  1682. X                break;
  1683. X        }
  1684. X
  1685. X        if (delta)
  1686. X            if (RepositionScreen(delta, 0)) UpdateScreen();
  1687. X
  1688. X    }
  1689. X
  1690. X    if (theControl == theScreen.vScrollHandle) {
  1691. X
  1692. X        switch (partCode) {
  1693. X            case inUpButton:
  1694. X                delta = -theScreen.charPDims.v;
  1695. X                break;
  1696. X            case inDownButton:
  1697. X                delta = theScreen.charPDims.v;
  1698. X                break;
  1699. X            case inPageUp:
  1700. X                delta = theScreen.charPDims.v - theScreen.picPRect.bottom;
  1701. X                break;
  1702. X            case inPageDown:
  1703. X                delta = theScreen.picPRect.bottom - theScreen.charPDims.v;
  1704. X                break;
  1705. X            default:
  1706. X                delta = 0;
  1707. X                break;
  1708. X        }
  1709. X
  1710. X        if (delta)
  1711. X            if (RepositionScreen(0, delta)) UpdateScreen();
  1712. X
  1713. X    }
  1714. X
  1715. X    return;
  1716. X}
  1717. X
  1718. Xstatic void DoHScroll(cursorLoc, thePart)
  1719. XPoint *cursorLoc;
  1720. Xlong thePart;
  1721. X
  1722. X{
  1723. X    switch (thePart) {
  1724. X
  1725. X        case inUpButton:
  1726. X        case inDownButton:
  1727. X        case inPageUp:
  1728. X        case inPageDown:
  1729. X            TrackControl(theScreen.hScrollHandle, *cursorLoc, (ProcPtr) ActOnScroll);
  1730. X            break;
  1731. X
  1732. X        case inThumb:
  1733. X            TrackControl(theScreen.hScrollHandle, *cursorLoc, NULL);
  1734. X            break;
  1735. X
  1736. X    }
  1737. X
  1738. X    RepositionScreen(0, 0);
  1739. X
  1740. X    return;
  1741. X}
  1742. X
  1743. Xstatic void DoVScroll(cursorLoc, thePart)
  1744. XPoint *cursorLoc;
  1745. Xlong thePart;
  1746. X
  1747. X{
  1748. X    switch (thePart) {
  1749. X
  1750. X        case inUpButton:
  1751. X        case inDownButton:
  1752. X        case inPageUp:
  1753. X        case inPageDown:
  1754. X            TrackControl(theScreen.vScrollHandle, *cursorLoc, (ProcPtr) ActOnScroll);
  1755. X            break;
  1756. X
  1757. X        case inThumb:
  1758. X            TrackControl(theScreen.vScrollHandle, *cursorLoc, NULL);
  1759. X            break;
  1760. X
  1761. X    }
  1762. X
  1763. X    RepositionScreen(0, 0);
  1764. X
  1765. X    return;
  1766. X}
  1767. X
  1768. Xstatic void DoCharClick()
  1769. X
  1770. X{
  1771. X    int reversed;
  1772. X    short h, v;
  1773. X    char c, an, ar;
  1774. X    char modifiers;
  1775. X    Rect charCell;
  1776. X    Point mouse;
  1777. X    void GetScreenCharAttr(), XSetScreenCharAttr(), UpdateScreen();
  1778. X
  1779. X    if ( (theScreen.event.when > theScreen.mouseFlush)        &&
  1780. X            (theScreen.window == FrontWindow())                &&
  1781. X            (((WindowPeek) theScreen.window)->visible) ) {
  1782. X
  1783. X        if (GtoC(theScreen.event.where.h, theScreen.event.where.v, &h, &v)) {
  1784. X
  1785. X            modifiers = (char) ((theScreen.event.modifiers & 0xF0) >> 8);
  1786. X            modifiers |= maskModMouse;
  1787. X
  1788. X            charCell.left = charCell.right = h;
  1789. X            charCell.top = charCell.bottom = v;
  1790. X            charCell.right++;
  1791. X            charCell.bottom++;
  1792. X
  1793. X            charCell.left *= theScreen.charPDims.h;
  1794. X            charCell.top *= theScreen.charPDims.v;
  1795. X            charCell.right *= theScreen.charPDims.h;
  1796. X            charCell.bottom *= theScreen.charPDims.v;
  1797. X
  1798. X            OffsetRect(&charCell, -theScreen.origin.h, -theScreen.origin.v);
  1799. X
  1800. X            GetScreenCharAttr(&c, &an, h, v);
  1801. X            ar = (an & maskAttrFlags) | (MakeAttr(AttrBack(an), AttrFore(an)));
  1802. X
  1803. X            XSetScreenCharAttr(false, c, ar, h, v);
  1804. X            UpdateScreen();
  1805. X            reversed = true;
  1806. X
  1807. X            while (StillDown()) {
  1808. X                GetMouse(&mouse);
  1809. X                if (reversed) {
  1810. X                    if (!PtInRect(mouse, &charCell)) {
  1811. X                        XSetScreenCharAttr(false, c, an, h, v);
  1812. X                        UpdateScreen();
  1813. X                        reversed = false;
  1814. END_OF_FILE
  1815. if test 41420 -ne `wc -c <'mac/scrnmgr/ScrnMgr.c.1'`; then
  1816.     echo shar: \"'mac/scrnmgr/ScrnMgr.c.1'\" unpacked with wrong size!
  1817. fi
  1818. # end of 'mac/scrnmgr/ScrnMgr.c.1'
  1819. fi
  1820. if test -f 'util/mc/symtab.c' -a "${1}" != "-c" ; then 
  1821.   echo shar: Will not clobber existing file \"'util/mc/symtab.c'\"
  1822. else
  1823. echo shar: Extracting \"'util/mc/symtab.c'\" \(12398 characters\)
  1824. sed "s/^X//" >'util/mc/symtab.c' <<'END_OF_FILE'
  1825. X/* util/mc/st_symtab.c: routines for managing symbol tables
  1826. X *
  1827. X * Copyright (c) 1989 by Joseph Hall.
  1828. X * All rights reserved except as stated below.
  1829. X *
  1830. X * Jim Wilson and any other holders of copyright on substantial portions
  1831. X * of Moria are granted rights to use, modify, and distribute this program
  1832. X * as they see fit, so long as the terms of its use, modification and/or
  1833. X * distribution are no less restrictive than those applying to Moria,
  1834. X * version 5.0 or later, itself, and so long as this use is related to
  1835. X * the further development of Moria.
  1836. X *
  1837. X * Anyone having any other use in mind for this code should contact the
  1838. X * author at 4116 Brewster Dr., Raleigh NC 27606 (jnh@ecemwl.ncsu.edu).
  1839. X */
  1840. X
  1841. X
  1842. X#include <stdio.h>
  1843. X#include <string.h>
  1844. X#include <ctype.h>
  1845. X
  1846. X#ifdef ANSI_LIBS
  1847. X#include <stdlib.h>
  1848. X#else
  1849. Xextern char *malloc();
  1850. Xextern char *calloc();
  1851. Xextern void free();
  1852. Xextern void cfree();
  1853. X#endif
  1854. X
  1855. X#include "st.h"
  1856. X
  1857. X/* #define _TESTING_ */
  1858. X
  1859. X/*
  1860. X * There's a symbol table containing all the names of the symbol tables,
  1861. X * and of course it contains its own name ...
  1862. X *
  1863. X * "tnt" stands for "Table Name Table" ...
  1864. X */
  1865. Xstatic st_Table_Pt  tnt_P = NULL;
  1866. X
  1867. X/*
  1868. X * If there are a lot of symbol tables around you might want to increase
  1869. X * TNT_SIZE.  For best results use a prime number.
  1870. X */
  1871. X
  1872. X#define    TNT_SIZE    11
  1873. X
  1874. X/*
  1875. X * Names of basic generic types.
  1876. X */
  1877. X
  1878. X#define NAMES 7
  1879. X
  1880. X/*
  1881. X * Hash--
  1882. X *    Simple, stupid hash function.  Why be great, you know, when you can
  1883. X * be adequate so easily?
  1884. X */
  1885. Xstatic int Hash(s, mod)
  1886. Xregister char *s;
  1887. Xint mod;
  1888. X{
  1889. X    register int h = 0;
  1890. X
  1891. X    while (*s)
  1892. X    h += (unsigned) *s++;
  1893. X
  1894. X    return h % mod;
  1895. X}
  1896. X
  1897. X
  1898. X/*
  1899. X * LookupSym--
  1900. X *    Search for a name in a table.  Returns NULL if not found.
  1901. X */
  1902. Xstatic st_Entry_Pt LookupSym(st_P, name)
  1903. Xst_Table_Pt st_P;
  1904. Xchar *name;
  1905. X{
  1906. X    st_Entry_Pt    entry_P;
  1907. X    int        h;
  1908. X
  1909. X    h = Hash(name, st_P->size);
  1910. X
  1911. X    for (entry_P = st_P->tab_A[h]; entry_P; entry_P = entry_P->next_P)
  1912. X    if (!strncmp(entry_P->name, name, ST_MAX_SYM_LEN))
  1913. X        break;
  1914. X
  1915. X    return entry_P;
  1916. X}
  1917. X
  1918. X
  1919. X
  1920. X/*
  1921. X * AddSym--
  1922. X *    Add a name to a table and return a pointer to the new entry.
  1923. X * ASSUMES THAT NAME DOESN'T EXIST ALREADY IN TABLE (check with LookupSym
  1924. X * above before calling here).
  1925. X */
  1926. Xstatic st_Entry_Pt AddSym(st_P, name)
  1927. Xst_Table_Pt st_P;
  1928. Xchar *name;
  1929. X
  1930. X{
  1931. X    int        h;
  1932. X    st_Entry_Pt    new_P;
  1933. X
  1934. X    h = Hash(name, st_P->size);
  1935. X
  1936. X    new_P = (st_Entry_Pt) malloc(sizeof(st_Entry_t));
  1937. X     strncpy(new_P->name, name, ST_MAX_SYM_LEN - 1);
  1938. X    new_P->name[ST_MAX_SYM_LEN - 1] = 0;
  1939. X    new_P->next_P = st_P->tab_A[h];
  1940. X    st_P->tab_A[h] = new_P;
  1941. X
  1942. X    st_P->entryCt++;
  1943. X
  1944. X    return new_P;
  1945. X
  1946. X}
  1947. X
  1948. X
  1949. X/*
  1950. X * St_NewTable--
  1951. X *    Create a new symbol table header.  Returns NULL if name isn't
  1952. X * unique with respect to the symbol tables currently in existence.
  1953. X */
  1954. Xst_Table_Pt St_NewTable(name, size)
  1955. Xchar *name;
  1956. Xint size;
  1957. X{
  1958. X    st_Table_Pt    st_P;
  1959. X    generic_t    gval;
  1960. X
  1961. X    /*
  1962. X     * Create the name table if doesn't already exist.  Obviously we
  1963. X     * can't use St_NewTable for this ...
  1964. X     */
  1965. X
  1966. X    if (!tnt_P) {
  1967. X    tnt_P = (st_Table_Pt) malloc(sizeof(st_Table_t));
  1968. X
  1969. X     strncpy(tnt_P->name, "_TNT_", ST_MAX_SYM_LEN - 1);
  1970. X    tnt_P->name[ST_MAX_SYM_LEN - 1] = 0;
  1971. X    tnt_P->size = TNT_SIZE;
  1972. X    tnt_P->tab_A = (st_Entry_Pt *) calloc(TNT_SIZE, sizeof(st_Entry_Pt));
  1973. X    tnt_P->entryCt = 0;
  1974. X
  1975. X    gval.v = (char *) tnt_P;
  1976. X     St_DefSym(tnt_P, "_TNT_", GEN_TYPE_VOID_PTR, gval);
  1977. X
  1978. X    }
  1979. X
  1980. X    /*
  1981. X     * See if the new table name is unique.
  1982. X     */
  1983. X
  1984. X    if (LookupSym(tnt_P, name))
  1985. X    return NULL;
  1986. X
  1987. X    /*
  1988. X     * Create the new table.
  1989. X     */
  1990. X
  1991. X    st_P = (st_Table_Pt) malloc(sizeof(st_Table_t));
  1992. X
  1993. X     strncpy(st_P->name, name, ST_MAX_SYM_LEN - 1);
  1994. X    st_P->name[ST_MAX_SYM_LEN - 1] = 0;
  1995. X    st_P->size = size;
  1996. X    st_P->tab_A = (st_Entry_Pt *) calloc((unsigned) size,
  1997. X                     sizeof(st_Entry_Pt));
  1998. X    st_P->entryCt = 0;
  1999. X
  2000. X    /*
  2001. X     * Add the name of the new table to the "table name table" now.
  2002. X     * gval.v is a pointer to the new table.
  2003. X     */
  2004. X
  2005. X    gval.v = (char *) st_P;
  2006. X     St_DefSym(tnt_P, name, GEN_TYPE_VOID_PTR, gval);
  2007. X
  2008. X    return st_P;
  2009. X}
  2010. X
  2011. X
  2012. X
  2013. X
  2014. X/*
  2015. X * St_DelTable--
  2016. X *    Delete a symbol table and associated storage.  If entries in the
  2017. X * table point to dynamically allocated objects, the user must free these
  2018. X * objects before calling this routine, else the pointers to those objects
  2019. X * will be lost.  (** NOTE: this feature has been removed from the version
  2020. X * accompanying the monster compiler, since it isn't needed --jnh **)
  2021. X */
  2022. Xvoid St_DelTable(st_P)
  2023. Xst_Table_Pt st_P;
  2024. X{
  2025. X    st_Entry_Pt entry_P;
  2026. X    int        i;
  2027. X
  2028. X    if (!st_P)
  2029. X    return;
  2030. X
  2031. X    for (i = 0; i < st_P->size; i++)
  2032. X    for (entry_P = st_P->tab_A[i]; entry_P; entry_P = entry_P->next_P) {
  2033. X        free((char *) entry_P);
  2034. X    }
  2035. X
  2036. X    if (strncmp(st_P->name, "_TNT_", ST_MAX_SYM_LEN))
  2037. X     St_DelSym(tnt_P, st_P->name);
  2038. X
  2039. X    cfree((char *) st_P->tab_A);
  2040. X    cfree((char *) st_P);
  2041. X
  2042. X    return;
  2043. X
  2044. X}
  2045. X
  2046. X
  2047. X
  2048. X
  2049. X/*
  2050. X * St_ListTable--
  2051. X *    Returns an unsorted list of symbols in the table.  The list will be
  2052. X * terminated with a NULL pointer.  This routine frees the storage used by
  2053. X * the last call to St_ListTable or St_SListTable; a call with a NULL
  2054. X * argument is a convenient way to free storage allocated by a previous call.
  2055. X */
  2056. Xchar **St_ListTable(st_P)
  2057. Xst_Table_Pt st_P;
  2058. X{
  2059. X
  2060. X    st_Entry_Pt entry_P;
  2061. X    int        i, j;
  2062. X    static char    **list_A = NULL,
  2063. X        *chars_P = NULL;
  2064. X
  2065. X    if (list_A) {
  2066. X    free((char *) list_A);
  2067. X    free((char *) chars_P);
  2068. X    list_A = NULL;
  2069. X    chars_P = NULL;
  2070. X    }
  2071. X
  2072. X    if (!st_P)
  2073. X    return NULL;
  2074. X
  2075. X    list_A = (char **) malloc(sizeof(char *) * (st_P->entryCt + 1));
  2076. X    chars_P = (char *) malloc(sizeof(char) * ST_MAX_SYM_LEN * st_P->entryCt);
  2077. X
  2078. X    for (i = 0; i < st_P->entryCt; i++)
  2079. X    list_A[i] = chars_P + ST_MAX_SYM_LEN * i;
  2080. X    list_A[st_P->entryCt] = NULL;
  2081. X
  2082. X    j = 0;
  2083. X    for (i = 0; i < st_P->size; i++)
  2084. X    for (entry_P = st_P->tab_A[i]; entry_P; entry_P = entry_P->next_P)
  2085. X         strcpy(list_A[j++], entry_P->name);
  2086. X
  2087. X    list_A[st_P->entryCt] = NULL;
  2088. X
  2089. X    return list_A;
  2090. X
  2091. X}
  2092. X
  2093. X
  2094. X/*
  2095. X * St_SListTable--
  2096. X *    Returns a sorted list of symbols in a table.  Otherwise is exactly
  2097. X * like St_ListTable, above.
  2098. X */
  2099. Xchar **St_SListTable(st_P)
  2100. Xst_Table_Pt st_P;
  2101. X{
  2102. X    char    **list_A;
  2103. X
  2104. X    if (!(list_A = St_ListTable(st_P)))
  2105. X    return NULL;
  2106. X
  2107. X    qsort(*list_A, st_P->entryCt, sizeof(char) * ST_MAX_SYM_LEN, strcmp);
  2108. X
  2109. X    return list_A;
  2110. X}
  2111. X
  2112. X
  2113. X
  2114. X/*
  2115. X * St_GetSym--
  2116. X *    Look for a symbol in a table.  Return type and ptr to val if found.
  2117. X */
  2118. Xint St_GetSym(st_P, name, type_P, gval_P)
  2119. Xst_Table_Pt st_P;
  2120. Xchar *name;
  2121. Xint *type_P;
  2122. Xgeneric_Pt gval_P;
  2123. X{
  2124. X    st_Entry_Pt    entry_P;
  2125. X
  2126. X    if (!st_P)
  2127. X    return ST_NULL_TABLE;
  2128. X
  2129. X    if (!(entry_P = LookupSym(st_P, name)))
  2130. X    return ST_SYM_NOT_FOUND;
  2131. X
  2132. X    *type_P = entry_P->type;
  2133. X    *gval_P = entry_P->gval;
  2134. X
  2135. X    return ST_SYM_FOUND;
  2136. X}
  2137. X
  2138. X
  2139. X
  2140. X/*
  2141. X * St_DefSym--
  2142. X *    Add a symbol to a table.  Returns ST_SYM_FOUND and does nothing if
  2143. X * name is already in table.
  2144. X */
  2145. Xint St_DefSym(st_P, name, type, gval)
  2146. Xst_Table_Pt st_P;
  2147. Xchar *name;
  2148. Xint type;
  2149. Xgeneric_t gval;
  2150. X{
  2151. X    st_Entry_Pt entry_P;
  2152. X
  2153. X    if (!st_P)
  2154. X    return ST_NULL_TABLE;
  2155. X
  2156. X    if (LookupSym(st_P, name))
  2157. X    return ST_SYM_FOUND;
  2158. X
  2159. X    entry_P = AddSym(st_P, name);
  2160. X
  2161. X    /*
  2162. X     * Assign data.
  2163. X     */
  2164. X
  2165. X    entry_P->type = type;
  2166. X    entry_P->gval = gval;
  2167. X
  2168. X    return ST_SYM_NOT_FOUND;
  2169. X
  2170. X}
  2171. X
  2172. X
  2173. X/*
  2174. X * St_ReplSym--
  2175. X *    Add or supersede a symbol in a table.
  2176. X */
  2177. Xint St_ReplSym(st_P, name, type, gval)
  2178. Xst_Table_Pt st_P;
  2179. Xchar *name;
  2180. Xint type;
  2181. Xgeneric_t gval;
  2182. X{
  2183. X    st_Entry_Pt entry_P;
  2184. X    int        status;
  2185. X
  2186. X    if (!st_P)
  2187. X    return ST_NULL_TABLE;
  2188. X
  2189. X    if (!(entry_P = LookupSym(st_P, name))) {
  2190. X    entry_P = AddSym(st_P, name);
  2191. X    status = ST_SYM_NOT_FOUND;
  2192. X    } else {
  2193. X    status = ST_SYM_FOUND;
  2194. X    }
  2195. X
  2196. X    /*
  2197. X     * Assign data.
  2198. X     */
  2199. X
  2200. X    entry_P->type = type;
  2201. X    entry_P->gval = gval;
  2202. X
  2203. X    return status;
  2204. X}
  2205. X
  2206. X
  2207. X
  2208. X
  2209. X/*
  2210. X * St_DelSym--
  2211. X *    Delete a symbol from the table.
  2212. X */
  2213. Xint St_DelSym(st_P, name)
  2214. Xst_Table_Pt st_P;
  2215. Xchar *name;
  2216. X{
  2217. X    st_Entry_Pt    entry_P, last_P;
  2218. X    int        h;
  2219. X
  2220. X    if (!st_P)
  2221. X    return ST_NULL_TABLE;
  2222. X
  2223. X    h = Hash(name, st_P->size);
  2224. X
  2225. X    for (last_P = NULL, entry_P = st_P->tab_A[h]; entry_P;
  2226. X                last_P = entry_P, entry_P = entry_P->next_P)
  2227. X    if (!strncmp(entry_P->name, name, ST_MAX_SYM_LEN))
  2228. X        break;
  2229. X
  2230. X    if (!entry_P)
  2231. X    return ST_SYM_NOT_FOUND;
  2232. X
  2233. X    if (last_P)
  2234. X    last_P->next_P = entry_P->next_P;
  2235. X    else
  2236. X    st_P->tab_A[h] = NULL;
  2237. X
  2238. X    cfree((char *) entry_P);
  2239. X    st_P->entryCt--;
  2240. X
  2241. X    return ST_SYM_FOUND;
  2242. X}
  2243. X
  2244. X
  2245. X
  2246. X/*
  2247. X * St_GetTable--
  2248. X *    Get a table by name
  2249. X */
  2250. Xst_Table_Pt St_GetTable(name)
  2251. Xchar *name;
  2252. X{
  2253. X    int        type;
  2254. X    generic_t    gval;
  2255. X
  2256. X    if (!tnt_P)
  2257. X    return NULL;
  2258. X
  2259. X    if (St_GetSym(tnt_P, name, &type, &gval) != ST_SYM_FOUND)
  2260. X    return NULL;
  2261. X
  2262. X    return (st_Table_Pt) gval.v;
  2263. X}
  2264. X
  2265. X
  2266. X/* -Jim Wilson-
  2267. X * St_TableSize--
  2268. X *    Returns the number of entries in the table.
  2269. X */
  2270. Xint St_TableSize(st_P)
  2271. Xst_Table_Pt st_P;
  2272. X{
  2273. X  return st_P->entryCt;
  2274. X}
  2275. X
  2276. X
  2277. X/*
  2278. X * St_DumpTable--
  2279. X *    Dump a table (for debugging or utility purposes)
  2280. X */
  2281. Xvoid St_DumpTable(output_F, st_P)
  2282. XFILE *output_F;
  2283. Xst_Table_Pt st_P;
  2284. X{
  2285. X    st_Entry_Pt    entry_P;
  2286. X    int        bucket;
  2287. X
  2288. X    if (!st_P) {
  2289. X     fprintf(output_F, "Table ptr is NULL.\n");
  2290. X    return;
  2291. X    }
  2292. X
  2293. X     fprintf(output_F, "Dumping table '%s', size = %d, count = %d\n",
  2294. X                st_P->name, st_P->size, st_P->entryCt);
  2295. X
  2296. X    for (bucket = 0; bucket < st_P->size; bucket++) {
  2297. X
  2298. X     fprintf(output_F, " Bucket %d:\n", bucket);
  2299. X
  2300. X    entry_P = st_P->tab_A[bucket];
  2301. X
  2302. X    if (!entry_P) {
  2303. X         fprintf(output_F, "  empty\n");
  2304. X        continue;
  2305. X    }
  2306. X
  2307. X    while (entry_P) {
  2308. X
  2309. X        switch(entry_P->type) {
  2310. X
  2311. X        case GEN_TYPE_INT:
  2312. X         fprintf(output_F, "  '%s' = %d (int)\n", entry_P->name,
  2313. X                            entry_P->gval.i);
  2314. X        break;
  2315. X
  2316. X        case GEN_TYPE_LONG:
  2317. X         fprintf(output_F, "  '%s' = %ld (long)\n", entry_P->name,
  2318. X                            entry_P->gval.l);
  2319. X        break;
  2320. X
  2321. X        case GEN_TYPE_FLOAT:
  2322. X         fprintf(output_F, "  '%s' = %e (float)\n", entry_P->name,
  2323. X                            entry_P->gval.f);
  2324. X        break;
  2325. X
  2326. X        case GEN_TYPE_DOUBLE:
  2327. X         fprintf(output_F, "  '%s' = %e (double)\n",
  2328. X                entry_P->name, entry_P->gval.d);
  2329. X        break;
  2330. X
  2331. X        case GEN_TYPE_CHAR:
  2332. X         fprintf(output_F, "  '%s' = '%c'/%d (char)\n",
  2333. X                        entry_P->name,
  2334. X                        entry_P->gval.c, entry_P->gval.c);
  2335. X        break;
  2336. X
  2337. X        case GEN_TYPE_STRING:
  2338. X        if (entry_P->gval.s)
  2339. X             fprintf(output_F, "  '%s' = '%s' (string)\n",
  2340. X                    entry_P->name, entry_P->gval.s);
  2341. X        else
  2342. X             fprintf(output_F, "  '%s' = NULL (string)\n",
  2343. X                                entry_P->name);
  2344. X        break;
  2345. X
  2346. X        case GEN_TYPE_STRING_A:
  2347. X
  2348. X        if (!entry_P->gval.s_A) {
  2349. X             fprintf(output_F, "  '%s' = NULL (string array)\n",
  2350. X                                entry_P->name);
  2351. X        } else {
  2352. X            char    **s_A;
  2353. X             fprintf(output_F, "  '%s' is string array:\n",
  2354. X                                entry_P->name);
  2355. X            for (s_A = entry_P->gval.s_A; *s_A; s_A++)
  2356. X             fprintf(output_F, "    '%s'\n", *s_A);
  2357. X        }
  2358. X        break;
  2359. X
  2360. X        case GEN_TYPE_VOID_PTR:
  2361. X        if (entry_P->gval.v)
  2362. X             fprintf(output_F, "  '%s' is user type (void ptr)\n",
  2363. X                                entry_P->name);
  2364. X        else
  2365. X     fprintf(output_F, "  '%s' is NULL user type (void ptr)\n",
  2366. X                                entry_P->name);
  2367. X        break;
  2368. X
  2369. X        default:
  2370. X     fprintf(output_F, "  '%s' is unknown type\n", entry_P->name);
  2371. X        break;
  2372. X
  2373. X        }
  2374. X
  2375. X        entry_P = entry_P->next_P;
  2376. X
  2377. X    }
  2378. X
  2379. X    }
  2380. X
  2381. X    return;
  2382. X}
  2383. X
  2384. X
  2385. X
  2386. X#ifdef _TESTING_
  2387. X
  2388. Xmain()
  2389. X{
  2390. X    st_Table_Pt    st_P;
  2391. X    generic_t    gval;
  2392. X    int        type;
  2393. X    static char *s_A[] = {"Joe", "Bloe", NULL};
  2394. X    char    **list_A;
  2395. X
  2396. X    st_P = St_NewTable("Test", 3);
  2397. X
  2398. X    gval.i = 10;
  2399. X     St_DefSym(st_P, "A", GEN_TYPE_INT, gval);
  2400. X
  2401. X    gval.d = 3.14;
  2402. X     St_DefSym(st_P, "PI", GEN_TYPE_DOUBLE, gval);
  2403. X
  2404. X    gval.i = 1;
  2405. X     St_DefSym(st_P, "ONE", GEN_TYPE_INT, gval);
  2406. X
  2407. X    gval.s = "Testing!";
  2408. X     St_DefSym(st_P, "TESTING", GEN_TYPE_STRING, gval);
  2409. X
  2410. X    gval.c = 7;
  2411. X     St_DefSym(st_P, "BELL", GEN_TYPE_CHAR, gval);
  2412. X
  2413. X    gval.s_A = s_A;
  2414. X     St_DefSym(st_P, "JOE BLOE", GEN_TYPE_STRING_A, gval);
  2415. X
  2416. X     St_GetSym(st_P, "A", &type, &gval);
  2417. X     printf("A = %d, type = %d\n", gval.i, type);
  2418. X
  2419. X     St_GetSym(st_P, "PI", &type, &gval);
  2420. X     printf("PI = %f, type = %d\n", gval.d, type);
  2421. X
  2422. X    St_DumpTable(stdout, St_GetTable("Test"));
  2423. X
  2424. X     St_DelSym(st_P, "TESTING");
  2425. X
  2426. X    St_DumpTable(stdout, St_GetTable("Test"));
  2427. X
  2428. X     St_DelSym(st_P, "PI");
  2429. X
  2430. X    gval.s = "Joe Bloe";
  2431. X     St_ReplSym(st_P, "JOE BLOE", GEN_TYPE_STRING, gval);
  2432. X    gval.s = "Jane Bloe";
  2433. X     St_ReplSym(st_P, "JANE BLOE", GEN_TYPE_STRING, gval);
  2434. X
  2435. X    St_DumpTable(stdout, St_GetTable("Test"));
  2436. X
  2437. X    list_A = St_ListTable(St_GetTable("Test"));
  2438. X
  2439. X    while (*list_A)
  2440. X     printf("'%s'\n", *list_A++);
  2441. X
  2442. X    list_A = St_SListTable(St_GetTable("Test"));
  2443. X
  2444. X    while (*list_A)
  2445. X     printf("'%s'\n", *list_A++);
  2446. X
  2447. X    return 0;
  2448. X}
  2449. X
  2450. X#endif
  2451. END_OF_FILE
  2452. if test 12398 -ne `wc -c <'util/mc/symtab.c'`; then
  2453.     echo shar: \"'util/mc/symtab.c'\" unpacked with wrong size!
  2454. fi
  2455. # end of 'util/mc/symtab.c'
  2456. fi
  2457. echo shar: End of archive 11 \(of 39\).
  2458. cp /dev/null ark11isdone
  2459. MISSING=""
  2460. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 ; do
  2461.     if test ! -f ark${I}isdone ; then
  2462.     MISSING="${MISSING} ${I}"
  2463.     fi
  2464. done
  2465. if test "${MISSING}" = "" ; then
  2466.     echo You have unpacked all 39 archives.
  2467.     echo "Now run "bldfiles.sh" to build split files"
  2468.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  2469. else
  2470.     echo You still need to unpack the following archives:
  2471.     echo "        " ${MISSING}
  2472. fi
  2473. ##  End of shell archive.
  2474. exit 0
  2475.