mirror of
				git://git.code.sf.net/p/zsh/code
				synced 2025-10-31 06:00:54 +01:00 
			
		
		
		
	22686: unset array if assigning numeric parameter
This commit is contained in:
		
							parent
							
								
									7b927aeac7
								
							
						
					
					
						commit
						b262d310b2
					
				
					 3 changed files with 43 additions and 41 deletions
				
			
		|  | @ -1,3 +1,8 @@ | |||
| 2006-09-11  Peter Stephenson  <pws@csr.com> | ||||
| 
 | ||||
| 	* 22686: Src/params.c: unset array if assigning numeric | ||||
| 	parameter to it. | ||||
| 
 | ||||
| 2006-09-10  Peter Stephenson  <p.w.stephenson@ntlworld.com> | ||||
| 
 | ||||
| 	* 22685: Src/builtin.c: printf "%d" \'X should handle multibyte | ||||
|  |  | |||
							
								
								
									
										73
									
								
								Src/params.c
									
										
									
									
									
								
							
							
						
						
									
										73
									
								
								Src/params.c
									
										
									
									
									
								
							|  | @ -2495,46 +2495,9 @@ sethparam(char *s, char **val) | |||
|     return v->pm; | ||||
| } | ||||
| 
 | ||||
| /**/ | ||||
| mod_export Param | ||||
| setiparam(char *s, zlong val) | ||||
| { | ||||
|     struct value vbuf; | ||||
|     Value v; | ||||
|     char *t = s, *ss; | ||||
|     Param pm; | ||||
|     mnumber mnval; | ||||
| 
 | ||||
|     if (!isident(s)) { | ||||
| 	zerr("not an identifier: %s", s); | ||||
| 	errflag = 1; | ||||
| 	return NULL; | ||||
|     } | ||||
|     queue_signals(); | ||||
|     if (!(v = getvalue(&vbuf, &s, 1))) { | ||||
| 	if ((ss = strchr(s, '['))) | ||||
| 	    *ss = '\0'; | ||||
| 	if (!(pm = createparam(t, ss ? PM_ARRAY : PM_INTEGER))) | ||||
| 	    pm = (Param) paramtab->getnode(paramtab, t); | ||||
| 	DPUTS(!pm, "BUG: parameter not created"); | ||||
| 	if (ss) { | ||||
| 	    *ss = '['; | ||||
| 	} else { | ||||
| 	    pm->base = outputradix; | ||||
| 	} | ||||
| 	v = getvalue(&vbuf, &t, 1); | ||||
| 	DPUTS(!v, "BUG: value not found for new parameter"); | ||||
|     } | ||||
|     mnval.type = MN_INTEGER; | ||||
|     mnval.u.l = val; | ||||
|     setnumvalue(v, mnval); | ||||
|     unqueue_signals(); | ||||
|     return v->pm; | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * Like setiparam(), but can take an mnumber which can be integer or | ||||
|  * floating. | ||||
|  * Set a generic shell number, floating point or integer. | ||||
|  */ | ||||
| 
 | ||||
| /**/ | ||||
|  | @ -2543,7 +2506,7 @@ setnparam(char *s, mnumber val) | |||
| { | ||||
|     struct value vbuf; | ||||
|     Value v; | ||||
|     char *t = s, *ss = NULL; | ||||
|     char *t = s, *ss; | ||||
|     Param pm; | ||||
| 
 | ||||
|     if (!isident(s)) { | ||||
|  | @ -2552,8 +2515,23 @@ setnparam(char *s, mnumber val) | |||
| 	return NULL; | ||||
|     } | ||||
|     queue_signals(); | ||||
|     if (!(v = getvalue(&vbuf, &s, 1))) { | ||||
| 	if ((ss = strchr(s, '['))) | ||||
|     ss = strchr(s, '['); | ||||
|     v = getvalue(&vbuf, &s, 1); | ||||
|     if (v && (v->pm->node.flags & (PM_ARRAY|PM_HASHED)) && | ||||
| 	!(v->pm->node.flags & (PM_SPECIAL|PM_TIED)) && | ||||
| 	/*
 | ||||
| 	 * not sure what KSHARRAYS has got to do with this... | ||||
| 	 * copied this from assignsparam(). | ||||
| 	 */ | ||||
| 	unset(KSHARRAYS) && !ss) { | ||||
| 	unsetparam_pm(v->pm, 0, 1); | ||||
| 	s = t; | ||||
| 	v = NULL; | ||||
|     } | ||||
|     if (!v) { | ||||
| 	/* s has been updated by getvalue, so check again */ | ||||
| 	ss = strchr(s, '['); | ||||
| 	if (ss) | ||||
| 	    *ss = '\0'; | ||||
| 	pm = createparam(t, ss ? PM_ARRAY : | ||||
| 			 (val.type & MN_INTEGER) ? PM_INTEGER : PM_FFLOAT); | ||||
|  | @ -2573,6 +2551,19 @@ setnparam(char *s, mnumber val) | |||
|     return v->pm; | ||||
| } | ||||
| 
 | ||||
| /* Simplified interface to setnparam */ | ||||
| 
 | ||||
| /**/ | ||||
| mod_export Param | ||||
| setiparam(char *s, zlong val) | ||||
| { | ||||
|     mnumber mnval; | ||||
|     mnval.type = MN_INTEGER; | ||||
|     mnval.u.l = val; | ||||
|     return setnparam(s, mnval); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /* Unset a parameter */ | ||||
| 
 | ||||
| /**/ | ||||
|  |  | |||
|  | @ -97,6 +97,12 @@ | |||
| 0:setting array elements in math context | ||||
| >array 1 2 | ||||
| 
 | ||||
|   xarr=() | ||||
|   (( xarr = 3 )) | ||||
|   print ${(t)xarr} $xarr | ||||
| 0:converting type from array | ||||
| >integer 3 | ||||
| 
 | ||||
|   print $(( 13 = 42 )) | ||||
| 1:bad lvalue | ||||
| ?(eval):1: lvalue required | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue