TYPES.C
上传用户:hlzzc88
上传日期:2007-01-06
资源大小:220k
文件大小:5k
源码类别:

编译器/解释器

开发平台:

Others

  1. /*
  2.  * 68K/386 32-bit C compiler.
  3.  *
  4.  * copyright (c) 1997, David Lindauer
  5.  * 
  6.  * This compiler is intended for educational use.  It may not be used
  7.  * for profit without the express written consent of the author.
  8.  *
  9.  * It may be freely redistributed, as long as this notice remains intact
  10.  * and either the original sources or derived sources 
  11.  * are distributed along with any executables derived from the originals.
  12.  *
  13.  * The author is not responsible for any damages that may arise from use
  14.  * of this software, either idirect or consequential.
  15.  *
  16.  * v1.35 March 1997
  17.  * David Lindauer, gclind01@starbase.spd.louisville.edu
  18.  *
  19.  * Credits to Mathew Brandt for original K&R C compiler
  20.  *
  21.  */
  22. #include        <stdio.h>
  23. #include        "expr.h"
  24. #include        "c.h"
  25. extern int prm_cplusplus;
  26. extern char *tn_void;
  27. extern char *tn_char;
  28. extern char *tn_int;
  29. extern char *tn_long;
  30. extern char *tn_short;
  31. extern char *tn_unsigned;
  32. extern char *tn_ellipse;
  33. extern char *tn_float;
  34. extern char *tn_double;
  35. extern char *tn_longdouble;
  36. int exactype(TYP *typ1, TYP *typ2)
  37. {
  38. SYM *s1,*s2;
  39. while (typ1 && typ2) {
  40. if (typ1->type != typ2->type) {
  41.   if ((typ1->type != bt_func && typ1->type != bt_ifunc) ||
  42. (typ2->type != bt_ifunc && typ2->type != bt_func))
  43. return 0;
  44. }
  45. else switch(typ1->type) {
  46. case bt_ptrfunc:
  47. case bt_ifunc:
  48. case bt_func:
  49. if (!exactype(typ1->btp,typ2->btp))
  50. return 0;
  51. s1 = typ1->lst.head;
  52. s2 = typ2->lst.head;
  53. while (s1 && s2 && (s1 != (SYM *)-1) && (s2 != (SYM *)-1)) {
  54. if (!exactype(s1->tp,s2->tp))
  55. return 0;
  56. s1 = s1->next;
  57. s2 = s1->next;
  58. }
  59. return s1 == s2;
  60. case bt_struct:
  61. case bt_union:
  62. case bt_class:
  63. if (!typ1->sname || !typ2->sname)
  64. return 0;
  65. return(!strcmp(typ1->sname,typ2->sname));
  66. case bt_pointer:
  67. if (typ1->val_flag != typ2->val_flag || (typ1->size && typ2->size && typ1->size != typ2->size))
  68. return 0;
  69. }
  70. typ1=typ1->btp;
  71. typ2=typ2->btp;
  72. }
  73. return !(typ1 || typ2);
  74. }
  75. int checktype(TYP *typ1, TYP *typ2)
  76. {
  77. #ifdef CPLUSPLUS
  78. if (prm_cplusplus)
  79. return exactype(typ1,typ2);
  80. #endif
  81. if (typ1->type == typ2->type)
  82. return TRUE;
  83. else                                                 
  84. if ((typ2->type == bt_ptrfunc && (typ1->type == bt_ifunc || typ1->type == bt_func))
  85.  || (typ1->type == bt_ptrfunc && (typ2->type == bt_ifunc || typ2->type == bt_func)))
  86. return(TRUE);
  87. else
  88. if (typ1->type == bt_enum) {
  89. switch (typ2->type) {
  90. case bt_long: case bt_unsigned:
  91. case bt_short: case bt_unsignedshort:
  92. case bt_char: case bt_unsignedchar:
  93. return(TRUE);
  94. }
  95. }
  96. else
  97. if (typ2->type == bt_enum) {
  98. switch (typ1->type) {
  99. case bt_long: case bt_unsigned:
  100. case bt_short: case bt_unsignedshort:
  101. case bt_char: case bt_unsignedchar:
  102. return(TRUE);
  103. }
  104. }
  105. else
  106. return FALSE;
  107. }
  108. int checktypeassign(TYP *typ1, TYP *typ2)
  109. {
  110. #ifdef CPLUSPLUS
  111. if (prm_cplusplus)
  112. return exactype(typ1,typ2);
  113. #endif
  114. while (typ1 && typ2 && typ1->type == typ2->type && typ1->size == typ2->size) {
  115. if (isscalar(typ1))
  116. return TRUE;
  117. typ1 = typ1->btp;
  118. typ2 = typ2->btp;
  119. }
  120. if (!typ1 && !typ2)
  121. return(TRUE);
  122. return(FALSE);
  123. }
  124. #ifdef CPLUSPLUS
  125. static TYP *unmang2(char *buf, TYP *tp, int *ptr, int **ptrs)
  126. {
  127. SYM *sp;
  128. switch (tp->type) {
  129. case bt_ptrfunc: {
  130. unmang2(buf,tp->btp,ptr,ptrs);
  131. buf = putptr(buf+strlen(buf),ptr,ptrs);
  132. sp = tp->lst.head;
  133. strcat(buf,"(*) (");
  134. if (sp != (SYM *)-1) {
  135. while (sp) {
  136. unmang2(buf+strlen(buf),sp->tp,ptr,ptrs);
  137. sp = sp->next;
  138. }
  139. }
  140. strcat(buf,")");
  141. buf = buf + strlen(buf);
  142. return 0;
  143. }
  144. case bt_float:
  145. strcpy(buf,tn_float);
  146. buf = putptr(buf,ptr,ptrs);
  147. return 0;
  148. case bt_double:
  149. strcpy(buf,tn_double);
  150. buf = putptr(buf,ptr,ptrs);
  151. return 0;
  152. case bt_longdouble:
  153. strcpy(buf,tn_longdouble);
  154. buf = putptr(buf,ptr,ptrs);
  155. return 0;
  156. case bt_unsigned:
  157. strcpy(buf,tn_unsigned);
  158. buf = buf + strlen(buf);
  159. case bt_long:
  160. strcpy(buf,tn_int);
  161. buf = putptr(buf,ptr,ptrs);
  162. return 0;
  163. case bt_unsignedshort:
  164. strcpy(buf,tn_unsigned);
  165. buf = buf + strlen(buf);
  166. case bt_short:
  167. strcpy(buf,tn_short);
  168. buf = putptr(buf,ptr,ptrs);
  169. return 0;
  170. case bt_unsignedchar:
  171. strcpy(buf,tn_unsigned);
  172. buf = buf + strlen(buf);
  173. case bt_char:
  174. strcpy(buf,tn_char);
  175. buf = putptr(buf,ptr,ptrs);
  176. return 0;
  177. case bt_void:
  178. strcpy(buf,tn_void);
  179. buf = putptr(buf,ptr,ptrs);
  180. return 0;
  181. case bt_pointer:
  182. (*ptrs)[(*ptr)++] = 0;
  183. return tp->btp;
  184. case bt_ref:
  185. (*ptrs)[(*ptr)++] = 1;
  186. return tp->btp;
  187. case bt_ellipse:
  188. strcpy(buf,tn_ellipse);
  189. return 0;
  190. }
  191. return 0;
  192. }
  193. char * typenum(char *buf, TYP *typ)
  194. {
  195. int ptr = 0;
  196. char ptrs[50];
  197. *buf++ = '(';
  198. while (typ) {
  199. typ = unmang2(buf,typ,&ptr,ptrs);
  200. buf = buf+strlen(buf);
  201. if (typ) 
  202. *buf++ = ',';
  203. else
  204. *buf++ = ')';
  205. }
  206. *buf=0;
  207. return buf;
  208. }
  209. #endif