Skip to content

Commit 329352a

Browse files
committed
tests: put common/replicated functions into a single file
The scan function was copied/pasted in each utility, this moves it to a a seperate c file, which is built as a library, which then every utility statically links to, saving maintainance, and build time. Signed-off-by: Robin Getz <[email protected]>
1 parent 2d7fad4 commit 329352a

File tree

10 files changed

+203
-392
lines changed

10 files changed

+203
-392
lines changed

tests/CMakeLists.txt

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,20 +26,22 @@ endif()
2626
if (CMAKE_COMPILER_IS_GNUCC)
2727
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DIIO_CHECK_RET")
2828
endif()
29+
add_library(iio_tests_helper STATIC iio_common.c gen_code.c)
30+
target_link_libraries(iio_tests_helper iio)
2931

3032
add_executable(iio_genxml iio_genxml.c ${GETOPT_C_FILE} ${LIBIIO_RC})
3133
add_executable(iio_info iio_info.c ${GETOPT_C_FILE} ${LIBIIO_RC})
32-
add_executable(iio_attr iio_attr.c gen_code.c ${GETOPT_C_FILE} ${LIBIIO_RC})
34+
add_executable(iio_attr iio_attr.c ${GETOPT_C_FILE} ${LIBIIO_RC})
3335
add_executable(iio_readdev iio_readdev.c ${GETOPT_C_FILE} ${LIBIIO_RC})
3436
add_executable(iio_reg iio_reg.c ${GETOPT_C_FILE} ${LIBIIO_RC})
3537
add_executable(iio_writedev iio_writedev.c ${GETOPT_C_FILE} ${LIBIIO_RC})
3638

3739
target_link_libraries(iio_genxml iio)
38-
target_link_libraries(iio_info iio)
39-
target_link_libraries(iio_attr iio)
40-
target_link_libraries(iio_readdev iio)
40+
target_link_libraries(iio_info iio iio_tests_helper)
41+
target_link_libraries(iio_attr iio iio_tests_helper)
42+
target_link_libraries(iio_readdev iio iio_tests_helper)
4143
target_link_libraries(iio_reg iio)
42-
target_link_libraries(iio_writedev iio)
44+
target_link_libraries(iio_writedev iio iio_tests_helper)
4345

4446
set(IIO_TESTS_TARGETS iio_genxml iio_info iio_attr iio_readdev iio_reg iio_writedev)
4547

@@ -48,7 +50,7 @@ if(PTHREAD_LIBRARIES)
4850
project(iio_stresstest C)
4951
add_executable(iio_adi_xflow_check iio_adi_xflow_check.c)
5052
add_executable(iio_stresstest iio_stresstest.c)
51-
target_link_libraries(iio_adi_xflow_check iio ${PTHREAD_LIBRARIES})
53+
target_link_libraries(iio_adi_xflow_check iio iio_tests_helper ${PTHREAD_LIBRARIES})
5254
target_link_libraries(iio_stresstest iio ${PTHREAD_LIBRARIES})
5355
set(IIO_TESTS_TARGETS ${IIO_TESTS_TARGETS} iio_adi_xflow_check iio_stresstest)
5456

tests/iio_adi_xflow_check.c

Lines changed: 6 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,11 @@
2828
#include <string.h>
2929
#include <unistd.h>
3030

31+
#include "iio_common.h"
32+
33+
34+
#define MY_NAME "iio_adi_xflow_check"
35+
3136
struct xflow_pthread_data {
3237
struct iio_context *ctx;
3338
const char *device_name;
@@ -161,53 +166,6 @@ static void *monitor_thread_fn(void *data)
161166
return (void *)0;
162167
}
163168

164-
static struct iio_context *scan(void)
165-
{
166-
struct iio_scan_context *scan_ctx;
167-
struct iio_context_info **info;
168-
struct iio_context *ctx = NULL;
169-
unsigned int i;
170-
ssize_t ret;
171-
172-
scan_ctx = iio_create_scan_context(NULL, 0);
173-
if (!scan_ctx) {
174-
fprintf(stderr, "Unable to create scan context\n");
175-
return NULL;
176-
}
177-
178-
ret = iio_scan_context_get_info_list(scan_ctx, &info);
179-
if (ret < 0) {
180-
char err_str[1024];
181-
iio_strerror(-ret, err_str, sizeof(err_str));
182-
fprintf(stderr, "Scanning for IIO contexts failed: %s\n", err_str);
183-
goto err_free_ctx;
184-
}
185-
186-
if (ret == 0) {
187-
printf("No IIO context found.\n");
188-
goto err_free_info_list;
189-
}
190-
191-
if (ret == 1) {
192-
ctx = iio_create_context_from_uri(iio_context_info_get_uri(info[0]));
193-
} else {
194-
fprintf(stderr, "Multiple contexts found. Please select one using --uri:\n");
195-
196-
for (i = 0; i < (size_t) ret; i++) {
197-
fprintf(stderr, "\t%u: %s [%s]\n", i,
198-
iio_context_info_get_description(info[i]),
199-
iio_context_info_get_uri(info[i]));
200-
}
201-
}
202-
203-
err_free_info_list:
204-
iio_context_info_list_free(info);
205-
err_free_ctx:
206-
iio_scan_context_destroy(scan_ctx);
207-
208-
return ctx;
209-
}
210-
211169
int main(int argc, char **argv)
212170
{
213171
unsigned int buffer_size = 1024 * 1024;
@@ -272,7 +230,7 @@ int main(int argc, char **argv)
272230

273231

274232
if (scan_for_context)
275-
ctx = scan();
233+
ctx = autodetect_context(true, NULL, MY_NAME);
276234
else if (arg_uri)
277235
ctx = iio_create_context_from_uri(arg_uri);
278236
else if (arg_ip)

tests/iio_attr.c

Lines changed: 11 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#include <ctype.h>
3030
#include <sys/types.h>
3131
#include "gen_code.h"
32+
#include "iio_common.h"
3233

3334
#define MY_NAME "iio_attr"
3435

@@ -38,32 +39,6 @@
3839
#define _strdup strdup
3940
#endif
4041

41-
enum backend {
42-
LOCAL,
43-
XML,
44-
AUTO
45-
};
46-
47-
/*
48-
* internal buffers need to be big enough for attributes
49-
* coming back from the kernel. Because of virtual memory,
50-
* only the amount of ram that is needed is used.
51-
*/
52-
#define BUF_SIZE 16384
53-
54-
static void * xmalloc(size_t n)
55-
{
56-
void *p = malloc(n);
57-
58-
if (!p && n != 0) {
59-
fprintf(stderr, MY_NAME
60-
" fatal error: allocating %zu bytes failed\n",n);
61-
exit(EXIT_FAILURE);
62-
}
63-
64-
return p;
65-
}
66-
6742
static bool str_match(const char * haystack, char * needle, bool ignore)
6843
{
6944
bool ret = false;
@@ -120,62 +95,11 @@ static bool str_match(const char * haystack, char * needle, bool ignore)
12095
return ret;
12196
}
12297

123-
static struct iio_context * autodetect_context(bool gen_code)
124-
{
125-
struct iio_scan_context *scan_ctx;
126-
struct iio_context_info **info;
127-
struct iio_context *ctx = NULL;
128-
unsigned int i;
129-
ssize_t ret;
130-
131-
scan_ctx = iio_create_scan_context(NULL, 0);
132-
if (!scan_ctx) {
133-
fprintf(stderr, "Unable to create scan context\n");
134-
return NULL;
135-
}
136-
137-
ret = iio_scan_context_get_info_list(scan_ctx, &info);
138-
if (ret < 0) {
139-
char *err_str = xmalloc(BUF_SIZE);
140-
iio_strerror(-ret, err_str, BUF_SIZE);
141-
fprintf(stderr, "Scanning for IIO contexts failed: %s\n", err_str);
142-
free (err_str);
143-
goto err_free_ctx;
144-
}
145-
146-
if (ret == 0) {
147-
printf("No IIO context found.\n");
148-
goto err_free_info_list;
149-
}
150-
if (ret == 1) {
151-
printf("Using auto-detected IIO context at URI \"%s\"\n",
152-
iio_context_info_get_uri(info[0]));
153-
ctx = iio_create_context_from_uri(iio_context_info_get_uri(info[0]));
154-
if (gen_code)
155-
gen_context(iio_context_info_get_uri(info[0]));
156-
} else {
157-
fprintf(stderr, "Multiple contexts found. Please select one using --uri:\n");
158-
for (i = 0; i < (size_t) ret; i++) {
159-
fprintf(stderr, "\t%u: %s [%s]\n",
160-
i, iio_context_info_get_description(info[i]),
161-
iio_context_info_get_uri(info[i]));
162-
}
163-
}
164-
165-
err_free_info_list:
166-
iio_context_info_list_free(info);
167-
err_free_ctx:
168-
iio_scan_context_destroy(scan_ctx);
169-
170-
return ctx;
171-
}
172-
173-
17498
static void dump_device_attributes(const struct iio_device *dev,
17599
const char *attr, const char *wbuf, bool quiet)
176100
{
177101
ssize_t ret;
178-
char *buf = xmalloc(BUF_SIZE);
102+
char *buf = xmalloc(BUF_SIZE, MY_NAME);
179103

180104
if (!wbuf || !quiet) {
181105
if (!quiet)
@@ -213,7 +137,7 @@ static void dump_buffer_attributes(const struct iio_device *dev,
213137
const char *attr, const char *wbuf, bool quiet)
214138
{
215139
ssize_t ret;
216-
char *buf = xmalloc(BUF_SIZE);
140+
char *buf = xmalloc(BUF_SIZE, MY_NAME);
217141

218142
if (!wbuf || !quiet) {
219143
gen_function("device_buffer", "dev", attr, NULL);
@@ -255,7 +179,7 @@ static void dump_debug_attributes(const struct iio_device *dev,
255179
const char *attr, const char *wbuf, bool quiet)
256180
{
257181
ssize_t ret;
258-
char *buf = xmalloc(BUF_SIZE);
182+
char *buf = xmalloc(BUF_SIZE, MY_NAME);
259183

260184
if (!wbuf || !quiet) {
261185
gen_function("device_debug", "dev", attr, NULL);
@@ -297,7 +221,7 @@ static void dump_channel_attributes(const struct iio_device *dev,
297221
struct iio_channel *ch, const char *attr, const char *wbuf, bool quiet)
298222
{
299223
ssize_t ret;
300-
char *buf = xmalloc(BUF_SIZE);
224+
char *buf = xmalloc(BUF_SIZE, MY_NAME);
301225
const char *type_name;
302226

303227
if (!wbuf || !quiet) {
@@ -422,7 +346,7 @@ int main(int argc, char **argv)
422346
int c, option_index = 0;
423347
int device_index = 0, channel_index = 0, attr_index = 0;
424348
const char *arg_uri = NULL, *gen_file = NULL;
425-
enum backend backend = LOCAL;
349+
enum backend backend = IIO_LOCAL;
426350
bool detect_context = false, search_device = false, ignore_case = false,
427351
search_channel = false, search_buffer = false, search_debug = false,
428352
search_context = false, input_only = false, output_only = false,
@@ -442,7 +366,7 @@ int main(int argc, char **argv)
442366
detect_context = true;
443367
break;
444368
case 'u':
445-
backend = AUTO;
369+
backend = IIO_AUTO;
446370
arg_uri = optarg;
447371
break;
448372
/* Attribute type
@@ -623,16 +547,16 @@ int main(int argc, char **argv)
623547
}
624548

625549
if (detect_context)
626-
ctx = autodetect_context(gen_code);
627-
else if (backend == AUTO) {
550+
ctx = autodetect_context(true, gen_code, MY_NAME);
551+
else if (backend == IIO_AUTO) {
628552
ctx = iio_create_context_from_uri(arg_uri);
629553
gen_context(arg_uri);
630554
} else
631555
ctx = iio_create_default_context();
632556

633557
if (!ctx) {
634558
if (!detect_context) {
635-
char *buf = xmalloc(BUF_SIZE);
559+
char *buf = xmalloc(BUF_SIZE, MY_NAME);
636560

637561
iio_strerror(errno, buf, BUF_SIZE);
638562
fprintf(stderr, "Unable to create IIO context: %s\n",
@@ -659,7 +583,7 @@ int main(int argc, char **argv)
659583
gen_context_attr(key);
660584
}
661585
} else {
662-
char *buf = xmalloc(BUF_SIZE);
586+
char *buf = xmalloc(BUF_SIZE, MY_NAME);
663587
iio_strerror(errno, buf, BUF_SIZE);
664588
fprintf(stderr, "Unable to get context attributes: %s (%zd)\n",
665589
buf, ret);

tests/iio_common.c

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
/*
2+
* iio_common - Common functions used in the IIO utilities
3+
*
4+
* Copyright (C) 2014-2020 Analog Devices, Inc.
5+
* Author: Paul Cercueil
6+
*
7+
* This program is free software; you can redistribute it and/or
8+
* modify it under the terms of the GNU General Public License
9+
* as published by the Free Software Foundation; either version 2
10+
* of the License, or (at your option) any later version.
11+
*
12+
* This program is distributed in the hope that it will be useful,
13+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15+
* GNU General Public License for more details.
16+
*
17+
* You should have received a copy of the GNU General Public License
18+
* along with this program; if not, write to the Free Software
19+
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20+
* */
21+
22+
#include <iio.h>
23+
#include <stdio.h>
24+
25+
#include "iio_common.h"
26+
#include "gen_code.h"
27+
28+
void * xmalloc(size_t n, const char * name)
29+
{
30+
void *p = malloc(n);
31+
32+
if (!p && n != 0) {
33+
fprintf(stderr, "%s fatal error: allocating %zu bytes failed\n",
34+
name, n);
35+
exit(EXIT_FAILURE);
36+
}
37+
38+
return p;
39+
}
40+
41+
struct iio_context * autodetect_context(bool rtn, bool gen_code, const char * name)
42+
{
43+
struct iio_scan_context *scan_ctx;
44+
struct iio_context_info **info;
45+
struct iio_context *ctx = NULL;
46+
unsigned int i;
47+
ssize_t ret;
48+
FILE *out;
49+
50+
scan_ctx = iio_create_scan_context(NULL, 0);
51+
if (!scan_ctx) {
52+
fprintf(stderr, "Unable to create scan context\n");
53+
return NULL;
54+
}
55+
56+
ret = iio_scan_context_get_info_list(scan_ctx, &info);
57+
if (ret < 0) {
58+
char *err_str = xmalloc(BUF_SIZE, name);
59+
iio_strerror(-ret, err_str, BUF_SIZE);
60+
fprintf(stderr, "Scanning for IIO contexts failed: %s\n", err_str);
61+
free (err_str);
62+
goto err_free_ctx;
63+
}
64+
65+
if (ret == 0) {
66+
printf("No IIO context found.\n");
67+
goto err_free_info_list;
68+
}
69+
if (!rtn && ret == 1) {
70+
printf("Using auto-detected IIO context at URI \"%s\"\n",
71+
iio_context_info_get_uri(info[0]));
72+
ctx = iio_create_context_from_uri(iio_context_info_get_uri(info[0]));
73+
if (gen_code)
74+
gen_context(iio_context_info_get_uri(info[0]));
75+
} else {
76+
if (rtn) {
77+
out = stderr;
78+
fprintf(out, "Multiple contexts found. Please select one using --uri:\n");
79+
} else {
80+
out = stdout;
81+
fprintf(out, "Available contexts:\n");
82+
}
83+
for (i = 0; i < (size_t) ret; i++) {
84+
fprintf(out, "\t%u: %s [%s]\n",
85+
i, iio_context_info_get_description(info[i]),
86+
iio_context_info_get_uri(info[i]));
87+
}
88+
}
89+
90+
err_free_info_list:
91+
iio_context_info_list_free(info);
92+
err_free_ctx:
93+
iio_scan_context_destroy(scan_ctx);
94+
95+
return ctx;
96+
}
97+

0 commit comments

Comments
 (0)