14887Schin /*********************************************************************** 24887Schin * * 34887Schin * This software is part of the ast package * 4*10898Sroland.mainz@nrubsig.org * Copyright (c) 1982-2009 AT&T Intellectual Property * 54887Schin * and is licensed under the * 64887Schin * Common Public License, Version 1.0 * 78462SApril.Chin@Sun.COM * by AT&T Intellectual Property * 84887Schin * * 94887Schin * A copy of the License is available at * 104887Schin * http://www.opensource.org/licenses/cpl1.0.txt * 114887Schin * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * 124887Schin * * 134887Schin * Information and Software Systems Research * 144887Schin * AT&T Research * 154887Schin * Florham Park NJ * 164887Schin * * 174887Schin * David Korn <dgk@research.att.com> * 184887Schin * * 194887Schin ***********************************************************************/ 204887Schin #pragma prototyped 214887Schin /* 224887Schin * break [n] 234887Schin * continue [n] 244887Schin * return [n] 254887Schin * exit [n] 264887Schin * 274887Schin * David Korn 284887Schin * AT&T Labs 294887Schin * dgk@research.att.com 304887Schin * 314887Schin */ 324887Schin 334887Schin #include "defs.h" 344887Schin #include <ast.h> 354887Schin #include <error.h> 364887Schin #include "shnodes.h" 374887Schin #include "builtins.h" 384887Schin 394887Schin /* 404887Schin * return and exit 414887Schin */ 424887Schin #if 0 434887Schin /* for the dictionary generator */ 444887Schin int b_exit(int n, register char *argv[],void *extra){} 454887Schin #endif 464887Schin int b_return(register int n, register char *argv[],void *extra) 474887Schin { 484887Schin register char *arg; 498462SApril.Chin@Sun.COM register Shell_t *shp = ((Shbltin_t*)extra)->shp; 504887Schin struct checkpt *pp = (struct checkpt*)shp->jmplist; 514887Schin const char *options = (**argv=='r'?sh_optreturn:sh_optexit); 524887Schin while((n = optget(argv,options))) switch(n) 534887Schin { 544887Schin case ':': 554887Schin if(!strmatch(argv[opt_info.index],"[+-]+([0-9])")) 564887Schin errormsg(SH_DICT,2, "%s", opt_info.arg); 574887Schin goto done; 584887Schin case '?': 594887Schin errormsg(SH_DICT,ERROR_usage(0), "%s", opt_info.arg); 604887Schin return(2); 614887Schin } 624887Schin done: 634887Schin if(error_info.errors) 644887Schin errormsg(SH_DICT,ERROR_usage(2),"%s",optusage((char*)0)); 654887Schin pp->mode = (**argv=='e'?SH_JMPEXIT:SH_JMPFUN); 664887Schin argv += opt_info.index; 67*10898Sroland.mainz@nrubsig.org n = (((arg= *argv)?(int)strtol(arg, (char**)0, 10)&SH_EXITMASK:shp->oldexit)); 684887Schin /* return outside of function, dotscript and profile is exit */ 694887Schin if(shp->fn_depth==0 && shp->dot_depth==0 && !sh_isstate(SH_PROFILE)) 704887Schin pp->mode = SH_JMPEXIT; 714887Schin sh_exit(shp->savexit=n); 724887Schin return(1); 734887Schin } 744887Schin 754887Schin 764887Schin /* 774887Schin * break and continue 784887Schin */ 794887Schin #if 0 804887Schin /* for the dictionary generator */ 814887Schin int b_continue(int n, register char *argv[],void *extra){} 824887Schin #endif 834887Schin int b_break(register int n, register char *argv[],void *extra) 844887Schin { 854887Schin char *arg; 864887Schin register int cont= **argv=='c'; 878462SApril.Chin@Sun.COM register Shell_t *shp = ((Shbltin_t*)extra)->shp; 884887Schin while((n = optget(argv,cont?sh_optcont:sh_optbreak))) switch(n) 894887Schin { 904887Schin case ':': 914887Schin errormsg(SH_DICT,2, "%s", opt_info.arg); 924887Schin break; 934887Schin case '?': 944887Schin errormsg(SH_DICT,ERROR_usage(0), "%s", opt_info.arg); 954887Schin return(2); 964887Schin } 974887Schin if(error_info.errors) 984887Schin errormsg(SH_DICT,ERROR_usage(2),"%s",optusage((char*)0)); 994887Schin argv += opt_info.index; 1004887Schin n=1; 1014887Schin if(arg= *argv) 1024887Schin { 1034887Schin n = strtol(arg,&arg,10); 1044887Schin if(n<=0 || *arg) 1054887Schin errormsg(SH_DICT,ERROR_exit(1),e_nolabels,*argv); 1064887Schin } 1074887Schin if(shp->st.loopcnt) 1084887Schin { 1094887Schin shp->st.execbrk = shp->st.breakcnt = n; 1104887Schin if(shp->st.breakcnt > shp->st.loopcnt) 1114887Schin shp->st.breakcnt = shp->st.loopcnt; 1124887Schin if(cont) 1134887Schin shp->st.breakcnt = -shp->st.breakcnt; 1144887Schin } 1154887Schin return(0); 1164887Schin } 1174887Schin 118