@@ -626,6 +626,72 @@ takeset_string(char **str, tsk_size_t *len, char *new_str, const tsk_size_t new_
626
626
return 0 ;
627
627
}
628
628
629
+ static int
630
+ alloc_empty_ragged_column (tsk_size_t num_rows , void * * data_col , tsk_size_t * * offset_col )
631
+ {
632
+ int ret = 0 ;
633
+
634
+ * data_col = tsk_malloc (1 );
635
+ * offset_col = tsk_calloc (num_rows + 1 , sizeof (tsk_size_t ));
636
+ if (* data_col == NULL || * offset_col == NULL ) {
637
+ ret = TSK_ERR_NO_MEMORY ;
638
+ goto out ;
639
+ }
640
+ out :
641
+ return ret ;
642
+ }
643
+
644
+ static int
645
+ takeset_metadata_column (tsk_size_t num_rows , char * metadata , tsk_size_t * metadata_offset ,
646
+ char * * metadata_dest , tsk_size_t * * metadata_offset_dest )
647
+ {
648
+ int ret = 0 ;
649
+
650
+ if ((metadata == NULL ) != (metadata_offset == NULL )) {
651
+ ret = TSK_ERR_BAD_PARAM_VALUE ;
652
+ goto out ;
653
+ }
654
+ if (metadata == NULL ) {
655
+ ret = alloc_empty_ragged_column (
656
+ num_rows , (void * ) metadata_dest , metadata_offset_dest );
657
+ if (ret != 0 ) {
658
+ goto out ;
659
+ }
660
+ } else {
661
+ ret = check_offsets (num_rows , metadata_offset , 0 , false);
662
+ if (ret != 0 ) {
663
+ goto out ;
664
+ }
665
+ * metadata_dest = metadata ;
666
+ * metadata_offset_dest = metadata_offset ;
667
+ }
668
+ out :
669
+ return ret ;
670
+ }
671
+
672
+ static int
673
+ takeset_optional_id_column (tsk_size_t num_rows , tsk_id_t * input , tsk_id_t * * dest )
674
+ {
675
+ int ret = 0 ;
676
+ tsk_size_t buffsize ;
677
+ tsk_id_t * buff ;
678
+
679
+ if (input == NULL ) {
680
+ buffsize = num_rows * sizeof (* buff );
681
+ buff = tsk_malloc (buffsize );
682
+ if (buff == NULL ) {
683
+ ret = TSK_ERR_NO_MEMORY ;
684
+ goto out ;
685
+ }
686
+ * dest = buff ;
687
+ memset (buff , 0xff , buffsize );
688
+ } else {
689
+ * dest = input ;
690
+ }
691
+ out :
692
+ return ret ;
693
+ }
694
+
629
695
static int
630
696
write_metadata_schema_header (
631
697
FILE * out , const char * metadata_schema , tsk_size_t metadata_schema_length )
@@ -792,6 +858,33 @@ tsk_reference_sequence_takeset_metadata_schema(tsk_reference_sequence_t *self,
792
858
* individual table
793
859
*************************/
794
860
861
+ static void
862
+ tsk_individual_table_free_columns (tsk_individual_table_t * self )
863
+ {
864
+ tsk_safe_free (self -> flags );
865
+ self -> flags = NULL ;
866
+ tsk_safe_free (self -> location );
867
+ self -> location = NULL ;
868
+ tsk_safe_free (self -> location_offset );
869
+ self -> location_offset = NULL ;
870
+ tsk_safe_free (self -> parents );
871
+ self -> parents = NULL ;
872
+ tsk_safe_free (self -> parents_offset );
873
+ self -> parents_offset = NULL ;
874
+ tsk_safe_free (self -> metadata );
875
+ self -> metadata = NULL ;
876
+ tsk_safe_free (self -> metadata_offset );
877
+ self -> metadata_offset = NULL ;
878
+ }
879
+
880
+ int
881
+ tsk_individual_table_free (tsk_individual_table_t * self )
882
+ {
883
+ tsk_individual_table_free_columns (self );
884
+ tsk_safe_free (self -> metadata_schema );
885
+ return 0 ;
886
+ }
887
+
795
888
static int
796
889
tsk_individual_table_expand_main_columns (
797
890
tsk_individual_table_t * self , tsk_size_t additional_rows )
@@ -971,6 +1064,76 @@ tsk_individual_table_set_columns(tsk_individual_table_t *self, tsk_size_t num_ro
971
1064
return ret ;
972
1065
}
973
1066
1067
+ int TSK_WARN_UNUSED
1068
+ tsk_individual_table_takeset_columns (tsk_individual_table_t * self , tsk_size_t num_rows ,
1069
+ tsk_flags_t * flags , double * location , tsk_size_t * location_offset , tsk_id_t * parents ,
1070
+ tsk_size_t * parents_offset , char * metadata , tsk_size_t * metadata_offset )
1071
+ {
1072
+ int ret = 0 ;
1073
+
1074
+ tsk_individual_table_free_columns (self );
1075
+ self -> num_rows = num_rows ;
1076
+ self -> max_rows = num_rows ;
1077
+
1078
+ if (flags == NULL ) {
1079
+ /* Flags defaults to all zeros if not specified. The column is often
1080
+ * unused so this is a worthwhile optimisation. */
1081
+ self -> flags = tsk_calloc (num_rows , sizeof (* self -> flags ));
1082
+ if (self -> flags == NULL ) {
1083
+ ret = TSK_ERR_NO_MEMORY ;
1084
+ goto out ;
1085
+ }
1086
+ } else {
1087
+ self -> flags = flags ;
1088
+ }
1089
+
1090
+ if ((location == NULL ) != (location_offset == NULL )) {
1091
+ ret = TSK_ERR_BAD_PARAM_VALUE ;
1092
+ goto out ;
1093
+ }
1094
+ if (location == NULL ) {
1095
+ ret = alloc_empty_ragged_column (
1096
+ num_rows , (void * ) & self -> location , & self -> location_offset );
1097
+ if (ret != 0 ) {
1098
+ goto out ;
1099
+ }
1100
+ } else {
1101
+ ret = check_offsets (num_rows , location_offset , 0 , false);
1102
+ if (ret != 0 ) {
1103
+ goto out ;
1104
+ }
1105
+ self -> location = location ;
1106
+ self -> location_offset = location_offset ;
1107
+ }
1108
+
1109
+ if ((parents == NULL ) != (parents_offset == NULL )) {
1110
+ ret = TSK_ERR_BAD_PARAM_VALUE ;
1111
+ goto out ;
1112
+ }
1113
+ if (parents == NULL ) {
1114
+ ret = alloc_empty_ragged_column (
1115
+ num_rows , (void * ) & self -> parents , & self -> parents_offset );
1116
+ if (ret != 0 ) {
1117
+ goto out ;
1118
+ }
1119
+ } else {
1120
+ ret = check_offsets (num_rows , parents_offset , 0 , false);
1121
+ if (ret != 0 ) {
1122
+ goto out ;
1123
+ }
1124
+ self -> parents = parents ;
1125
+ self -> parents_offset = parents_offset ;
1126
+ }
1127
+
1128
+ ret = takeset_metadata_column (
1129
+ num_rows , metadata , metadata_offset , & self -> metadata , & self -> metadata_offset );
1130
+ if (ret != 0 ) {
1131
+ goto out ;
1132
+ }
1133
+ out :
1134
+ return ret ;
1135
+ }
1136
+
974
1137
int
975
1138
tsk_individual_table_append_columns (tsk_individual_table_t * self , tsk_size_t num_rows ,
976
1139
const tsk_flags_t * flags , const double * location , const tsk_size_t * location_offset ,
@@ -1276,20 +1439,6 @@ tsk_individual_table_extend(tsk_individual_table_t *self,
1276
1439
return ret ;
1277
1440
}
1278
1441
1279
- int
1280
- tsk_individual_table_free (tsk_individual_table_t * self )
1281
- {
1282
- tsk_safe_free (self -> flags );
1283
- tsk_safe_free (self -> location );
1284
- tsk_safe_free (self -> location_offset );
1285
- tsk_safe_free (self -> parents );
1286
- tsk_safe_free (self -> parents_offset );
1287
- tsk_safe_free (self -> metadata );
1288
- tsk_safe_free (self -> metadata_offset );
1289
- tsk_safe_free (self -> metadata_schema );
1290
- return 0 ;
1291
- }
1292
-
1293
1442
void
1294
1443
tsk_individual_table_print_state (const tsk_individual_table_t * self , FILE * out )
1295
1444
{
@@ -1558,6 +1707,25 @@ tsk_individual_table_load(tsk_individual_table_t *self, kastore_t *store)
1558
1707
* node table
1559
1708
*************************/
1560
1709
1710
+ static void
1711
+ tsk_node_table_free_columns (tsk_node_table_t * self )
1712
+ {
1713
+ tsk_safe_free (self -> flags );
1714
+ tsk_safe_free (self -> time );
1715
+ tsk_safe_free (self -> population );
1716
+ tsk_safe_free (self -> individual );
1717
+ tsk_safe_free (self -> metadata );
1718
+ tsk_safe_free (self -> metadata_offset );
1719
+ }
1720
+
1721
+ int
1722
+ tsk_node_table_free (tsk_node_table_t * self )
1723
+ {
1724
+ tsk_node_table_free_columns (self );
1725
+ tsk_safe_free (self -> metadata_schema );
1726
+ return 0 ;
1727
+ }
1728
+
1561
1729
static int
1562
1730
tsk_node_table_expand_main_columns (tsk_node_table_t * self , tsk_size_t additional_rows )
1563
1731
{
@@ -1671,6 +1839,38 @@ tsk_node_table_copy(
1671
1839
return ret ;
1672
1840
}
1673
1841
1842
+ int TSK_WARN_UNUSED
1843
+ tsk_node_table_takeset_columns (tsk_node_table_t * self , tsk_size_t num_rows ,
1844
+ tsk_flags_t * flags , double * time , tsk_id_t * population , tsk_id_t * individual ,
1845
+ char * metadata , tsk_size_t * metadata_offset )
1846
+ {
1847
+ int ret ;
1848
+
1849
+ tsk_node_table_free_columns (self );
1850
+
1851
+ /* Check the mandatory columns */
1852
+ if (flags == NULL || time == NULL ) {
1853
+ /* TODO TSK_ERR_MANDATORY_COLUMN_MISSING */
1854
+ ret = TSK_ERR_BAD_PARAM_VALUE ;
1855
+ goto out ;
1856
+ }
1857
+ ret = takeset_optional_id_column (num_rows , population , & self -> population );
1858
+ if (ret != 0 ) {
1859
+ goto out ;
1860
+ }
1861
+ ret = takeset_optional_id_column (num_rows , individual , & self -> individual );
1862
+ if (ret != 0 ) {
1863
+ goto out ;
1864
+ }
1865
+ ret = takeset_metadata_column (
1866
+ num_rows , metadata , metadata_offset , & self -> metadata , & self -> metadata_offset );
1867
+ if (ret != 0 ) {
1868
+ goto out ;
1869
+ }
1870
+ out :
1871
+ return ret ;
1872
+ }
1873
+
1674
1874
int TSK_WARN_UNUSED
1675
1875
tsk_node_table_set_columns (tsk_node_table_t * self , tsk_size_t num_rows ,
1676
1876
const tsk_flags_t * flags , const double * time , const tsk_id_t * population ,
@@ -1925,19 +2125,6 @@ tsk_node_table_extend(tsk_node_table_t *self, const tsk_node_table_t *other,
1925
2125
return ret ;
1926
2126
}
1927
2127
1928
- int
1929
- tsk_node_table_free (tsk_node_table_t * self )
1930
- {
1931
- tsk_safe_free (self -> flags );
1932
- tsk_safe_free (self -> time );
1933
- tsk_safe_free (self -> population );
1934
- tsk_safe_free (self -> individual );
1935
- tsk_safe_free (self -> metadata );
1936
- tsk_safe_free (self -> metadata_offset );
1937
- tsk_safe_free (self -> metadata_schema );
1938
- return 0 ;
1939
- }
1940
-
1941
2128
void
1942
2129
tsk_node_table_print_state (const tsk_node_table_t * self , FILE * out )
1943
2130
{
0 commit comments