Mercurial > hg > CbC > old > device
comparison mc-parse.c @ 311:38c9976863b7 macro_concat
swtich list fix. macro fix.
author | kono |
---|---|
date | Sat, 12 Jun 2004 11:51:45 +0900 |
parents | 5ae5857ded2c |
children | a93e619cf772 |
comparison
equal
deleted
inserted
replaced
310:5ae5857ded2c | 311:38c9976863b7 |
---|---|
2019 int l,clist=0,c; | 2019 int l,clist=0,c; |
2020 l = fwdlabel(); | 2020 l = fwdlabel(); |
2021 while(sym==CASE) { | 2021 while(sym==CASE) { |
2022 conv->case_begin_(0,0); | 2022 conv->case_begin_(0,0); |
2023 getsym(0); | 2023 getsym(0); |
2024 // temorary put into a list | 2024 clist=glist3(cexpr(expr(1)),clist,l); |
2025 clist=list3(cexpr(expr(1)),clist,l); | |
2026 conv->case_(0,0); | 2025 conv->case_(0,0); |
2027 checksym(COLON); | 2026 checksym(COLON); |
2028 } | 2027 } |
2029 if (retpending) { ret(); retpending=0; } | 2028 if (retpending) { ret(); retpending=0; } |
2030 if (!cslabel) { | 2029 if (!cslabel) { |
3849 getch(); | 3848 getch(); |
3850 } | 3849 } |
3851 name[i++] = '\0'; | 3850 name[i++] = '\0'; |
3852 } | 3851 } |
3853 | 3852 |
3853 static int mconcat=0; | |
3854 | |
3854 static void | 3855 static void |
3855 macro_expansion(NMTBL *nptrm) | 3856 macro_expansion(NMTBL *nptrm) |
3856 { | 3857 { |
3857 int i = mode; | 3858 int i = mode; |
3858 int macrop = 0; | 3859 int macrop = 0; |
3867 } | 3868 } |
3868 macropp = macro_buf; | 3869 macropp = macro_buf; |
3869 mappend(reverse0(macrop)); | 3870 mappend(reverse0(macrop)); |
3870 macropp[-1] ='\n'; | 3871 macropp[-1] ='\n'; |
3871 *macropp =0; | 3872 *macropp =0; |
3873 while (mconcat) { | |
3874 // ## re-eval macro | |
3875 printf("## %s",macro_buf); | |
3876 mconcat = 0; | |
3877 macrop = 0; | |
3878 macropp = macro_buf; | |
3879 macrop=macro_eval(macrop,macro_buf,0); | |
3880 macropp = macro_buf; | |
3881 mappend(reverse0(macrop)); | |
3882 macropp[-1] ='\n'; | |
3883 *macropp =0; | |
3884 } | |
3885 mconcat = 0; | |
3872 lfree = slfree; | 3886 lfree = slfree; |
3873 if (lsrc && !asmf && nptrm->sc==FMACRO) gen_comment(macro_buf); | 3887 if (lsrc && !asmf && nptrm->sc==FMACRO) gen_comment(macro_buf); |
3874 macropp[-1] =0; | 3888 macropp[-1] =0; |
3875 if (macro_buf[0]==0) { | 3889 if (macro_buf[0]==0) { |
3876 mode = i; | 3890 mode = i; |
3877 return; | 3891 return; |
3878 } | 3892 } |
3879 chptrsave = glist2((int)chptr,chptrsave); | 3893 chptrsave = glist2((int)chptr,chptrsave); |
3880 chsave = glist2(chptr[-1],chsave); | 3894 chsave = glist2(ch,chsave); |
3881 chptr = macro_buf; | 3895 chptr = macro_buf; |
3882 ch = *chptr++; | 3896 ch = *chptr++; |
3883 mode = i; | 3897 mode = i; |
3884 } | 3898 } |
3885 | 3899 |
4766 error(STRERR); | 4780 error(STRERR); |
4767 // fprintf(stderr,"%s\n",(char *)car(nptr->dsp)); | 4781 // fprintf(stderr,"%s\n",(char *)car(nptr->dsp)); |
4768 mode=i; | 4782 mode=i; |
4769 } | 4783 } |
4770 | 4784 |
4785 // create function macro argument list | |
4786 // return list2((char*)arg,next) | |
4787 | |
4771 static int | 4788 static int |
4772 macro_args(char **pcheapp,char *maxcheap,char **pchptr) | 4789 macro_args(char **pcheapp,char *maxcheap,char **pchptr) |
4773 { | 4790 { |
4774 int c; | 4791 int c; |
4775 int in_quote = 0; | 4792 int in_quote = 0; |
4842 cheapp--; | 4859 cheapp--; |
4843 getline(); | 4860 getline(); |
4844 chptr = *pchptr; | 4861 chptr = *pchptr; |
4845 } | 4862 } |
4846 } | 4863 } |
4847 ch = *chptr; | |
4848 if (ch) chptr++; | |
4849 *pchptr = chptr; | 4864 *pchptr = chptr; |
4850 *pcheapp = cheapp; | 4865 *pcheapp = cheapp; |
4851 return reverse0(args); | 4866 return reverse0(args); |
4852 } | 4867 } |
4853 | 4868 |
4859 int args,sargs,values,evalues; | 4874 int args,sargs,values,evalues; |
4860 char *macro; | 4875 char *macro; |
4861 | 4876 |
4862 sargs = args = cadr(nptr->dsp); | 4877 sargs = args = cadr(nptr->dsp); |
4863 values = macro_args(¯opp,macro_buf+MACROSIZE,pchptr); | 4878 values = macro_args(¯opp,macro_buf+MACROSIZE,pchptr); |
4879 if (pchptr==&chptr) { | |
4880 ch = *chptr++; | |
4881 } | |
4864 evalues = 0; | 4882 evalues = 0; |
4865 while(values) { | 4883 while(values) { |
4866 evalues = list2(macro_eval(0,(char *)car(values),history),evalues); | 4884 evalues = list2(macro_eval(0,(char *)car(values),history),evalues); |
4867 values = cadr(values); | 4885 values = cadr(values); |
4868 } | 4886 } |
4916 int in_wquote = 0; | 4934 int in_wquote = 0; |
4917 char *macro; | 4935 char *macro; |
4918 char *body = body0; | 4936 char *body = body0; |
4919 int i; | 4937 int i; |
4920 NMTBL *nptrm; | 4938 NMTBL *nptrm; |
4921 c = 1; | |
4922 macrop = list2((int)macropp,macrop); | 4939 macrop = list2((int)macropp,macrop); |
4923 while(c && (*macropp++ = c = *body++)) { | 4940 for(; (c = *body++) ;) { |
4924 if (macropp>macro_buf+MACROSIZE) error(STRERR); | 4941 if (macropp+1>macro_buf+MACROSIZE) error(STRERR); |
4925 if (in_quote) { | 4942 if (in_quote) { |
4926 if (c=='\\') { | 4943 if (c=='\\') { |
4927 *macropp++ = c = *body++; | 4944 *macropp++ = c; c = *body++; |
4928 } else if (c=='\'') { | 4945 } else if (c=='\'') { |
4929 in_quote = 0; | 4946 in_quote = 0; |
4930 } | 4947 } |
4931 } else if (in_wquote) { | 4948 } else if (in_wquote) { |
4932 if (c=='\\') { | 4949 if (c=='\\') { |
4933 *macropp++ = c = *body++; | 4950 *macropp++ = c; c = *body++; |
4934 } else if (c=='"') { | 4951 } else if (c=='"') { |
4935 in_wquote = 0; | 4952 in_wquote = 0; |
4936 } | 4953 } |
4937 } else if (c=='"') { | 4954 } else if (c=='"') { |
4938 in_wquote = 1; | 4955 in_wquote = 1; |
4939 } else if (c=='\'') { | 4956 } else if (c=='\'') { |
4940 in_quote = 1; | 4957 in_quote = 1; |
4958 } else if (c=='#' && *body=='#') { | |
4959 // name concatenation. skip ## and re-eval macro line. | |
4960 mconcat = 1; body++; continue; | |
4941 } else if (alpha(c)) { | 4961 } else if (alpha(c)) { |
4942 macropp--; | 4962 i = 0; |
4943 for(i=0;alpha(c)||digit(c);i++) { namebuf[i] = c; c=*body++;} | 4963 do { namebuf[i++] = c; c=*body++;} while (alpha(c)||digit(c)); |
4964 body--; // ungetc | |
4944 namebuf[i]=0; | 4965 namebuf[i]=0; |
4945 nptrm = msearch0(namebuf); | 4966 nptrm = msearch0(namebuf); |
4946 macro = (char *)car(nptrm->dsp); | 4967 macro = (char *)car(nptrm->dsp); |
4947 if (nptrm->sc==LMACRO) { | 4968 if (nptrm->sc==LMACRO) { |
4948 while((*macropp++ = *macro++)); | 4969 while((*macropp++ = *macro++)); |
4949 macropp[-1]=c; | 4970 macropp--; |
4950 } else if (nptrm->sc==MACRO && neqname(namebuf,macro)) { | 4971 } else if (nptrm->sc==MACRO && neqname(namebuf,macro)) { |
4951 if (macro[0]==0) { | 4972 if (macro[0]==0) continue; |
4952 continue; | |
4953 } | |
4954 *macropp++=0; | 4973 *macropp++=0; |
4955 macrop=macro_eval(macrop,macro,list2((int)macro,history)); | 4974 macrop=macro_eval(macrop,macro,list2((int)macro,history)); |
4956 if (c) { | 4975 macrop = list2((int)macropp,macrop); |
4957 *macropp++=c; | |
4958 macrop = list2((int)macropp-1,macrop); | |
4959 } else { | |
4960 macrop = list2((int)macropp,macrop); | |
4961 } | |
4962 } else if (nptrm->sc==FMACRO) { | 4976 } else if (nptrm->sc==FMACRO) { |
4963 if(c!='(') error(MCERR); | 4977 if(c!='(') error(MCERR); |
4964 *macropp++=0; | 4978 *macropp++=0; body++; |
4965 macrop = macro_function(macrop,&body,nptrm, | 4979 macrop = macro_function(macrop,&body,nptrm, |
4966 list2((int)macro,history)); | 4980 list2((int)macro,history)); |
4967 if (ch) { /*?*/ | 4981 macrop = list2((int)macropp,macrop); |
4968 *macropp++=ch; | |
4969 macrop = list2((int)macropp-1,macrop); | |
4970 } else { | |
4971 macrop = list2((int)macropp,macrop); | |
4972 } | |
4973 } else { | 4982 } else { |
4974 macro = namebuf; | 4983 macro = namebuf; |
4975 while((*macropp++ = *macro++)); | 4984 while((*macropp++ = *macro++)); |
4976 macropp[-1]=c; | 4985 macropp--; |
4977 } | 4986 } |
4978 } | 4987 continue; |
4988 } | |
4989 *macropp++ = c; | |
4979 } | 4990 } |
4980 *macropp++=0; | 4991 *macropp++=0; |
4981 return macrop; | 4992 return macrop; |
4982 } | 4993 } |
4983 | 4994 |