home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / me34src.zip / me3 / mc / mmsa.c < prev    next >
C/C++ Source or Header  |  1995-01-14  |  4KB  |  180 lines

  1. /*
  2.  * mmsa.c : A MM front end to make a stand alone Mutt Machine
  3.  *  Craig Durland 6/87    Public Domain
  4.  */
  5.  
  6. #include <stdio.h>
  7. #include <os.h>
  8.  
  9. extern int MMask_pgm;    /* in mm.c */
  10. extern char result[];    /* in mm.c */
  11.  
  12. #include "mm.h"
  13. extern uint8 *MMglobal_vars;        /* in mm.c */
  14. extern void  *MMglobal_object_table;    /* in mm.c   Really a *Object[] */
  15. extern MMDatum RV, TV;    /* in mm.c */
  16. void MMbitch();
  17.  
  18. main(argc,argv) char *argv[];
  19. {
  20.   extern int MMask_pgm;
  21.  
  22.   MMask_pgm = TRUE;
  23.  
  24.   MMinitialize();
  25.   MMload(argv[1],TRUE);    /* load and go */
  26.   exit(0);
  27. }
  28.  
  29. void MMset_hooks() {}            /* No hooks used by this stuff */
  30. void MMgc_external_objects() {}        /* No external objects */
  31.  
  32. MMaux_fcn(name) char *name; { return FALSE; }
  33. void MMxtoken(token) { MMbitch("Invalid Xtoken"); }
  34.  
  35. MMask(prompt,buf) char *prompt, *buf;
  36. {
  37.   printf("%s",prompt); gets(buf); return TRUE;
  38. }
  39.  
  40. void MMmsg(str) char *str; { puts(str); }
  41.  
  42. void MMbitch(msg) char *msg;
  43. { printf("PGM ABORT(%u): %s\n",decodepc(),msg); MMabort_pgm(2); }
  44.  
  45. void MMmoan(msg) char *msg; { puts(msg); }
  46.  
  47. /* ******************************************************************** */
  48. /* ************************ Program Management ************************ */
  49. /* ******************************************************************** */
  50.  
  51. typedef struct        /* programs */
  52. {
  53.   char *name;        /* ascii name of command */
  54.   maddr addr;        /* address of routine */
  55. } PGM;
  56.  
  57. #define PGMMAX 100
  58.  
  59. PGM pgms[PGMMAX];
  60. int pbsize = 0;
  61. static maddr codeblock;
  62.  
  63. maddr MMpgm_addr(n) { return pgms[n].addr; }
  64.  
  65. maddr pcat();
  66. decodepc() { return (int)(pcat() - codeblock); }
  67.  
  68.     /*  MMopen_code_file(name): open the code file.
  69.      *  name munged to contain name of opened file.
  70.      *  returns: ptr to opened file
  71.      */
  72. FILE *MMopen_code_file(name) char *name;
  73. {
  74.   return fopen(name,"rb");
  75. }
  76.  
  77. MMadd_pgm(name,tag,addr) char *name; maddr addr;
  78. {
  79.   if (pbsize >= PGMMAX) { MMmoan("pgm table OD"); return FALSE; }
  80.   pgms[pbsize].name = name; pgms[pbsize].addr = addr; pbsize++;
  81.   return TRUE;
  82. }
  83.  
  84. void MMblock_name(buf,fname) char *buf,*fname;    /* create the block name */
  85. {}
  86.  
  87. static char block_name[200];
  88. static uint8 *lglobal_vars;
  89. static void *lglobal_object_table;
  90.  
  91. MMadd_block(name,code,global_vars, global_object_table,num_global_objects)
  92.   char *name; maddr code; uint8 *global_vars;
  93.   void *global_object_table; int num_global_objects;
  94. {
  95.   strcpy(block_name,name);
  96.   codeblock = code;
  97.   lglobal_object_table = global_object_table;
  98.   lglobal_vars = global_vars;
  99.  
  100.   return 0;
  101. }
  102.  
  103.     /* Use binary search to find pgm
  104.      * returns index of token if found
  105.      * -1 if not found
  106.      */
  107. MMpgm_lookup(name) char *name;
  108. {
  109.   register int  j, lower=0, upper=pbsize-1, x;
  110.  
  111.   while (lower<=upper)
  112.   {
  113.     j = (lower+upper)/2;
  114.     if ((x = strcmp(name,pgms[j].name))>0) lower = j +1;
  115.     else if (x<0) upper = j -1; else return j;
  116.   }
  117.   return -1;
  118. }
  119.  
  120. void MMset_block(block_id)
  121. {
  122.   MMglobal_vars        = lglobal_vars;
  123.   MMglobal_object_table = lglobal_object_table;
  124. }
  125.  
  126. maddr MMblock_code()
  127. {
  128.   return codeblock;
  129. }
  130.  
  131. /* ******************************************************************** */
  132. /* ****************************** Debug ******************************* */
  133. /* ******************************************************************** */
  134.  
  135. MMtrace_back(op, level, block, addr) maddr addr;
  136. {
  137.   char *name;
  138.   int i, offset;
  139.   PGM *ptr;
  140.  
  141. #if 0
  142.   printf("abase = %d, vbase = %d, numargs = %d, varstack size = %d\n",
  143.     abase,vbase,numargs,vsptr);
  144. #endif
  145.   if (0 == level) puts("~~~~~~ Trace Back ~~~~~~~~");
  146.  
  147. #if 0    /* not sorted by addr */
  148.   if (addr < pgms[0].addr)
  149.   {
  150.     offset = addr - codeblock;
  151.     name = "Start";
  152.   }
  153.   else
  154.   {
  155.     ptr = NULL;
  156.     for (i = 0; i < pbsize - 1; i++)
  157.       if (pgms[i].addr <= addr && addr < pgms[i+1].addr)
  158.       {
  159.     ptr = &pgms[i];
  160.     name = ptr->name;
  161.     offset = addr - ptr->addr;
  162.     break;
  163.       }
  164.     if (!ptr)
  165.     {
  166.       ptr = &pgms[pbsize - 1];
  167.  
  168.       name = ptr->name;
  169.       offset = addr - ptr->addr;
  170.     }
  171.   }
  172. #else
  173.   offset = addr - codeblock;
  174.   name = "Start";
  175. #endif
  176.  
  177.   printf("%d: %d in %s (%s + %d)\n",
  178.     level, addr - codeblock, block_name, name, offset);
  179. }
  180.