mirror of
				https://github.com/subsurface/subsurface.git
				synced 2025-02-19 22:16:15 +00:00 
			
		
		
		
	Merge dive events correctly too
It's very similar to the sample merging. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
		
							parent
							
								
									3a77eb8510
								
							
						
					
					
						commit
						a6f6e8d6ff
					
				
					 1 changed files with 54 additions and 1 deletions
				
			
		
							
								
								
									
										55
									
								
								dive.c
									
										
									
									
									
								
							
							
						
						
									
										55
									
								
								dive.c
									
										
									
									
									
								
							|  | @ -319,6 +319,59 @@ static char *merge_text(const char *a, const char *b) | |||
| 	return res; | ||||
| } | ||||
| 
 | ||||
| #define SORT(a,b,field) \ | ||||
| 	if (a->field != b->field) return a->field < b->field ? -1 : 1 | ||||
| 
 | ||||
| static int sort_event(struct event *a, struct event *b) | ||||
| { | ||||
| 	SORT(a,b,time.seconds); | ||||
| 	SORT(a,b,type); | ||||
| 	SORT(a,b,flags); | ||||
| 	SORT(a,b,value); | ||||
| 	return strcmp(a->name, b->name); | ||||
| } | ||||
| 
 | ||||
| static void merge_events(struct dive *res, struct dive *src1, struct dive *src2, int offset) | ||||
| { | ||||
| 	struct event *a, *b; | ||||
| 	struct event **p = &res->events; | ||||
| 
 | ||||
| 	a = src1->events; | ||||
| 	b = src2->events; | ||||
| 	while (b) { | ||||
| 		b->time.seconds += offset; | ||||
| 		b = b->next; | ||||
| 	} | ||||
| 	b = src2->events; | ||||
| 
 | ||||
| 	while (a || b) { | ||||
| 		int s; | ||||
| 		if (!b) { | ||||
| 			*p = a; | ||||
| 			break; | ||||
| 		} | ||||
| 		if (!a) { | ||||
| 			*p = b; | ||||
| 			break; | ||||
| 		} | ||||
| 		s = sort_event(a, b); | ||||
| 		/* Pick b */ | ||||
| 		if (s > 0) { | ||||
| 			*p = b; | ||||
| 			p = &b->next; | ||||
| 			b = b->next; | ||||
| 			continue; | ||||
| 		} | ||||
| 		/* Pick 'a' or neither */ | ||||
| 		if (s < 0) { | ||||
| 			*p = a; | ||||
| 			p = &a->next; | ||||
| 		} | ||||
| 		a = a->next; | ||||
| 		continue; | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| /* Pick whichever has any info (if either). Prefer 'a' */ | ||||
| static void merge_cylinder_type(cylinder_type_t *res, cylinder_type_t *a, cylinder_type_t *b) | ||||
| { | ||||
|  | @ -371,6 +424,6 @@ struct dive *try_to_merge(struct dive *a, struct dive *b) | |||
| 	MERGE_MIN(res, a, b, watertemp.mkelvin); | ||||
| 	for (i = 0; i < MAX_CYLINDERS; i++) | ||||
| 		merge_cylinder_info(res->cylinder+i, a->cylinder + i, b->cylinder + i); | ||||
| 
 | ||||
| 	merge_events(res, a, b, 0); | ||||
| 	return merge_samples(res, a, b, 0); | ||||
| } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue