pchutil.h 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. // PCH Utils file
  2. #define PU_HANDLER(f) char *PchRCB_##f \
  3. (char *name,char *args,char *defn,char *proto,char *trueproto,char *param)
  4. #define PchUnpack(f,p,p0) (pch_read(p,p0,PchRCB_##f,NULL))
  5. #define PchUnpackP(f,p,p0,cbp) (pch_read(p,p0,PchRCB_##f,cbp))
  6. short __attribute__((stkparm)) sUnpackSize(char *in,char *dic);
  7. typedef char *(*PCHREAD_CB)(char *name,char *args,char *defn,char *proto,char *trueproto,char *param);
  8. char *write_until(char *d,char **s,char c) {
  9. char *p=*s;
  10. while (*p && *p!=c)
  11. *d++=*p++;
  12. *s=p+1;
  13. return d;
  14. }
  15. char *pch_read(char *p,char *p0,PCHREAD_CB cb,char *cbparam) {
  16. char *name=p,*args0=NULL,*defn0,*proto0;
  17. char *args,*defn,*proto,*pseudoproto;
  18. int flags;
  19. while (*p++);
  20. p+=2*3;
  21. if ((flags=((char *)p)[-2]<<8)&PCHID_MACRO) {
  22. args0=p;
  23. while (*p)
  24. while (*p++);
  25. p++;
  26. }
  27. defn0=p;
  28. while (*p++);
  29. proto0=p;
  30. p0+=((PCH_HEAD *)p0)->dic_off;
  31. proto=alloca(sUnpackSize(proto0,p0));
  32. sUnpack(proto0,proto,p0);
  33. pseudoproto=proto;
  34. if (args0) {
  35. char *d;
  36. args=d=alloca(defn0-args0);
  37. *d++='(';
  38. p=args0;
  39. if (*p)
  40. while (1) {
  41. while ((*d++=*p++));
  42. d--;
  43. if (!*p) break;
  44. *d++=',';
  45. }
  46. *d++=')';
  47. *d=0;
  48. } else args="";
  49. if ((flags&PCHID_PACKED)) {
  50. defn=alloca(sUnpackSize(defn0,p0));
  51. sUnpack(defn0,defn,p0);
  52. } else defn=defn0;
  53. if (*defn=='_' && !strncmp(defn,"_rom_call(",10)) {
  54. char *s=defn+10,*d=alloca(strlen(s)+2);
  55. pseudoproto=d;
  56. d=write_until(d,&s,',');
  57. if (d[-1]!='*') *d++=' ';
  58. *d++='_';
  59. d=write_until(d,&s,')');
  60. *d++=')';
  61. *d++=';';
  62. *d=0;
  63. }
  64. return cb(name,args,defn,pseudoproto,proto,cbparam);
  65. }
  66. asm("
  67. xdef sUnpackSize
  68. sUnpackSize:
  69. move.l 4(%sp),%a0
  70. moveq #1,%d0
  71. moveq #126,%d1
  72. moveq #0,%d2
  73. move.b (%a0)+,%d2
  74. beq sus_quit
  75. bmi sus_special
  76. sus_copy_lp:
  77. addq.w #1,%d0
  78. sus_next:
  79. move.b (%a0)+,%d2
  80. bgt sus_copy_lp
  81. beq sus_quit
  82. sus_special:
  83. subq.b #1,%d2
  84. bmi sus_not_escape
  85. move.b (%a0)+,%d2
  86. bra sus_copy_lp
  87. sus_not_escape:
  88. addq.b #2,%d2
  89. bmi sus_not_romcall
  90. sus_not_romcall:
  91. add.b %d1,%d2
  92. move.l 8(%sp),%a1
  93. dbf %d2,sus_search_loop
  94. bra sus_search_done
  95. sus_search_loop:
  96. tst.b (%a1)+
  97. bne sus_search_loop
  98. dbf %d2,sus_search_loop
  99. sus_search_done:
  100. addq.w #1,%d0
  101. move.b (%a1)+,%d2
  102. bne sus_search_done
  103. subq.w #1,%d0
  104. moveq #0,%d2
  105. bra sus_next
  106. sus_quit:
  107. rts");