CoolFace
Datasetpublic

hschumann2/TempleOS-Source-Code

sourceHugging Faceupdated 1y agoView on Hugging Face
0likes838downloads
LexLib.txt277 linesDownload Raw Back to Compiler
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