mirror of
				git://git.code.sf.net/p/zsh/code
				synced 2025-10-31 06:00:54 +01:00 
			
		
		
		
	39886 based on 39877: Optimise arrdup to arrdup_max.
Only duplicate as much of the array as is needed.
This commit is contained in:
		
							parent
							
								
									49407686b4
								
							
						
					
					
						commit
						a1633e09a7
					
				
					 3 changed files with 45 additions and 7 deletions
				
			
		|  | @ -1,5 +1,8 @@ | |||
| 2016-11-09  Peter Stephenson  <p.stephenson@samsung.com> | ||||
| 
 | ||||
| 	* 39886 based on 39877 (Sebastian): Src/params.c, Src/utils.c: | ||||
| 	add arrdup_max() so as not to duplicate entire arrays unnecessarily. | ||||
| 
 | ||||
| 	* Sebastian: 39875: Src/params.c, Src/string.c: add | ||||
| 	dupstring_glen() to avoid redundant strlen() calls. | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										24
									
								
								Src/params.c
									
										
									
									
									
								
							
							
						
						
									
										24
									
								
								Src/params.c
									
										
									
									
									
								
							|  | @ -2294,14 +2294,24 @@ getarrvalue(Value v) | |||
| 	v->start += arrlen(s); | ||||
|     if (v->end < 0) | ||||
| 	v->end += arrlen(s) + 1; | ||||
|     if (arrlen_lt(s, v->start) || v->start < 0) | ||||
| 
 | ||||
|     /* Null if 1) array too short, 2) index still negative */ | ||||
|     if (arrlen_lt(s, v->start) || v->start < 0) { | ||||
| 	s = arrdup(nular); | ||||
|     else | ||||
| 	s = arrdup(s + v->start); | ||||
|     if (v->end <= v->start) | ||||
| 	s[0] = NULL; | ||||
|     else if (arrlen_ge(s, v->end - v->start)) | ||||
| 	s[v->end - v->start] = NULL; | ||||
|     } else if (v->end <= v->start) { | ||||
|         s = arrdup_max(s, 1); | ||||
|         s[0] = NULL; | ||||
|     } else { | ||||
|         /* Copy to a point before the end of the source array:
 | ||||
|          * arrdup_max will copy at most v->end - v->start elements, | ||||
|          * starting from v->start element. Original code said: | ||||
| 	 *  s[v->end - v->start] = NULL | ||||
|          * which means that there are exactly the same number of | ||||
|          * elements as the value of the above *0-based* index. | ||||
|          */ | ||||
| 	s = arrdup_max(s + v->start, v->end - v->start); | ||||
|     } | ||||
| 
 | ||||
|     return s; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										25
									
								
								Src/utils.c
									
										
									
									
									
								
							
							
						
						
									
										25
									
								
								Src/utils.c
									
										
									
									
									
								
							|  | @ -4229,6 +4229,31 @@ arrdup(char **s) | |||
|     return y; | ||||
| } | ||||
| 
 | ||||
| /* Duplicate at most max elements of the array s with heap memory */ | ||||
| 
 | ||||
| /**/ | ||||
| mod_export char ** | ||||
| arrdup_max(char **s, unsigned max) | ||||
| { | ||||
|     char **x, **y, **send; | ||||
|     int len; | ||||
| 
 | ||||
|     len = arrlen(s); | ||||
| 
 | ||||
|     /* Limit has sense only if not equal to len */ | ||||
|     if (max > len) | ||||
|         max = len; | ||||
| 
 | ||||
|     y = x = (char **) zhalloc(sizeof(char *) * (max + 1)); | ||||
| 
 | ||||
|     send = s + max; | ||||
|     while (s < send) | ||||
| 	*x++ = dupstring(*s++); | ||||
|     *x = NULL; | ||||
| 
 | ||||
|     return y; | ||||
| } | ||||
| 
 | ||||
| /**/ | ||||
| mod_export char ** | ||||
| zarrdup(char **s) | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue