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 *replace_buf, *start, *end; | ||||
| 
 | ||||
|         if (str == NULL) { | ||||
|                 return NULL; | ||||
|         } | ||||
| 
 | ||||
|         /* strip all tags */ | ||||
|         while ((start = strstr(str, "<")) != NULL) { | ||||
|                 end = strstr(start, ">"); | ||||
|                 if (end != NULL) { | ||||
|                         replace_buf = strndup(start, end - start + 1); | ||||
|                         str = string_replace(replace_buf, "", str); | ||||
|                         free(replace_buf); | ||||
|                 } else { | ||||
|                     break; | ||||
|                 } | ||||
|         } | ||||
|         string_strip_delimited(str, '<', '>'); | ||||
| 
 | ||||
|         /* unquote the remainder */ | ||||
|         str = string_replace_all(""", "\"", str); | ||||
|  | ||||
							
								
								
									
										15
									
								
								utils.c
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								utils.c
									
									
									
									
									
								
							| @ -105,6 +105,21 @@ char **string_to_argv(const char *s) | ||||
|         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) | ||||
| { | ||||
|         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); | ||||
| 
 | ||||
| /* strip content between two delimiter characters (inplace) */ | ||||
| void string_strip_delimited(char *str, char a, char b); | ||||
| 
 | ||||
| /* exit with an error message */ | ||||
| void die(char *msg, int exit_value); | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Yuri D'Elia
						Yuri D'Elia