home *** CD-ROM | disk | FTP | other *** search
/ ETO Development Tools 4 / ETO Development Tools 4.iso / Tools - Objects / MacApp / MacApp 3.0a2 / Libraries / UCPlusTool.cp < prev    next >
Encoding:
Text File  |  1991-05-01  |  9.7 KB  |  446 lines  |  [TEXT/MPS ]

  1. // UCPlusTool.cp
  2. // Copyright © 1988-1991 by Apple Computer Inc.  All rights reserved.
  3.  
  4. #ifndef __TEXTEDIT__
  5. #include <TextEdit.h>
  6. #endif
  7.  
  8. #ifndef __OSUTILS__
  9. #include <OSUtils.h>
  10. #endif
  11.  
  12. #ifndef __EVENTS__
  13. #include <Events.h>
  14. #endif
  15.  
  16. #ifndef __CURSORCTL__
  17. #include <CursorCtl.h>
  18. #endif
  19.  
  20. #ifndef __SIGNAL__
  21. #include <Signal.h>
  22. #endif
  23.  
  24. #ifndef __ERRMGR__
  25. #include <ErrMgr.h>
  26. #endif
  27.  
  28. #ifndef __PACKAGES__
  29. #include <Packages.h>
  30. #endif
  31.  
  32. #ifndef __SCRIPT__
  33. #include <Script.h>
  34. #endif
  35.  
  36. #ifndef __RESOURCES__
  37. #include <Resources.h>
  38. #endif
  39.  
  40. #ifndef __FONTS__
  41. #include <Fonts.h>
  42. #endif
  43.  
  44. // For fprintf
  45. #ifndef __STDIO__
  46. #include <StdIO.h>
  47. #endif
  48.  
  49. // For exit
  50. #ifndef __STDLIB__
  51. #include <StdLib.h>
  52. #endif
  53.  
  54. #ifndef __ULIST__
  55. #include <UList.h>
  56. #endif
  57.  
  58. #ifndef __UASSOCIATION__
  59. #include <UAssociation.h>
  60. #endif
  61.  
  62. #ifndef __UFAILURE__
  63. #include <UFailure.h>
  64. #endif
  65.  
  66. #ifndef __UMACAPPUNIVERSAL__
  67. #include <UMacAppUniversal.h>
  68. #endif
  69.  
  70. #ifndef __UMACAPPUTILITIES__
  71. #include <UMacAppUtilities.h>
  72. #endif
  73.  
  74. #ifndef __UPATCH__
  75. #include <UPatch.h>
  76. #endif
  77.  
  78. #ifndef __UCPLUSTOOL__
  79. #include <UCPlusTool.h>
  80. #endif
  81.  
  82. // Global variables defined so that storage is allocated:
  83. const char* Version = "1.0";
  84. TCPlusTool* gCPlusTool = NULL;
  85.  
  86.  
  87. //--------------------------------------------------------------------------------------------------
  88. #pragma segment TInit
  89.  
  90. pascal void InitUCPlusTool()
  91. {
  92.     // Do Tool related initialization 
  93.     InitGraf(&qd.thePort);
  94.     SetFScaleDisable(TRUE);                            // per chapter in MPW guide on tools 
  95.  
  96.     InitCursorCtl(NULL);
  97.     RotateCursor(0);
  98.  
  99.     InitErrMgr("", "", FALSE);
  100.  
  101. #if qDebug
  102.     gPreCondition = TRUE;
  103.     gPostCondition = TRUE;
  104. #endif
  105.  
  106.     // -1 == 0xFFFFFFFF, the largest 32 bit address. Our routine StripLong uses a
  107.     // pre-stripped address gStrippedAddress to avoid the yucky MPW glue. (NOTE: need
  108.     // gStrippedAddress in DefineConfiguration.) gStrippedAddress = StripAddress(Ptr( -
  109.     // 1));
  110.  
  111.     // Find out just what kind of environment we're dealing with here 
  112.     DefineConfiguration(gConfiguration);
  113.  
  114.     // Init the stuff that MATextBox uses 
  115.     gMATextBoxTE = NULL;
  116.     gTEDefaultWordBreak = NULL;
  117.  
  118.     // Init all the primary colors 
  119.     SetRGBColor(gRGBBlack, 0, 0, 0);
  120.     SetRGBColor(gRGBWhite, 0xFFFF, 0xFFFF, 0xFFFF);
  121.     SetRGBColor(gRGBRed, 0xFFFF, 0, 0);
  122.     SetRGBColor(gRGBGreen, 0, 0xFFFF, 0);
  123.     SetRGBColor(gRGBBlue, 0, 0, 0xFFFF);
  124.  
  125.     // setup the zeroed points and rects 
  126.     gZeroPt = Point(0, 0);
  127.     gZeroRect = Rect(0, 0, 0, 0);
  128.  
  129. #if qDebug || qInspector
  130.     gFieldToStrRtn = (ProcPtr)&StdFieldToString;
  131.     gFieldToCountRtn = (ProcPtr)&StdFieldToCount;
  132. #endif
  133.  
  134.     gBoolString[0][0] = (char)5;                // = "\pFALSE";
  135.     gBoolString[0][1] = 'F';
  136.     gBoolString[0][2] = 'A';
  137.     gBoolString[0][3] = 'L';
  138.     gBoolString[0][4] = 'S';
  139.     gBoolString[0][5] = 'E';
  140.     gBoolString[1][0] = (char)4;                // = "\pTRUE";
  141.     gBoolString[1][1] = 'T';
  142.     gBoolString[1][2] = 'R';
  143.     gBoolString[1][3] = 'U';
  144.     gBoolString[1][4] = 'E';
  145.  
  146.     gDeadStripSuppression = FALSE;
  147.  
  148.     // The refnum where the application's resources should be found 
  149.     gApplicationRefNum = CurResFile();
  150.  
  151. #if qDebug
  152.     gExperimenting = FALSE;
  153.     gDebugPrinting = FALSE;
  154.     gReportMenuChoices = FALSE;
  155.     gIntenseDebugging = FALSE;
  156.     gReportEvt = FALSE;
  157. #endif
  158.  
  159.     gToolBoxInitialized = TRUE;
  160.  
  161.     // Do Object related initialization 
  162.     InitUObject();
  163. }
  164.  
  165. //--------------------------------------------------------------------------------------------------
  166. #pragma segment TRes
  167.  
  168. void Intr(int)
  169. {
  170.     gCPlusTool->fInterrupted = TRUE;                    // we test this switch periodically
  171. }
  172.  
  173. //--------------------------------------------------------------------------------------------------
  174. #pragma segment TRes
  175.  
  176. pascal void TCPlusTool::Stop(const Str255& msg)
  177. {
  178.     if (msg.Length() > 0)
  179.         fprintf(stderr, "\n%s\n", (char*)msg);
  180.  
  181.     if (fInterrupted)
  182.         exit(-9);
  183.  
  184.     // don't worry about closing the files we opened. The Shell will do so if appropriate.
  185.     exit((short)fRetCode);                        // exit, returning the appropriate status code
  186. }
  187.  
  188. //--------------------------------------------------------------------------------------------------
  189. #pragma segment TInit
  190.  
  191. pascal void TCPlusTool::SyntaxError(const Str255& suffix)
  192. {
  193.     Str255 aStr = fProgName;
  194.  
  195.     fprintf(stderr, "%ld Bad Parameter: %s\n", kErrorMarker, (char*) suffix);
  196.     fprintf(stderr, "%ld%s<invalid option>\n", kErrorMarker, (char*) aStr);
  197.     Stop("");
  198. }
  199.  
  200. //--------------------------------------------------------------------------------------------------
  201. #pragma segment TInit
  202.  
  203. pascal void TCPlusTool::DoShowUsage(void)
  204. {
  205.     Str255 aStr = fProgName;
  206.  
  207.     fprintf(stderr, "# Usage: %s [-p]\n", (char*) aStr);
  208. }
  209.  
  210. //--------------------------------------------------------------------------------------------------
  211. #pragma segment TInit
  212.  
  213. pascal void TCPlusTool::GetNextArg(Str255& nextArg)
  214. {
  215.     if (++fArgvIndex > fArgc)
  216.         Stop("         Not enough arguments ");
  217.     nextArg = Str255(fArgv[fArgvIndex]);
  218. }
  219.  
  220. //--------------------------------------------------------------------------------------------------
  221. #pragma segment TInit
  222.  
  223. pascal void TCPlusTool::InstallKeyWords(void)
  224. {
  225.     InstallKeyWord(" P ", kwP);
  226.     InstallKeyWord(" NoP ", kwNoP);
  227.     InstallKeyWord(" T ", kwT);
  228.     InstallKeyWord(" NoT ", kwNoT);
  229.     InstallKeyWord(" Help ", kwHelp);
  230. }
  231.  
  232. //--------------------------------------------------------------------------------------------------
  233. #pragma segment TInit
  234.  
  235. pascal void TCPlusTool::InstallKeyWord(const Str255& keyword,
  236.                                      short kw)
  237. {
  238.     Str255 value;
  239.     Str255 upperKeyWord = keyword;
  240.  
  241.     UprStr255(upperKeyWord);
  242.     value[0] = (char)2;
  243.     value[1] = (char)((kw & 0xFF00) >> 8);
  244.     value[2] = (char)(kw & 0x00FF);
  245.     fKeyWordList->InsertEntry(upperKeyWord, value);
  246. }
  247.  
  248. //--------------------------------------------------------------------------------------------------
  249. #pragma segment TInit
  250.  
  251. pascal Boolean TCPlusTool::LookupKeyword(const Str255& keyword,
  252.                                        short& kw)
  253. {
  254.     Str255 value;
  255.     Str255 upperKeyWord = keyword;
  256.  
  257.     UprStr255(upperKeyWord);
  258.     if (fKeyWordList->ValueAt(keyword, value))
  259.     {
  260.         kw = (((short)value[1] << 8) | (short)value[2]);
  261.         return TRUE;
  262.     }
  263.     else
  264.         return FALSE;
  265. }
  266.  
  267. //--------------------------------------------------------------------------------------------------
  268. #pragma segment TInit
  269.  
  270. pascal void TCPlusTool::ProcessArg(const Str255& arg)
  271. {
  272.     if (arg[1] != '-')
  273.         DoProcessFileArg(arg);
  274.     else
  275.     {
  276.         short akw;
  277.         Str255 realArg = arg;
  278.  
  279.         realArg.Delete(1,1);                    // delete the '-'
  280.         if (LookupKeyword(realArg, akw))
  281.             DoProcessOptionArg(akw);
  282.         else
  283.             SyntaxError(arg + " < invalid option > ");
  284.     }
  285. }
  286.  
  287. //--------------------------------------------------------------------------------------------------
  288. #pragma segment TInit
  289.  
  290. pascal void TCPlusTool::DoProcessFileArg(const Str255& arg)
  291. {
  292.     SyntaxError(arg + " < invalid option > ");
  293. }
  294.  
  295. //--------------------------------------------------------------------------------------------------
  296. #pragma segment TInit
  297.  
  298. pascal void TCPlusTool::DoProcessOptionArg(short kw)
  299. {
  300.     switch (kw)
  301.     {
  302.         case kwP:
  303.             fProgress = TRUE;
  304.             break;
  305.         case kwNoP:
  306.             fProgress = FALSE;
  307.             break;
  308.         case kwT:
  309.             fTime = TRUE;
  310.             break;
  311.         case kwNoT:
  312.             fTime = FALSE;
  313.             break;
  314.         case kwHelp:
  315.             DoShowUsage();
  316.             fRetCode = RC_Normal;
  317.             Stop("         ");
  318.             break;
  319.         default:
  320.             SyntaxError(Str255(fArgv[fArgvIndex]) + Str255(" < invalid option > "));
  321.     }
  322. }
  323.  
  324. //--------------------------------------------------------------------------------------------------
  325. #pragma segment TInit
  326.  
  327. pascal void TCPlusTool::DoStartProgress(void)
  328. {
  329.     Str255 aStr = fProgName;
  330.  
  331.     fprintf(stderr, "\n%s (Ver %d) \n\n\n", (char*) aStr, Version);
  332. }
  333.  
  334.  
  335. //--------------------------------------------------------------------------------------------------
  336. #pragma segment TInit
  337.  
  338. pascal void TCPlusTool::Initialize(void)            // override 
  339. {
  340.     inherited::Initialize();
  341.  
  342.     fArgc = 0;
  343.     fArgv = NULL;
  344.     fArgvIndex = 0;
  345.     fCursorCount = 0;                            // prepare to spin that cursor
  346.     fInterrupted = FALSE;                        // becomes TRUE when interrupted
  347.     fKeyWordList = NULL;                        // keywords to this command 
  348.     fProgName = "";                                // Program's file name
  349.     fProgress = FALSE;
  350.     fRetCode = RC_Normal;
  351.     fStartDateTime = 0;                            // Date/Time at start of tool 
  352.     fStartTicks = 0;                            // tickcount at start of tool 
  353.     fTime = FALSE;
  354. }
  355.  
  356. //--------------------------------------------------------------------------------------------------
  357. #pragma segment TInit
  358.  
  359. pascal void TCPlusTool::ICPlusTool(short argc, char** argv)
  360. {
  361.     Str255 arg;
  362.     unsigned long theDateTime;
  363.  
  364.     IObject();
  365.  
  366.     gCPlusTool = this;
  367.  
  368.     fArgc = argc;
  369.     fArgv = argv;
  370.  
  371.     fStartTicks = TickCount();
  372.  
  373.     GetDateTime(theDateTime);
  374.     fStartDateTime = theDateTime;
  375.  
  376.     SpinCursor(1);
  377.     signal(SIGINT, &Intr);
  378.  
  379.     fProgName = Str255(argv[fArgvIndex]);
  380.     fRetCode = RC_ParmErrs;
  381.  
  382.     if (fInterrupted)
  383.         Stop("");
  384.  
  385.     fKeyWordList = new TAssociation;
  386.     fKeyWordList->IAssociation();
  387.  
  388.     InstallKeyWords();
  389. }
  390.  
  391. //--------------------------------------------------------------------------------------------------
  392. #pragma segment TRes
  393.  
  394. pascal void TCPlusTool::Run(void)
  395. {
  396.     FailInfo fi;
  397.  
  398.     if (fi.Try())
  399.     {
  400.         while (++fArgvIndex < fArgc)        // fArgc is the number of args plus one
  401.         {
  402.             RotateCursor(++fCursorCount);
  403.             ProcessArg(fArgv[fArgvIndex]);
  404.         }
  405.  
  406.         UnloadSeg(&InitUCPlusTool);
  407.         fRetCode = RC_Normal;
  408.  
  409.         if (fProgress)
  410.             DoStartProgress();
  411.  
  412.         DoToolAction();
  413.  
  414.         if (fTime)
  415.             fprintf(stderr, "Elapsed time: %-1.2f seconds\n", (TickCount() - fStartTicks) / 60);
  416.  
  417.         fi.Success();
  418.     }
  419.     else
  420.     {
  421.         OSErr theErr = fi.error;
  422.         Str255 theText;
  423.         Str255 progName = fProgName;
  424.  
  425.         if (theErr != noErr)
  426.         {
  427.             GetSysErrText(theErr, (char*)theText);
  428.             fprintf(stderr, "%ld%s: %s\n", kErrorMarker, (char*) progName, (char*) theText);
  429.             fRetCode = RC_Abort;
  430.         }
  431.     }
  432.  
  433.     exit((short)fRetCode);
  434. }
  435.  
  436. //--------------------------------------------------------------------------------------------------
  437. #pragma segment TRes
  438.  
  439. pascal void TCPlusTool::DoToolAction(void)
  440. {
  441.     Str255 aStr = fProgName;
  442.  
  443.     fprintf(stderr, "%ld%s: Forgot to override the default tool action\n", kErrorMarker, (char*) aStr);
  444. }
  445.  
  446.