hschumann2/TempleOS-Source-Code
0838
1 2U0 LexBackupLastChar(CCmpCtrl *cc)3{4 CLexFile *tmpf=cc->lex_include_stk;5 tmpf->buf_ptr=cc->cur_buf_ptr;6 if (cc->flags & CCF_USE_LAST_U16) {7 tmpf->last_U16=cc->last_U16;8 cc->flags&=~CCF_USE_LAST_U16;9 } else10 tmpf->last_U16=0;11}12 13U0 LexPush(CCmpCtrl *cc)14{//Create token-stream save point.15 CLexFile *tmpf;16 LexBackupLastChar(cc);17 if (cc->lex_include_stk->last_U16)18 cc->flags|=CCF_USE_LAST_U16;19 tmpf=MAllocIdent(cc->lex_include_stk);20 tmpf->next=cc->lex_prs_stk;21 cc->lex_prs_stk=tmpf;22}23 24U0 LexPopRestore(CCmpCtrl *cc)25{//Restore token-stream saved-point.26//Bad things can happen if you cross an #include file boundary.27 CLexFile *tmpf=cc->lex_prs_stk;28 cc->cur_buf_ptr=tmpf->buf_ptr;29 if (cc->last_U16=tmpf->last_U16)30 cc->flags|=CCF_USE_LAST_U16;31 else32 cc->flags&=~CCF_USE_LAST_U16;33 MemCpy(cc->lex_include_stk(U8 *)+sizeof(U8 *),tmpf(U8 *)+sizeof(U8 *),34 sizeof(CLexFile)-sizeof(U8 *));35 cc->lex_prs_stk=tmpf->next;36 Free(tmpf);37}38 39U0 LexPopNoRestore(CCmpCtrl *cc)40{//Don't restore token-stream saved-point.41 CLexFile *tmpf=cc->lex_prs_stk;42 cc->lex_prs_stk=tmpf->next;43 Free(tmpf);44}45 46I64 MemberMetaData(U8 *needle_str,CMemberLst *haystack_member_lst)47{//Find meta data name, return meta data val. See ::/Demo/ClassMeta.HC.48 CMemberLstMeta *meta=haystack_member_lst->meta;49 while (meta) {50 if (!StrCmp(meta->str,needle_str))51 return meta->user_data;52 meta=meta->next;53 }54 return 0;55}56 57CMemberLstMeta *MemberMetaFind(U8 *needle_str,CMemberLst *haystack_member_lst)58{//Find meta data name, return meta data struct. See ::/Demo/ClassMeta.HC.59 CMemberLstMeta *meta=haystack_member_lst->meta;60 while (meta) {61 if (!StrCmp(meta->str,needle_str))62 return meta;63 meta=meta->next;64 }65 return NULL;66}67 68CMemberLst *MemberFind(U8 *needle_str,CHashClass *haystack_class)69{//Find class member. See ClassRep() and DocForm().70 I64 i;71 CMemberLst *tmpm;72 do {73 tmpm=haystack_class->member_lst_and_root;74 while (tmpm) {75 if (!(i=StrCmp(tmpm->str,needle_str))) {76 tmpm->use_cnt++;77 return tmpm;78 }79 if (i<=0)80 tmpm=tmpm->left;81 else82 tmpm=tmpm->right;83 }84 } while (haystack_class=haystack_class->base_class);85 return NULL;86}87 88CMemberLst *MemberClassBaseFind(CHashClass *needle_class,89 CHashClass *haystack_class)90{//Find class member class base. For finding dup class local vars.91 CMemberLst *tmpm;92 tmpm=haystack_class->member_class_base_root;93 while (tmpm) {94 if (needle_class==tmpm->member_class_base)95 return tmpm;96 if (needle_class<tmpm->member_class_base)97 tmpm=tmpm->left_class_base;98 else99 tmpm=tmpm->right_class_base;100 }101 return NULL;102}103 104U0 MemberAdd(CCmpCtrl *cc,CMemberLst *tmpm,CHashClass *tmpc,I64 mode)105{106 U8 *st=tmpm->str;107 CMemberLst **tmpm1,*tmpm2;108 109 if (MemberFind(st,tmpc) && StrCmp(st,"pad") &&110 StrCmp(st,"reserved") && StrCmp(st,"_anon_"))111 LexExcept(cc,"Duplicate member at ");112 tmpm1=&tmpc->member_lst_and_root;113 while (tmpm2=*tmpm1) {114 if (StrCmp(tmpm2->str,st)<=0)115 tmpm1=&tmpm2->left;116 else117 tmpm1=&tmpm2->right;118 }119 *tmpm1=tmpm;120 121 if (mode==PRS1B_LOCAL_VAR) {122 tmpm->member_class_base=123 tmpm->member_class-tmpm->member_class->ptr_stars_cnt;124 if (Bt(&cc->opts,OPTf_WARN_DUP_TYPES) &&125 MemberClassBaseFind(tmpm->member_class_base,tmpc))126 LexWarn(cc,"Duplicate type at ");127 tmpm1=&tmpc->member_class_base_root;128 while (tmpm2=*tmpm1) {129 if (tmpm->member_class_base<tmpm2->member_class_base)130 tmpm1=&tmpm2->left_class_base;131 else if (tmpm->member_class_base>tmpm2->member_class_base)132 tmpm1=&tmpm2->right_class_base;133 else {134 tmpm1=NULL;135 break;136 }137 }138 if (tmpm1)139 *tmpm1=tmpm;140 } else141 tmpm->member_class_base=NULL;142 143 tmpm->left=NULL;144 tmpm->right=NULL;145 tmpm->left_class_base=NULL;146 tmpm->right_class_base=NULL;147 tmpm2=tmpc->last_in_member_lst;148 tmpm2->next=tmpc->last_in_member_lst=tmpm;149}150 151CMemberLst *MemberLstNew(I64 _reg)152{153 CMemberLst *res=CAlloc(sizeof(CMemberLst));154 res->reg=_reg;155 return res;156}157 158Bool MemberLstCmp(CMemberLst *tmpm1,CMemberLst *tmpm2,I64 cnt=I64_MAX)159{160 while (tmpm1 && tmpm2 && cnt--) {161 if (StrCmp(tmpm1->str,tmpm2->str) ||162 tmpm1->member_class!=tmpm2->member_class ||163 tmpm1->member_class_base!=tmpm2->member_class_base)164 return FALSE;165 if (tmpm1->flags&MLF_DFT_AVAILABLE || tmpm2->flags&MLF_DFT_AVAILABLE) {166 if (tmpm1->flags&(MLF_DFT_AVAILABLE|MLF_STR_DFT_AVAILABLE)!=167 tmpm2->flags&(MLF_DFT_AVAILABLE|MLF_STR_DFT_AVAILABLE))168 return FALSE;169 if (tmpm1->flags&MLF_STR_DFT_AVAILABLE) {170 if (StrCmp(tmpm1->dft_val,tmpm2->dft_val))171 return FALSE;172 } else if (tmpm1->dft_val!=tmpm2->dft_val)173 return FALSE;174 }175 tmpm1=tmpm1->next;176 tmpm2=tmpm2->next;177 }178 if (cnt<0 || !tmpm1 && !tmpm2)179 return TRUE;180 else181 return FALSE;182}183 184U0 MemberLstDel(CMemberLst *tmpm)185{186 CMemberLst *tmpm1;187 CMemberLstMeta *tmp_meta,*tmp_meta1;188 while (tmpm) {189 tmpm1=tmpm->next;190 Free(tmpm->str);191 LinkedLstDel(tmpm->dim.next);192 if (tmpm->flags & MLF_STR_DFT_AVAILABLE)193 Free(tmpm->dft_val);194 if (tmpm->flags & MLF_FUN)195 HashDel(tmpm->fun_ptr-tmpm->fun_ptr->ptr_stars_cnt);196 tmp_meta=tmpm->meta;197 while (tmp_meta) {198 tmp_meta1=tmp_meta->next;199 Free(tmp_meta->str);200 if (tmp_meta->flags&MLMF_IS_STR)201 Free(tmp_meta->user_data);202 Free(tmp_meta);203 tmp_meta=tmp_meta1;204 }205 Free(tmpm);206 tmpm=tmpm1;207 }208}209 210U0 ClassMemberLstDel(CHashClass *tmpc)211{212 MemberLstDel(tmpc->member_lst_and_root);213 tmpc->size=0;214 tmpc->last_in_member_lst=&tmpc->member_lst_and_root;215 tmpc->member_lst_and_root=NULL;216 tmpc->member_class_base_root=NULL;217 tmpc->member_cnt=0;218 if (tmpc->type&HTT_FUN)219 tmpc(CHashFun *)->arg_cnt=0;220}221 222I64 MemberLstSize(CHashClass *tmpc)223{224 CMemberLst *tmpm;225 CMemberLstMeta *tmp_meta;226 I64 res=0;227 tmpm=tmpc->member_lst_and_root;228 while (tmpm) {229 res+=MSize2(tmpm->str);230 res+=LinkedLstSize(tmpm->dim.next);231 if (tmpm->flags & MLF_STR_DFT_AVAILABLE)232 res+=MSize2(tmpm->dft_val);233 if (tmpm->flags & MLF_FUN)234 res+=HashEntrySize2(tmpm->fun_ptr-tmpm->fun_ptr->ptr_stars_cnt);235 tmp_meta=tmpm->meta;236 while (tmp_meta) {237 res+=MSize2(tmp_meta->str);238 if (tmp_meta->flags&MLMF_IS_STR)239 res+=MSize2(tmp_meta->user_data);240 res+=MSize2(tmp_meta);241 tmp_meta=tmp_meta->next;242 }243 res+=MSize2(tmpm);244 tmpm=tmpm->next;245 }246 return res;247}248 249U8 *LexExtStr(CCmpCtrl *cc,I64 *_size=NULL,Bool lex_next=TRUE)250{//Lex TK_STR's to one combined str. _size includes terminator.251 I64 len=cc->cur_str_len,len1,len2;252 U8 *st=cc->cur_str,*st1,*st2;253 cc->cur_str=NULL;254 while (cc->token==TK_STR) {255 st1=st;256 len1=len;257 if (!lex_next && LexGetChar(cc)!='\\') {258 cc->flags|=CCF_USE_LAST_U16;259 break;260 }261 if (Lex(cc)==TK_STR) {262 len2=cc->cur_str_len;263 st2=cc->cur_str;264 cc->cur_str=NULL;265 len=len1+len2-1;266 st=MAlloc(len);267 if (len1>1)268 MemCpy(st,st1,len1-1);269 MemCpy(st+len1-1,st2,len2);270 Free(st1);271 Free(st2);272 }273 }274 if (_size) *_size=len;275 return st;276}277 