excel_to_code 0.0.8 → 0.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/src/commands/excel_to_c.rb +4 -0
- data/src/compile/c/a.out +0 -0
- data/src/compile/c/excel_to_c_runtime.c +59 -14
- metadata +11 -11
- data/src/compile/c/excel_to_c_runtime.c.out +0 -0
data/src/commands/excel_to_c.rb
CHANGED
@@ -62,9 +62,13 @@ class ExcelToC < ExcelToX
|
|
62
62
|
o.puts
|
63
63
|
o.puts "// Used to decide whether to recalculate a cell"
|
64
64
|
o.puts "static int variable_set[#{number_of_refs}];"
|
65
|
+
o.puts ""
|
66
|
+
o.puts "// Used to reset all cached values and free up memory"
|
67
|
+
# FIXME: This feels like a bad place for this. Should be in runtime?
|
65
68
|
o.puts "void reset() {"
|
66
69
|
o.puts " int i;"
|
67
70
|
o.puts " cell_counter = 0;"
|
71
|
+
o.puts " free_all_allocated_memory(); "
|
68
72
|
o.puts " for(i = 0; i < #{number_of_refs}; i++) {"
|
69
73
|
o.puts " variable_set[i] = 0;"
|
70
74
|
o.puts " }"
|
data/src/compile/c/a.out
ADDED
Binary file
|
@@ -11,6 +11,7 @@
|
|
11
11
|
// Probably bad practice. At the very least, I should make it
|
12
12
|
// link to the cell reference in some way.
|
13
13
|
#define MAX_EXCEL_VALUE_HEAP_SIZE 1000000
|
14
|
+
#define MAX_MEMORY_TO_BE_FREED_HEAP_SIZE 100
|
14
15
|
|
15
16
|
#define true 1
|
16
17
|
#define false 0
|
@@ -74,11 +75,34 @@ static ExcelValue sumproduct(int number_of_arguments, ExcelValue *arguments);
|
|
74
75
|
static ExcelValue vlookup_3(ExcelValue lookup_value_v,ExcelValue lookup_table_v, ExcelValue column_number_v);
|
75
76
|
static ExcelValue vlookup(ExcelValue lookup_value_v,ExcelValue lookup_table_v, ExcelValue column_number_v, ExcelValue match_type_v);
|
76
77
|
|
77
|
-
// My little heap
|
78
|
+
// My little heap for excel values
|
78
79
|
ExcelValue cells[MAX_EXCEL_VALUE_HEAP_SIZE];
|
79
80
|
int cell_counter = 0;
|
80
81
|
|
81
|
-
#define HEAPCHECK if(cell_counter >= MAX_EXCEL_VALUE_HEAP_SIZE) { printf("
|
82
|
+
#define HEAPCHECK if(cell_counter >= MAX_EXCEL_VALUE_HEAP_SIZE) { printf("ExcelValue heap full. Edit MAX_EXCEL_VALUE_HEAP_SIZE in the c source code."); exit(-1); }
|
83
|
+
|
84
|
+
// My little heap for keeping pointers to memory that I need to reclaim
|
85
|
+
void *memory_that_needs_to_be_freed[MAX_MEMORY_TO_BE_FREED_HEAP_SIZE];
|
86
|
+
int memory_that_needs_to_be_freed_counter = 0;
|
87
|
+
|
88
|
+
#define MEMORY_THAT_NEEDS_TO_BE_FREED_HEAP_CHECK
|
89
|
+
|
90
|
+
static void free_later(void *pointer) {
|
91
|
+
memory_that_needs_to_be_freed[memory_that_needs_to_be_freed_counter] = pointer;
|
92
|
+
memory_that_needs_to_be_freed_counter++;
|
93
|
+
if(memory_that_needs_to_be_freed_counter >= MAX_MEMORY_TO_BE_FREED_HEAP_SIZE) {
|
94
|
+
printf("Memory that needs to be freed heap full. Edit MAX_MEMORY_TO_BE_FREED_HEAP_SIZE in the c source code");
|
95
|
+
exit(-1);
|
96
|
+
}
|
97
|
+
}
|
98
|
+
|
99
|
+
static void free_all_allocated_memory() {
|
100
|
+
int i;
|
101
|
+
for(i = 0; i < memory_that_needs_to_be_freed_counter; i++) {
|
102
|
+
free(memory_that_needs_to_be_freed[i]);
|
103
|
+
}
|
104
|
+
memory_that_needs_to_be_freed_counter = 0;
|
105
|
+
}
|
82
106
|
|
83
107
|
// The object initializers
|
84
108
|
static ExcelValue new_excel_number(double number) {
|
@@ -111,11 +135,12 @@ static ExcelValue new_excel_range(void *array, int rows, int columns) {
|
|
111
135
|
};
|
112
136
|
|
113
137
|
static void * new_excel_value_array(int size) {
|
114
|
-
ExcelValue *pointer = malloc(sizeof(ExcelValue)*size);
|
138
|
+
ExcelValue *pointer = malloc(sizeof(ExcelValue)*size); // Freed later
|
115
139
|
if(pointer == 0) {
|
116
140
|
printf("Out of memory\n");
|
117
141
|
exit(-1);
|
118
142
|
}
|
143
|
+
free_later(pointer);
|
119
144
|
return pointer;
|
120
145
|
};
|
121
146
|
|
@@ -134,7 +159,6 @@ const ExcelValue EIGHT = {.type = ExcelNumber, .number = 8};
|
|
134
159
|
const ExcelValue NINE = {.type = ExcelNumber, .number = 9};
|
135
160
|
const ExcelValue TEN = {.type = ExcelNumber, .number = 10};
|
136
161
|
|
137
|
-
|
138
162
|
// Booleans
|
139
163
|
const ExcelValue TRUE = {.type = ExcelBoolean, .number = true };
|
140
164
|
const ExcelValue FALSE = {.type = ExcelBoolean, .number = false };
|
@@ -688,17 +712,19 @@ static ExcelValue left(ExcelValue string_v, ExcelValue number_of_characters_v) {
|
|
688
712
|
int number_of_characters = (int) number_from(number_of_characters_v);
|
689
713
|
CHECK_FOR_CONVERSION_ERROR
|
690
714
|
|
691
|
-
char *string;
|
715
|
+
char *string;
|
716
|
+
int string_must_be_freed = 0;
|
692
717
|
switch (string_v.type) {
|
693
718
|
case ExcelString:
|
694
719
|
string = string_v.string;
|
695
720
|
break;
|
696
721
|
case ExcelNumber:
|
697
|
-
string = malloc(20);
|
722
|
+
string = malloc(20); // Freed
|
698
723
|
if(string == 0) {
|
699
724
|
printf("Out of memory");
|
700
725
|
exit(-1);
|
701
726
|
}
|
727
|
+
string_must_be_freed = 1;
|
702
728
|
snprintf(string,20,"%f",string_v.number);
|
703
729
|
break;
|
704
730
|
case ExcelBoolean:
|
@@ -714,13 +740,17 @@ static ExcelValue left(ExcelValue string_v, ExcelValue number_of_characters_v) {
|
|
714
740
|
return string_v;
|
715
741
|
}
|
716
742
|
|
717
|
-
char *left_string = malloc(number_of_characters+1);
|
743
|
+
char *left_string = malloc(number_of_characters+1); // Freed
|
718
744
|
if(left_string == 0) {
|
719
745
|
printf("Out of memory");
|
720
746
|
exit(-1);
|
721
|
-
}
|
747
|
+
}
|
748
|
+
free_later(left_string);
|
722
749
|
memcpy(left_string,string,number_of_characters);
|
723
750
|
left_string[number_of_characters] = '\0';
|
751
|
+
if(string_must_be_freed == 1) {
|
752
|
+
free(string);
|
753
|
+
}
|
724
754
|
return new_excel_string(left_string);
|
725
755
|
}
|
726
756
|
|
@@ -1033,27 +1063,31 @@ static ExcelValue roundup(ExcelValue number_v, ExcelValue decimal_places_v) {
|
|
1033
1063
|
static ExcelValue string_join(int number_of_arguments, ExcelValue *arguments) {
|
1034
1064
|
int allocated_length = 100;
|
1035
1065
|
int used_length = 0;
|
1036
|
-
char *string = malloc(allocated_length);
|
1066
|
+
char *string = malloc(allocated_length); // Freed later
|
1037
1067
|
if(string == 0) {
|
1038
1068
|
printf("Out of memory");
|
1039
1069
|
exit(-1);
|
1040
|
-
}
|
1070
|
+
}
|
1071
|
+
free_later(string);
|
1041
1072
|
char *current_string;
|
1042
1073
|
int current_string_length;
|
1074
|
+
int must_free_current_string;
|
1043
1075
|
ExcelValue current_v;
|
1044
1076
|
int i;
|
1045
1077
|
for(i=0;i<number_of_arguments;i++) {
|
1078
|
+
must_free_current_string = 0;
|
1046
1079
|
current_v = (ExcelValue) arguments[i];
|
1047
1080
|
switch (current_v.type) {
|
1048
1081
|
case ExcelString:
|
1049
1082
|
current_string = current_v.string;
|
1050
1083
|
break;
|
1051
1084
|
case ExcelNumber:
|
1052
|
-
current_string = malloc(20);
|
1085
|
+
current_string = malloc(20); // Freed
|
1053
1086
|
if(current_string == 0) {
|
1054
1087
|
printf("Out of memory");
|
1055
1088
|
exit(-1);
|
1056
|
-
}
|
1089
|
+
}
|
1090
|
+
must_free_current_string = 1;
|
1057
1091
|
snprintf(current_string,20,"%g",current_v.number);
|
1058
1092
|
break;
|
1059
1093
|
case ExcelBoolean:
|
@@ -1077,6 +1111,9 @@ static ExcelValue string_join(int number_of_arguments, ExcelValue *arguments) {
|
|
1077
1111
|
string = realloc(string,allocated_length);
|
1078
1112
|
}
|
1079
1113
|
memcpy(string + used_length, current_string, current_string_length);
|
1114
|
+
if(must_free_current_string == 1) {
|
1115
|
+
free(current_string);
|
1116
|
+
}
|
1080
1117
|
used_length = used_length + current_string_length;
|
1081
1118
|
}
|
1082
1119
|
string = realloc(string,used_length+1);
|
@@ -1152,7 +1189,7 @@ static ExcelValue sumifs(ExcelValue sum_range_v, int number_of_arguments, ExcelV
|
|
1152
1189
|
}
|
1153
1190
|
|
1154
1191
|
// Now go through and set up the criteria
|
1155
|
-
ExcelComparison *criteria = malloc(sizeof(ExcelComparison)*number_of_criteria);
|
1192
|
+
ExcelComparison *criteria = malloc(sizeof(ExcelComparison)*number_of_criteria); // freed at end of function
|
1156
1193
|
if(criteria == 0) {
|
1157
1194
|
printf("Out of memory\n");
|
1158
1195
|
exit(-1);
|
@@ -1328,6 +1365,8 @@ static ExcelValue sumifs(ExcelValue sum_range_v, int number_of_arguments, ExcelV
|
|
1328
1365
|
}
|
1329
1366
|
}
|
1330
1367
|
}
|
1368
|
+
// Tidy up
|
1369
|
+
free(criteria);
|
1331
1370
|
return new_excel_number(total);
|
1332
1371
|
}
|
1333
1372
|
|
@@ -1350,7 +1389,7 @@ static ExcelValue sumproduct(int number_of_arguments, ExcelValue *arguments) {
|
|
1350
1389
|
int rows;
|
1351
1390
|
int columns;
|
1352
1391
|
ExcelValue current_value;
|
1353
|
-
ExcelValue **ranges = malloc(sizeof(ExcelValue *)*number_of_arguments);
|
1392
|
+
ExcelValue **ranges = malloc(sizeof(ExcelValue *)*number_of_arguments); // Added free statements
|
1354
1393
|
if(ranges == 0) {
|
1355
1394
|
printf("Out of memory\n");
|
1356
1395
|
exit(-1);
|
@@ -1375,9 +1414,11 @@ static ExcelValue sumproduct(int number_of_arguments, ExcelValue *arguments) {
|
|
1375
1414
|
ranges[a] = current_value.array;
|
1376
1415
|
break;
|
1377
1416
|
case ExcelError:
|
1417
|
+
free(ranges);
|
1378
1418
|
return current_value;
|
1379
1419
|
break;
|
1380
1420
|
case ExcelEmpty:
|
1421
|
+
free(ranges);
|
1381
1422
|
return VALUE;
|
1382
1423
|
break;
|
1383
1424
|
default:
|
@@ -1402,6 +1443,7 @@ static ExcelValue sumproduct(int number_of_arguments, ExcelValue *arguments) {
|
|
1402
1443
|
sum += product;
|
1403
1444
|
}
|
1404
1445
|
}
|
1446
|
+
free(ranges);
|
1405
1447
|
return new_excel_number(sum);
|
1406
1448
|
}
|
1407
1449
|
|
@@ -2027,6 +2069,9 @@ int test_functions() {
|
|
2027
2069
|
ExcelValue sum_array_1[] = {sum_array_0_v};
|
2028
2070
|
assert(sum(1,sum_array_1).number == 1253.8718091935484);
|
2029
2071
|
|
2072
|
+
// Release memory
|
2073
|
+
free_all_allocated_memory();
|
2074
|
+
|
2030
2075
|
return 0;
|
2031
2076
|
}
|
2032
2077
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: excel_to_code
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.9
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-06-
|
12
|
+
date: 2012-06-08 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rubypeg
|
16
|
-
requirement: &
|
16
|
+
requirement: &70366938770280 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70366938770280
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: nokogiri
|
27
|
-
requirement: &
|
27
|
+
requirement: &70366938769760 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: 1.5.0
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70366938769760
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: rspec
|
38
|
-
requirement: &
|
38
|
+
requirement: &70366938769220 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: 2.7.0
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70366938769220
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: ffi
|
49
|
-
requirement: &
|
49
|
+
requirement: &70366938768740 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,7 +54,7 @@ dependencies:
|
|
54
54
|
version: 1.0.11
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70366938768740
|
58
58
|
description: ! "# excel_to_code\n\nConverts some excel spreadsheets (.xlsx, not .xls)
|
59
59
|
into some other programming languages (currently ruby or c).\nThis allows the excel
|
60
60
|
spreadsheets to be run programatically, without excel.\n\nIts cannonical source
|
@@ -84,11 +84,11 @@ files:
|
|
84
84
|
- src/commands/excel_to_ruby.rb
|
85
85
|
- src/commands/excel_to_x.rb
|
86
86
|
- src/commands.rb
|
87
|
+
- src/compile/c/a.out
|
87
88
|
- src/compile/c/compile_to_c.rb
|
88
89
|
- src/compile/c/compile_to_c_header.rb
|
89
90
|
- src/compile/c/compile_to_c_unit_test.rb
|
90
91
|
- src/compile/c/excel_to_c_runtime.c
|
91
|
-
- src/compile/c/excel_to_c_runtime.c.out
|
92
92
|
- src/compile/c/map_formulae_to_c.rb
|
93
93
|
- src/compile/c/map_sheet_names_to_c_names.rb
|
94
94
|
- src/compile/c/map_values_to_c.rb
|
Binary file
|