summaryrefslogtreecommitdiff
path: root/mwrite_heap.c
diff options
context:
space:
mode:
Diffstat (limited to 'mwrite_heap.c')
-rw-r--r--mwrite_heap.c237
1 files changed, 237 insertions, 0 deletions
diff --git a/mwrite_heap.c b/mwrite_heap.c
new file mode 100644
index 0000000..ce2f2c3
--- /dev/null
+++ b/mwrite_heap.c
@@ -0,0 +1,237 @@
+
+#include <Traps.h>
+#include <Memory.h>
+#include <Files.h>
+#include <Errors.h>
+#include <Script.h>
+#include <Resources.h>
+#include <LowMem.h>
+
+#define pb_RefNum (((HIOParam*)&pb)->ioRefNum)
+#define pb_Permssn (((HIOParam*)&pb)->ioPermssn)
+#define pb_Misc (((HIOParam*)&pb)->ioMisc)
+#define pb_PosMode (((HIOParam*)&pb)->ioPosMode)
+#define pb_PosOffset (((HIOParam*)&pb)->ioPosOffset)
+#define pb_Buffer (((HIOParam*)&pb)->ioBuffer)
+#define pb_NamePtr (((HIOParam*)&pb)->ioNamePtr)
+#define pb_VRefNum (((HIOParam*)&pb)->ioVRefNum)
+#define pb_DirID (((HFileParam*)&pb)->ioDirID)
+#define pb_FDirIndex (((HFileParam*)&pb)->ioFDirIndex)
+#define pb_FlFndrInfo (((HFileParam*)&pb)->ioFlFndrInfo)
+#define pb_ReqCount (((HIOParam*)&pb)->ioReqCount)
+#define pb_ActCount (((HIOParam*)&pb)->ioActCount)
+
+struct heap_info {
+ int *heap1_begin;
+ int *heap1_end;
+ int *heap2_begin;
+ int *heap2_end;
+ int *stack_begin;
+ int *stack_end;
+ int *text_begin;
+ int *data_begin;
+ int *small_integers;
+ int *characters;
+ int int_descriptor;
+ int char_descriptor;
+ int real_descriptor;
+ int bool_descriptor;
+ int string_descriptor;
+ int array_descriptor;
+};
+
+static int heap_written_count=0;
+
+#define MAX_N_HEAPS 10
+
+void write_heap (struct heap_info *h)
+{
+ HParamBlockRec pb;
+ OSErr error;
+ Str32 application_name,heap_file_name;
+ int application_name_length;
+
+ if (heap_written_count>=MAX_N_HEAPS)
+ return;
+
+ {
+ unsigned char *s;
+ int n;
+
+ s=LMGetCurApName();
+ application_name_length=*s++;
+
+ for (n=0; n<32; ++n){
+ if (n>=application_name_length)
+ application_name[n]='\0';
+ else {
+ application_name[n]=*s;
+ if (*s!='\0')
+ ++s;
+ }
+ }
+ }
+
+ {
+ char *end_heap_file_name_p;
+ int n,heap_file_name_length;
+
+ for (n=0; n<application_name_length; ++n)
+ heap_file_name[1+n]=application_name[n];
+
+ heap_file_name_length=application_name_length+14;
+ if (heap_file_name_length>31)
+ heap_file_name_length=31;
+ heap_file_name[0]=heap_file_name_length;
+
+ end_heap_file_name_p=(char*)&heap_file_name[1+heap_file_name_length];
+
+ end_heap_file_name_p[-14]=' ';
+ end_heap_file_name_p[-13]='H';
+ end_heap_file_name_p[-12]='e';
+ end_heap_file_name_p[-11]='a';
+ end_heap_file_name_p[-10]='p';
+ end_heap_file_name_p[-9]=' ';
+ end_heap_file_name_p[-8]='P';
+ end_heap_file_name_p[-7]='r';
+ end_heap_file_name_p[-6]='o';
+ end_heap_file_name_p[-5]='f';
+ end_heap_file_name_p[-4]='i';
+ end_heap_file_name_p[-3]='l';
+ end_heap_file_name_p[-2]='e';
+ end_heap_file_name_p[-1]='0'+heap_written_count++;
+ }
+
+ pb_NamePtr=heap_file_name;
+ pb_VRefNum=0;
+ pb_DirID=0;
+
+ error=PBHCreateSync ((void*)&pb);
+ if (error!=noErr && error!=-48/* dupFNErr*/){
+ heap_written_count=MAX_N_HEAPS;
+ return;
+ }
+
+ pb_VRefNum=0;
+ pb_DirID=0;
+ pb_FDirIndex=0;
+
+ if (PBHGetFInfoSync ((void*)&pb)==noErr){
+ pb_VRefNum=0;
+ pb_DirID=0;
+ pb_FlFndrInfo.fdCreator='PRHP';
+ pb_FlFndrInfo.fdType='PRHP';
+ PBHSetFInfoSync ((void*)&pb);
+ }
+
+ pb_NamePtr=heap_file_name;
+ pb_VRefNum=0;
+ pb_DirID=0;
+ pb_Misc=(Ptr)0;
+ pb_Permssn=fsWrPerm;
+
+ error=PBHOpenSync ((void*)&pb);
+ if (error!=noErr){
+ heap_written_count=MAX_N_HEAPS;
+ return;
+ }
+
+ pb_Buffer=(char*)application_name;
+ pb_ReqCount=32;
+
+ pb_PosMode=fsAtMark;
+ pb_PosOffset=0;
+
+ error=PBWriteSync ((ParmBlkPtr)&pb);
+ if (error!=noErr){
+ PBCloseSync ((ParmBlkPtr)&pb);
+ heap_written_count=MAX_N_HEAPS;
+ return;
+ }
+
+ pb_Buffer=(char*)h;
+ pb_ReqCount=sizeof (struct heap_info);
+
+ pb_PosMode=fsAtMark;
+ pb_PosOffset=0;
+
+ error=PBWriteSync ((ParmBlkPtr)&pb);
+ if (error!=noErr){
+ PBCloseSync ((ParmBlkPtr)&pb);
+ heap_written_count=MAX_N_HEAPS;
+ return;
+ }
+
+#if 0
+ {
+ int n;
+ Handle h;
+
+ n=0;
+ do {
+ h=Get1Resource ('CODE',n);
+
+ if (h!=NULL)
+ pb_Buffer=(char*)h;
+ else
+ pb_Buffer=(char*)&h;
+ pb_ReqCount=sizeof (Ptr);
+
+ pb_PosMode=fsAtMark;
+ pb_PosOffset=0;
+
+ error=PBWriteSync ((ParmBlkPtr)&pb);
+ if (error!=noErr){
+ PBCloseSync ((ParmBlkPtr)&pb);
+ heap_written_count=MAX_N_HEAPS;
+ return;
+ }
+
+ ++n;
+ } while (h!=NULL);
+ }
+#endif
+
+ pb_Buffer=(char*)h->stack_begin;
+ pb_ReqCount=(int)(h->stack_end) - (int)(h->stack_begin);
+
+ pb_PosMode=fsAtMark;
+ pb_PosOffset=0;
+
+ error=PBWriteSync ((ParmBlkPtr)&pb);
+ if (error!=noErr){
+ PBCloseSync ((ParmBlkPtr)&pb);
+ heap_written_count=MAX_N_HEAPS;
+ return;
+ }
+
+ pb_Buffer=(char*)h->heap1_begin;
+ pb_ReqCount=(int)(h->heap1_end) - (int)(h->heap1_begin);
+
+ pb_PosMode=fsAtMark;
+ pb_PosOffset=0;
+
+ error=PBWriteSync ((ParmBlkPtr)&pb);
+ if (error!=noErr){
+ PBCloseSync ((ParmBlkPtr)&pb);
+ heap_written_count=MAX_N_HEAPS;
+ return;
+ }
+
+ if (h->heap2_begin!=h->heap2_end){
+ pb_Buffer=(char*)h->heap2_begin;
+ pb_ReqCount=(int)(h->heap2_end) - (int)(h->heap2_begin);
+
+ pb_PosMode=fsAtMark;
+ pb_PosOffset=0;
+
+ error=PBWriteSync ((ParmBlkPtr)&pb);
+ if (error!=noErr){
+ PBCloseSync ((ParmBlkPtr)&pb);
+ heap_written_count=MAX_N_HEAPS;
+ return;
+ }
+ }
+
+ PBCloseSync ((ParmBlkPtr)&pb);
+}