X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fdrivers.c;h=6dc2c55cbd18785813186a5e814d0a7d020d1583;hb=HEAD;hp=6200e5ee4233211e91b0df2e34b4bc65199023e6;hpb=5d8b3913d4dc450b8af0ad028a379be775e278ef;p=libsigrok.git diff --git a/src/drivers.c b/src/drivers.c index 6200e5ee..6dc2c55c 100644 --- a/src/drivers.c +++ b/src/drivers.c @@ -3,6 +3,7 @@ * * Copyright (C) 2016 Lars-Peter Clausen * Copyright (C) 2016 Aurelien Jacobs + * Copyright (C) 2017 Marcus Comstedt * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,39 +19,38 @@ * along with this program. If not, see . */ +#include #include #include #include "libsigrok-internal.h" /* - * sr_driver_list is a special section contains pointers to all the hardware - * drivers built into the library. The __start and __stop symbols are - * auto-generated by the linker (OSX needs a little help) and point to the start - * and end of the section. They are used to iterate over the list of all - * drivers. + * The special __sr_driver_list section contains pointers to all hardware + * drivers which were built into the library according to its configuration + * (will depend on the availability of dependencies, as well as user provided + * specs). The __start and __stop symbols point to the start and end of the + * section. They are used to iterate over the list of all drivers which were + * included in the library. */ -#ifdef __APPLE__ -extern struct sr_dev_driver *__start_sr_driver_list __asm("section$start$__DATA$__sr_driver_list"); -extern struct sr_dev_driver *__stop_sr_driver_list __asm("section$end$__DATA$__sr_driver_list"); -#else -extern struct sr_dev_driver *__start_sr_driver_list; -extern struct sr_dev_driver *__stop_sr_driver_list; -#endif +SR_PRIV extern const struct sr_dev_driver *sr_driver_list__start[]; +SR_PRIV extern const struct sr_dev_driver *sr_driver_list__stop[]; -/** @private +/** * Initialize the driver list in a fresh libsigrok context. * * @param ctx Pointer to a libsigrok context struct. Must not be NULL. + * + * @private */ -SR_PRIV void sr_drivers_init(struct sr_context *ctx) +SR_API void sr_drivers_init(struct sr_context *ctx) { - struct sr_dev_driver **drivers; GArray *array; array = g_array_new(TRUE, FALSE, sizeof(struct sr_dev_driver *)); - for (drivers = &__start_sr_driver_list; drivers < &__stop_sr_driver_list; - drivers++) +#ifdef HAVE_DRIVERS + for (const struct sr_dev_driver **drivers = sr_driver_list__start + 1; + drivers < sr_driver_list__stop; drivers++) g_array_append_val(array, *drivers); - ctx->driver_list = (struct sr_dev_driver **)array->data; - g_array_free(array, FALSE); +#endif + ctx->driver_list = (struct sr_dev_driver **)g_array_free(array, FALSE); }