Skip to content

Commit 02e2764

Browse files
Kyrylocyrillicw
authored andcommitted
Use goto in c wrapper example
1 parent 046739d commit 02e2764

File tree

1 file changed

+122
-103
lines changed

1 file changed

+122
-103
lines changed

examples/c/main.c

Lines changed: 122 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ const char *error_message(scanbotsdk_error_code_t ec) {
1010
return scanbotsdk_error_message();
1111
}
1212

13-
1413
struct frame {
1514
int width;
1615
int height;
@@ -29,22 +28,22 @@ frame *next_frame(mock_camera *camera) {
2928
return &camera->mock_frame;
3029
}
3130

32-
mock_camera *init_camera(const char *path) {
31+
scanbotsdk_error_code_t init_camera(const char *path, mock_camera **camera_out) {
3332
scanbotsdk_image_t *image = NULL;
3433
scanbotsdk_path_image_load_options_t *load_options = NULL;
3534
scanbotsdk_path_image_load_options_create_with_defaults(&load_options);
3635
scanbotsdk_error_code_t ec = scanbotsdk_image_create_from_path(path, load_options, &image);
3736
scanbotsdk_path_image_load_options_free(load_options);
3837
if (ec != SCANBOTSDK_OK) {
3938
fprintf(stderr, "Failed to create image from path: %d: %s\n", ec, error_message(ec));
40-
return NULL;
39+
return ec;
4140
}
4241
scanbotsdk_raw_image_t *raw_image = NULL;
4342
ec = scanbotsdk_image_to_raw_image(image, &raw_image);
4443
scanbotsdk_image_free(image);
4544
if (ec != SCANBOTSDK_OK) {
4645
fprintf(stderr, "Failed to obtain raw image: %d: %s\n", ec, error_message(ec));
47-
return NULL;
46+
return ec;
4847
}
4948
frame f;
5049

@@ -63,7 +62,8 @@ mock_camera *init_camera(const char *path) {
6362
scanbotsdk_raw_image_free(raw_image);
6463
mock_camera *camera = malloc(sizeof(mock_camera));
6564
camera->mock_frame = f;
66-
return camera;
65+
*camera_out = camera;
66+
return SCANBOTSDK_OK;
6767
}
6868

6969
void free_camera(mock_camera *camera) {
@@ -74,37 +74,64 @@ void free_camera(mock_camera *camera) {
7474
free(camera);
7575
}
7676

77-
int main(int argc, char *argv[]) {
78-
if (argc < 3) {
79-
fprintf(stderr, "Usage: %s <license_key> <path_to_camera_mock_image>\n", argv[0]);
80-
return 1;
81-
}
77+
scanbotsdk_error_code_t process_frame(scanbotsdk_barcode_scanner_t *scanner, frame *frame, size_t frame_number) {
78+
scanbotsdk_error_code_t ec = SCANBOTSDK_OK;
79+
scanbotsdk_raw_image_load_options_t *image_load_options = NULL;
80+
scanbotsdk_image_t *image = NULL;
81+
scanbotsdk_barcode_scanner_result_t *result = NULL;
8282

83-
const char *license_key = argv[1];
84-
const char *mock_frame_path = argv[2];
83+
// region create scanbotsdk_image_t from frame
84+
bool image_is_live = true;
85+
scanbotsdk_raw_image_load_options_create_with_defaults(image_is_live, &image_load_options);
8586

86-
// region Initialize Scanbot SDK
87-
scanbotsdk_init_params_t params;
88-
params.license_key = license_key;
89-
params.writeable_path = ".";
87+
ec = scanbotsdk_image_create_from_raw_image(
88+
frame->data, frame->width, frame->height, frame->channels, frame->stride, image_load_options, &image);
89+
if (ec != SCANBOTSDK_OK) {
90+
goto exit;
91+
}
92+
// endregion
93+
94+
// region run barcode scanner on the image
95+
ec = scanbotsdk_barcode_scanner_run(scanner, image, &result);
9096

91-
scanbotsdk_error_code_t ec;
92-
ec = scanbotsdk_initialize(&params);
9397
if (ec != SCANBOTSDK_OK) {
94-
fprintf(stderr, "Failed to initialize Scanbot SDK: %d: %s\n", ec, error_message(ec));
95-
return 1;
98+
goto exit;
99+
}
100+
bool success = false;
101+
scanbotsdk_barcode_scanner_result_get_success(result, &success);
102+
if (!success) {
103+
fprintf(stdout, "No barcodes found in frame %zu\n", frame_number);
104+
} else {
105+
size_t barcodeCount = 0;
106+
scanbotsdk_barcode_scanner_result_get_barcodes_size(result, &barcodeCount);
107+
fprintf(stdout, "%zu barcodes found in frame %zu\n", barcodeCount, frame_number);
108+
scanbotsdk_barcode_item_t **barcodes = malloc(barcodeCount * sizeof(scanbotsdk_barcode_item_t *));
109+
scanbotsdk_barcode_scanner_result_get_barcodes(result, barcodes, barcodeCount);
110+
for (size_t i = 0; i < barcodeCount; i++) {
111+
const char *text = NULL;
112+
scanbotsdk_barcode_item_get_text(barcodes[i], &text);
113+
fprintf(stdout, "Barcode %zu: %s\n", i, text);
114+
}
115+
free(barcodes);
96116
}
97117
// endregion
98118

99-
// region Create Barcode Scanner Configuration
119+
exit:
120+
scanbotsdk_raw_image_load_options_free(image_load_options);
121+
scanbotsdk_image_free(image);
122+
scanbotsdk_barcode_scanner_result_free(result);
123+
return ec;
124+
}
125+
126+
scanbotsdk_error_code_t create_barcode_scanner(scanbotsdk_barcode_scanner_t **barcode_scanner) {
127+
scanbotsdk_error_code_t ec = SCANBOTSDK_OK;
128+
100129
scanbotsdk_barcode_format_common_configuration_t *common_format_configuration = NULL;
101-
ec = scanbotsdk_barcode_format_common_configuration_create_with_defaults(
130+
scanbotsdk_barcode_scanner_configuration_t *barcode_scanner_configuration = NULL;
131+
132+
// region create barcode scanner configuration
133+
scanbotsdk_barcode_format_common_configuration_create_with_defaults(
102134
&common_format_configuration);
103-
if (ec != SCANBOTSDK_OK) {
104-
fprintf(stderr, "Failed to create common format configuration: %d: %s\n", ec,
105-
error_message(ec));
106-
return 1;
107-
}
108135
scanbotsdk_barcode_format_t common_formats[] = {
109136
SCANBOTSDK_BARCODE_FORMAT_AZTEC,
110137
SCANBOTSDK_BARCODE_FORMAT_CODABAR,
@@ -126,112 +153,104 @@ int main(int argc, char *argv[]) {
126153
ec = scanbotsdk_barcode_format_common_configuration_set_formats(common_format_configuration, common_formats,
127154
sizeof(common_formats) / sizeof(common_formats[0]));
128155
if (ec != SCANBOTSDK_OK) {
129-
scanbotsdk_barcode_format_common_configuration_free(common_format_configuration);
130-
fprintf(stderr, "Failed to set formats in common format configuration: %d: %s\n", ec,
131-
error_message(ec));
132-
return 1;
156+
goto exit;
133157
}
134158

135159
scanbotsdk_barcode_format_configuration_base_t *common_format_configuration_as_base = NULL;
136160
scanbotsdk_barcode_format_common_configuration_as_scanbotsdk_barcode_format_configuration_base(
137161
common_format_configuration, &common_format_configuration_as_base);
138162

139-
scanbotsdk_barcode_scanner_configuration_t *barcode_scanner_configuration;
140-
ec = scanbotsdk_barcode_scanner_configuration_create_with_defaults(
141-
&barcode_scanner_configuration);
142163

143-
if (ec != SCANBOTSDK_OK) {
144-
scanbotsdk_barcode_format_configuration_base_free(common_format_configuration_as_base);
145-
fprintf(stderr, "Failed to create barcode scanner configuration: %d: %s\n", ec,
146-
error_message(ec));
147-
return 1;
148-
}
164+
scanbotsdk_barcode_scanner_configuration_create_with_defaults(
165+
&barcode_scanner_configuration);
149166
ec = scanbotsdk_barcode_scanner_configuration_set_barcode_format_configurations(
150167
barcode_scanner_configuration, &common_format_configuration_as_base, 1);
151-
scanbotsdk_barcode_format_configuration_base_free(common_format_configuration_as_base);
152168
if (ec != SCANBOTSDK_OK) {
153-
scanbotsdk_barcode_scanner_configuration_free(barcode_scanner_configuration);
154-
fprintf(stderr, "Failed to set barcode format configurations: %d: %s\n", ec,
155-
error_message(ec));
156-
return 1;
169+
goto exit;
157170
}
158171
// endregion
159172

160-
// region Create Barcode Scanner
161-
scanbotsdk_barcode_scanner_t *barcode_scanner = NULL;
162-
ec = scanbotsdk_barcode_scanner_create(barcode_scanner_configuration, &barcode_scanner);
173+
// region create barcode scanner
174+
ec = scanbotsdk_barcode_scanner_create(barcode_scanner_configuration, barcode_scanner);
175+
if (ec != SCANBOTSDK_OK) {
176+
goto exit;
177+
}
178+
// endregion
179+
180+
exit:
181+
scanbotsdk_barcode_format_common_configuration_free(common_format_configuration);
163182
scanbotsdk_barcode_scanner_configuration_free(barcode_scanner_configuration);
183+
return ec;
184+
}
185+
186+
int main(int argc, char *argv[]) {
187+
if (argc < 3) {
188+
fprintf(stderr, "Usage: %s <license_key> <path_to_camera_mock_image>\n", argv[0]);
189+
return 1;
190+
}
191+
192+
const int initialization_timeout_ms = 15000;
193+
const int deregister_device_timeout_ms = 15000;
194+
195+
scanbotsdk_barcode_scanner_t *barcode_scanner = NULL;
196+
mock_camera *camera = NULL;
197+
198+
const char *license_key = argv[1];
199+
const char *mock_frame_path = argv[2];
200+
201+
// region initialize Scanbot SDK
202+
scanbotsdk_init_params_t params;
203+
params.license_key = license_key;
204+
params.writeable_path = ".";
205+
206+
scanbotsdk_error_code_t ec;
207+
ec = scanbotsdk_initialize(&params);
208+
if (ec != SCANBOTSDK_OK) {
209+
fprintf(stderr, "Failed to initialize Scanbot SDK: %d: %s\n", ec, error_message(ec));
210+
goto exit;
211+
}
212+
ec = scanbotsdk_wait_for_online_license_check_completion(initialization_timeout_ms);
164213
if (ec != SCANBOTSDK_OK) {
165-
fprintf(stderr, "Failed to create barcode scanner: %d: %s\n", ec,
214+
fprintf(stderr, "Failed to wait for online license check completion: %d: %s\n", ec,
166215
error_message(ec));
167-
return 1;
216+
goto exit;
168217
}
169218
// endregion
170219

220+
ec = create_barcode_scanner(&barcode_scanner);
221+
if (ec != SCANBOTSDK_OK) {
222+
fprintf(stderr, "Failed to create barcode scanner: %d: %s\n", ec, error_message(ec));
223+
goto exit;
224+
}
225+
171226
// region create mock camera that always returns the same frame
172-
mock_camera *camera = init_camera(mock_frame_path);
173-
if (!camera) {
174-
scanbotsdk_barcode_scanner_free(barcode_scanner);
175-
fprintf(stderr, "Failed to initialize mock camera with path: %s\n", mock_frame_path);
176-
return 1;
227+
ec = init_camera(mock_frame_path, &camera);
228+
if (ec != SCANBOTSDK_OK) {
229+
fprintf(stderr, "Failed to initialize mock camera with image: %s\n", mock_frame_path);
230+
goto exit;
177231
}
178232
// endregion
179233

180-
for (size_t frameNumber = 0; frameNumber < 10; frameNumber++) {
181-
fprintf(stdout, "Processing frame %zu\n", frameNumber);
234+
// region frame processing loop
235+
for (size_t frame_number = 0; frame_number < 10; frame_number++) {
236+
fprintf(stdout, "Processing frame %zu\n", frame_number);
182237

183-
// region create scanbotsdk_image_t from mock camera frame
184238
frame *frame = next_frame(camera);
185-
bool imageIsLive = true;
186-
scanbotsdk_raw_image_load_options_t *load_options = NULL;
187-
scanbotsdk_raw_image_load_options_create_with_defaults(imageIsLive, &load_options);
188-
scanbotsdk_image_t *image = NULL;
189-
ec = scanbotsdk_image_create_from_raw_image(
190-
frame->data, frame->width, frame->height, frame->channels, frame->stride, load_options, &image);
191-
scanbotsdk_raw_image_load_options_free(load_options);
192-
if (ec != SCANBOTSDK_OK) {
193-
scanbotsdk_barcode_scanner_free(barcode_scanner);
194-
free_camera(camera);
195-
fprintf(stderr, "Failed to create image from raw data: %d: %s\n", ec,
196-
error_message(ec));
197-
return 1;
198-
}
199-
// endregion
200-
201-
// region run barcode scanner on the image
202-
scanbotsdk_barcode_scanner_result_t *result = NULL;
203-
ec = scanbotsdk_barcode_scanner_run(barcode_scanner, image, &result);
204-
scanbotsdk_image_free(image);
239+
ec = process_frame(barcode_scanner, frame, frame_number);
205240
if (ec != SCANBOTSDK_OK) {
206-
scanbotsdk_barcode_scanner_free(barcode_scanner);
207-
free_camera(camera);
208-
fprintf(stderr, "Failed to run barcode scanner: %d: %s\n", ec,
209-
error_message(ec));
210-
return 1;
211-
}
212-
bool success = false;
213-
scanbotsdk_barcode_scanner_result_get_success(result, &success);
214-
if (!success) {
215-
fprintf(stdout, "No barcodes found in frame %zu\n", frameNumber);
216-
} else {
217-
size_t barcodeCount = 0;
218-
scanbotsdk_barcode_scanner_result_get_barcodes_size(result, &barcodeCount);
219-
fprintf(stdout, "%zu barcodes found in frame %zu\n", barcodeCount, frameNumber);
220-
scanbotsdk_barcode_item_t **barcodes = malloc(barcodeCount * sizeof(scanbotsdk_barcode_item_t *));
221-
scanbotsdk_barcode_scanner_result_get_barcodes(result, barcodes, barcodeCount);
222-
for (size_t i = 0; i < barcodeCount; i++) {
223-
const char *text = NULL;
224-
scanbotsdk_barcode_item_get_text(barcodes[i], &text);
225-
fprintf(stdout, "Barcode %zu: %s\n", i, text);
226-
}
227-
free(barcodes);
241+
fprintf(stderr, "Failed to process frame %zu: %d: %s\n", frame_number, ec, error_message(ec));
242+
goto exit;
228243
}
229-
scanbotsdk_barcode_scanner_result_free(result);
230-
// endregion
231244
}
245+
// endregion
246+
247+
exit:
232248
scanbotsdk_barcode_scanner_free(barcode_scanner);
233249
free_camera(camera);
250+
// If you are not using floating license, it is not necessary to call device deregistration.
251+
scanbotsdk_deregister_device();
252+
scanbotsdk_wait_for_device_deregistration_completion(deregister_device_timeout_ms);
234253

235-
return 0;
254+
return (ec == SCANBOTSDK_OK) ? 0 : 1;
236255
}
237256

0 commit comments

Comments
 (0)