Avoid allocations by performing stripping in-place
Introduce a helper function (string_strip_delimited).
This commit is contained in:
		
							parent
							
								
									bed4877d7b
								
							
						
					
					
						commit
						4b53e44d92
					
				| @ -185,23 +185,12 @@ void notification_free(notification * n) | |||||||
|          */ |          */ | ||||||
| char *notification_strip_markup(char *str) | char *notification_strip_markup(char *str) | ||||||
| { | { | ||||||
|         char *replace_buf, *start, *end; |  | ||||||
| 
 |  | ||||||
|         if (str == NULL) { |         if (str == NULL) { | ||||||
|                 return NULL; |                 return NULL; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         /* strip all tags */ |         /* strip all tags */ | ||||||
|         while ((start = strstr(str, "<")) != NULL) { |         string_strip_delimited(str, '<', '>'); | ||||||
|                 end = strstr(start, ">"); |  | ||||||
|                 if (end != NULL) { |  | ||||||
|                         replace_buf = strndup(start, end - start + 1); |  | ||||||
|                         str = string_replace(replace_buf, "", str); |  | ||||||
|                         free(replace_buf); |  | ||||||
|                 } else { |  | ||||||
|                     break; |  | ||||||
|                 } |  | ||||||
|         } |  | ||||||
| 
 | 
 | ||||||
|         /* unquote the remainder */ |         /* unquote the remainder */ | ||||||
|         str = string_replace_all(""", "\"", str); |         str = string_replace_all(""", "\"", str); | ||||||
|  | |||||||
							
								
								
									
										15
									
								
								utils.c
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								utils.c
									
									
									
									
									
								
							| @ -105,6 +105,21 @@ char **string_to_argv(const char *s) | |||||||
|         return argv; |         return argv; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void string_strip_delimited(char *str, char a, char b) | ||||||
|  | { | ||||||
|  |         int iread=-1, iwrite=0, copen=0; | ||||||
|  |         while (str[++iread] != 0) { | ||||||
|  |                 if (str[iread] == a) { | ||||||
|  |                         ++copen; | ||||||
|  |                 } else if (str[iread] == b && copen > 0) { | ||||||
|  |                         --copen; | ||||||
|  |                 } else if (copen == 0) { | ||||||
|  |                         str[iwrite++] = str[iread]; | ||||||
|  |                 } | ||||||
|  |         } | ||||||
|  |         str[iwrite] = 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| int digit_count(int i) | int digit_count(int i) | ||||||
| { | { | ||||||
|         i = ABS(i); |         i = ABS(i); | ||||||
|  | |||||||
							
								
								
									
										3
									
								
								utils.h
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								utils.h
									
									
									
									
									
								
							| @ -17,6 +17,9 @@ char *string_append(char *a, const char *b, const char *sep); | |||||||
| 
 | 
 | ||||||
| char **string_to_argv(const char *s); | char **string_to_argv(const char *s); | ||||||
| 
 | 
 | ||||||
|  | /* strip content between two delimiter characters (inplace) */ | ||||||
|  | void string_strip_delimited(char *str, char a, char b); | ||||||
|  | 
 | ||||||
| /* exit with an error message */ | /* exit with an error message */ | ||||||
| void die(char *msg, int exit_value); | void die(char *msg, int exit_value); | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Yuri D'Elia
						Yuri D'Elia