Change 12193 by pudge@pudge-mobile on 2001/09/25 02:53:42

        Fixes for multiline error parsing (Bug #459263); cmd-.
        not working, cursor not spinning (Bug #422129); external
        editor problems (Bug #456329); escape/cmd-. not activating
        "Cancel" in Save dialog box (Bug #446960); Runtimes not
        executing on launch (Bug #464441).

Affected files ...

... //depot/maint-5.6/macperl/macos/macish.c#6 edit
... //depot/maint-5.6/macperl/macos/macish.h#6 edit
... //depot/maint-5.6/macperl/macos/macperl/MPEditor.c#2 edit
... //depot/maint-5.6/macperl/macos/macperl/MPGlobals.h#2 edit
... //depot/maint-5.6/macperl/macos/macperl/MPScript.c#2 edit
... //depot/maint-5.6/macperl/macos/macperl/MacPerl.r#3 edit

Differences ...

==== //depot/maint-5.6/macperl/macos/macish.c#6 (text) ====
Index: perl/macos/macish.c
--- perl/macos/macish.c.~1~     Mon Sep 24 21:00:06 2001
+++ perl/macos/macish.c Mon Sep 24 21:00:06 2001
@@ -18,6 +18,7 @@
 #undef modff
 #include <fp.h>
 #include <LowMem.h>
+#include <Timer.h>
 
 char **environ;
 static  char ** gEnviron;
@@ -775,9 +776,130 @@
        return t->tms_utime;
 }
 
+/********************* Asynchronous Event management ************
+ * MacPerl maintains an os queue of tasks to be executed at a 
+ * reasonably "sane" time (in runops, to be more exact).
+ */
+
+static QHdr sMacPerlAsyncQueue;
+
+Boolean MacPerl_QueueAsyncTask(MacPerl_AsyncTask * task)
+{
+       if (task->fPending) /* Already queued. Race condition resolved below */
+               return false;
+       task->fPending = true;
+       if (!Dequeue((QElemPtr) task, &sMacPerlAsyncQueue)) /* Just in case somebody 
+beat us in the race */
+               return false;
+       Enqueue((QElemPtr) task, &sMacPerlAsyncQueue);
+       
+       gMacPerl_HasAsyncTasks = true;  /* Flag for main loop to call async event 
+processing */
+       
+       return true;
+}
+
+void MacPerl_DoAsyncTasks()
+{
+       QElemPtr                        elem;
+       MacPerl_AsyncTask * task;
+       
+       gMacPerl_HasAsyncTasks = false; /* Though this might be set again while we 
+process */
+       while (elem = sMacPerlAsyncQueue.qHead) {
+               Dequeue(elem, &sMacPerlAsyncQueue);
+               task = (MacPerl_AsyncTask *) elem;      /* Remove from queue */
+               task->fProc(task);                                              /* 
+Call procedure */
+               task->fPending = false;                                 /* Allow it to 
+be queued again */
+       }
+}
+
+/*
+ * Asynchronous tasks come in handy to exit gracefully from the middle of a script
+ */
+static MacPerl_AsyncTask       sAsyncExit;
+static int                                     sExitStatus;
+
+static void AsyncExit(MacPerl_AsyncTask * task) 
+{
+       dTHX;
+       
+       my_exit(sExitStatus);
+}
+
+void _exit(int status)
+{
+       if (MacPerl_QueueAsyncTask(&sAsyncExit))
+               sExitStatus = status;
+}
+
+/********************* Cursor Spin management *******************
+ * The other built in asynchronous task is cursor spinning.
+ */
+
+static struct SpinControlRec {
+       TMTask                          fTimer;
+       MacPerl_AsyncTask       fTask;
+} sSpinControl;
+
+#define SPIN_FREQUENCY 200
+
+static void SpinTimer(struct SpinControlRec * spin)
+{
+       MacPerl_QueueAsyncTask(&spin->fTask);   /* Queue task for a safe time */
+       PrimeTime((QElem *) &spin->fTimer, SPIN_FREQUENCY);
+}
+
+#if GENERATINGCFM
+static RoutineDescriptor       uSpinTimer =
+               BUILD_ROUTINE_DESCRIPTOR(uppTimerProcInfo, SpinTimer);
+#elif defined(__MWERKS__)
+static pascal void uSpinTimer(struct SpinControlRec * param : __A1) { 
+SpinTimer(param); }
+#else
+void * GetA1()  ONEWORDINLINE(0x2009);
+static pascal void uSpinTimer()                \
+               { SpinTimer((struct SpinControlRec *)GetA1()); }
+#endif
+
+static void SpinMacCursor(MacPerl_AsyncTask * task) 
+{
+       sleep(0);
+}
+
+static void StopSpinControl()
+{      
+       RmvTime((QElem *) &sSpinControl.fTimer);
+}
+
+/*
+ * It seeems that calling Perl_call_atexit at init time is suicidal, so
+ * we don't kick off the whole thing until we are well within the interpreter
+ */
+
+static void StartSpinControl(MacPerl_AsyncTask * task)
+{
+       dTHX;
+       
+       sSpinControl.fTimer.tmAddr              =       (TimerUPP)&uSpinTimer;
+       sSpinControl.fTimer.tmCount             =       0;
+       sSpinControl.fTimer.tmWakeUp    =       0;
+       sSpinControl.fTimer.tmReserved  =       0;
+       sSpinControl.fTask.fProc                =       SpinMacCursor;
+               
+       InsTime((QElem *) &sSpinControl.fTimer);
+       PrimeTime((QElem *) &sSpinControl.fTimer, SPIN_FREQUENCY);
+
+       Perl_call_atexit(aTHX_ StopSpinControl, NULL);
+}
+
 void MacPerl_init()
 {
        gMacPerl_StartClock = LMGetTicks();
+
+       sSpinControl.fTask.fPending             =       false;
+       sSpinControl.fTask.fProc                =       StartSpinControl;
+
+       sAsyncExit.fPending                             =       false;
+       sAsyncExit.fProc                                =       AsyncExit;
+
+       MacPerl_QueueAsyncTask(&sSpinControl.fTask);
 }
 
 void
@@ -842,11 +964,17 @@
                if (line[6] >= '0' && line[6] <= '9') {
                        /* Got line, now look for end of line number */
                        const char * endline = line+7;
+                       const char * newline;
                        
-                       while (*endline >= '0' && *endline <= '9')
+                       while (*endline >= '0' && *endline <= '9' && endline < msg+len)
                                ++endline;
-                       if (*endline == ' ')
+                       if (*endline == ' ' && endline < msg+len)
                                ++endline;
+                       for (newline = endline; *newline != '\n' && newline < msg+len; 
+++newline)
+                               ;
+                       if (*newline == '\n' && newline < msg+len)
+                               ++newline;
+                               
                        /* Got it, now look for preceding " at ." length reduced by 1 
because file name
                         * must be at least 1 character long.
                         */
@@ -863,14 +991,19 @@
                                        
                                /* OK, we got them both, write the original message 
prefixed with # */
                                WriteMsg(io, msg, at-msg, true);
-                               WriteMsg(io, endline, msg+len-endline, false);
+                               PerlIO_write(io, endline, newline-endline);
                                PerlIO_write(io, "File \'", 6);
                                PerlIO_write(io, at+4, line-at-4);
                                PerlIO_write(io, "\'; Line ", 8);
                                PerlIO_write(io, line+6, endline-line-6);
                                PerlIO_write(io, "\n", 1);
                                
-                               return;
+                               len    -= newline-msg;
+                               msg     = newline;
+                               line    = msg;
+                               
+                               if (!len)       /* We're done */
+                                       return;
                        }
                }
        }

==== //depot/maint-5.6/macperl/macos/macish.h#6 (text) ====
Index: perl/macos/macish.h
--- perl/macos/macish.h.~1~     Mon Sep 24 21:00:06 2001
+++ perl/macos/macish.h Mon Sep 24 21:00:06 2001
@@ -206,6 +206,19 @@
 #define PERL_SYS_TERM()                MALLOC_TERM
 #endif
 
+MP_EXT Boolean                 gMacPerl_HasAsyncTasks;
+void MacPerl_DoAsyncTasks();
+#define PERL_ASYNC_CHECK() while (gMacPerl_HasAsyncTasks) MacPerl_DoAsyncTasks()
+typedef struct MacPerl_AsyncTask {
+       void    *       qLink;          /* Don't set */
+       short    qType;         /* Queue type. Ignore */
+       Boolean  fPending;   /* Is element queued already? */
+       Boolean  fill;
+       void     (*fProc)(struct MacPerl_AsyncTask * task); /* Procedure to call */
+} MacPerl_AsyncTask;
+Boolean MacPerl_QueueAsyncTask(MacPerl_AsyncTask * task);
+Boolean        MacPerl_QueueAsyncExit();
+
 #define PERL_WRITE_MSG_TO_CONSOLE(io, msg, len) MacPerl_WriteMsg(io, msg, len)
 
 #define BIT_BUCKET "Dev:Null"

==== //depot/maint-5.6/macperl/macos/macperl/MPEditor.c#2 (text) ====
Index: perl/macos/macperl/MPEditor.c
--- perl/macos/macperl/MPEditor.c.~1~   Mon Sep 24 21:00:06 2001
+++ perl/macos/macperl/MPEditor.c       Mon Sep 24 21:00:06 2001
@@ -6,6 +6,9 @@
 Language       :       MPW C
 
 $Log: MPEditor.c,v $
+Revision 1.2  2001/09/10 07:39:03  neeri
+External editor would sometimes corrupt files (MacPerl Bug #456329)
+
 Revision 1.1  2000/11/30 08:37:29  neeri
 Sources & Resources
 
@@ -475,7 +478,7 @@
        HLock((Handle) gExternalFiles);
        mycell.h = mycell.v = 0;
        for (; mycell.v<gExternalFileCount; ++mycell.v) {
-               StringPtr       name = gExternalFiles[0][mycell.v].name;
+               StringPtr       name = gExternalFiles[0][mycell.v << 1].name;
                LSetCell(name+1, *name, mycell, gPickList);
        }
        HUnlock((Handle) gExternalFiles);
@@ -666,7 +669,7 @@
                }
                HSetState((Handle) gExternalFiles, state);
                if (refCon != 2) {
-                       Munger((Handle) gExternalFiles, i*sizeof(FSSpec), nil, 
2*sizeof(FSSpec), nil, 0);
+                       Munger((Handle) gExternalFiles, (i<<1)*sizeof(FSSpec), nil, 
+2*sizeof(FSSpec), nil, 0);
                        if (!--gExternalFileCount) {
                                DisposeHandle((Handle) gExternalFiles);
                                gExternalFiles = 0;

==== //depot/maint-5.6/macperl/macos/macperl/MPGlobals.h#2 (text) ====
Index: perl/macos/macperl/MPGlobals.h
--- perl/macos/macperl/MPGlobals.h.~1~  Mon Sep 24 21:00:06 2001
+++ perl/macos/macperl/MPGlobals.h      Mon Sep 24 21:00:06 2001
@@ -163,9 +163,9 @@
        Save Changes Dialog Items
 */
 
-#define  aaSave                        1
-#define  aaDiscard             2
-#define  aaCancel              3
+#define  aaSave                1
+#define  aaCancel              2
+#define  aaDiscard             3
 
 #define  kOSEvent                                      app4Evt /*event used by 
MultiFinder*/
 #define  kSuspendResumeMessage         1               /*high byte of suspend/resume 
event message*/

==== //depot/maint-5.6/macperl/macos/macperl/MPScript.c#2 (text) ====
Index: perl/macos/macperl/MPScript.c
--- perl/macos/macperl/MPScript.c.~1~   Mon Sep 24 21:00:06 2001
+++ perl/macos/macperl/MPScript.c       Mon Sep 24 21:00:06 2001
@@ -5,6 +5,9 @@
 Language       :       MPW C
 
 $Log: MPScript.c,v $
+Revision 1.5  2001/09/13 07:28:10  neeri
+Fix signal handling (MacPerlBug #422129)
+
 Revision 1.4  2001/04/16 02:42:43  neeri
 run_perl no longer longjmps (MacPerl bug #232703)
 
@@ -281,9 +284,8 @@
 {
        if (gRunningPerl)
                longjmp(gExitPerl, -status-1);
-       else {
+       else 
                ExitToShell();
-       }
 }
 
 static atexitfn        PerlExitFn[20];
@@ -293,9 +295,8 @@
 {
        if (gRunningPerl)
                PerlExitFn[PerlExitCnt++] = func;
-       else {
+       else 
                return atexit(func);
-       }
                
        return 0;
 }
@@ -318,10 +319,6 @@
 
 pascal void InitPerlEnviron()
 {
-       /* gDebugLogName        = "Dev:Console:Debug Log";
-       gExit                           = MP_Exit;
-       gAtExit                 = MP_AtExit;
-        */
        gMacPerl_AlwaysExtract  = true;
        gMacPerl_HandleEvent            = HandleEvent;
 }
@@ -617,7 +614,6 @@
        
        ShowWindowStatus();
        
-       signal(SIGINT, exit);
        setvbuf(stdout, NULL, _IOLBF, BUFSIZ);
        setvbuf(stderr, NULL, _IOLBF, BUFSIZ);
        
@@ -1011,18 +1007,16 @@
 
 pascal Boolean DoRuntime()
 {
-#if 0
        FSSpec  spec;
        
        if (gRuntimeScript = Get1NamedResource('TEXT', (StringPtr) "\p!")) {
                spec.vRefNum    =       gAppVol;
-               spec.parID              =       gAppDir;
+               spec.parID      =       gAppDir;
                PLstrcpy(spec.name, LMGetCurApName());
                strcpy(gMacPerl_PseudoFileName, GUSIFSp2FullPath(&spec));
-               
+
                DetachResource(gRuntimeScript);
        }
-#endif
 
        return false;
 }

==== //depot/maint-5.6/macperl/macos/macperl/MacPerl.r#3 (text) ====
Index: perl/macos/macperl/MacPerl.r
--- perl/macos/macperl/MacPerl.r.~1~    Mon Sep 24 21:00:06 2001
+++ perl/macos/macperl/MacPerl.r        Mon Sep 24 21:00:06 2001
@@ -9,6 +9,12 @@
 Language       :       MPW C
 
 $Log: MacPerl.r,v $
+Revision 1.8  2001/09/24 04:31:55  neeri
+Include cursors in build (MacPerl Bug #432129)
+
+Revision 1.7  2001/09/02 00:41:01  pudge
+Sync with perforce
+
 Revision 1.6  2001/04/17 03:59:58  pudge
 Minor version/config changes
 
@@ -185,6 +191,18 @@
 include "MacPerl.rsrc" 'icm#'(265);
 include "MacPerl.rsrc" 'icm#'(266);
 
+include "Perl.rsrc" 'CURS' (146);
+include "Perl.rsrc" 'CURS' (144);
+include "Perl.rsrc" 'CURS' (145);
+include "Perl.rsrc" 'CURS' (147);
+include "Perl.rsrc" 'CURS' (148);
+include "Perl.rsrc" 'CURS' (160);
+include "Perl.rsrc" 'CURS' (161);
+include "Perl.rsrc" 'CURS' (162);
+include "Perl.rsrc" 'CURS' (163);
+include "Perl.rsrc" 'acur' (0);
+include "Perl.rsrc" 'acur' (128);
+
 #include "MPVersion.r";
 
 resource 'vers' (1) {
@@ -275,7 +293,7 @@
        reserved,
 /*     3840 * 1024,
        1536 * 1024 */
-       10 * 1024 * 1024,
+       15 * 1024 * 1024,
        2  * 1024 * 1024
 };
 
@@ -479,8 +497,8 @@
 
 resource 'DITL' (SaveAlert) {
        {       { 74, 303,  94, 362}, Button            { enabled, "Save"},
+               { 74, 231,  94, 290}, Button            { enabled, "Cancel"},
                { 74,  65,  94, 150}, Button            { enabled, "Donıt Save"},
-               { 74, 231,  94, 290}, Button            { enabled, "Cancel"},
                { 10,  65,  59, 363}, StaticText {disabled, "Save changes to ³^0²?"},
                { 10,  20,  42,  52}, Icon              {disabled, 2},
                {  0,   0,   0,   0}, HelpItem  {disabled, HMScanhdlg { SaveAlert } },
End of Patch.

Reply via email to