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(&macropp,macro_buf+MACROSIZE,pchptr); 4878 values = macro_args(&macropp,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