X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=serialport.c;h=f8de843d1e40cf48dc92531c82817628b3480702;hb=9caa2e86aa14e347b0a274ac023d02582a217bc8;hp=290786a4c1ce92945baac78208033b54b6452e71;hpb=e4ce975a54c60cda6615e4829ae1408adaec8fcf;p=libserialport.git diff --git a/serialport.c b/serialport.c index 290786a..f8de843 100644 --- a/serialport.c +++ b/serialport.c @@ -52,10 +52,12 @@ static enum sp_return get_config(struct sp_port *port, struct port_data *data, static enum sp_return set_config(struct sp_port *port, struct port_data *data, const struct sp_port_config *config); -enum sp_return sp_get_port_by_name(const char *portname, struct sp_port **port_ptr) +SP_API enum sp_return sp_get_port_by_name(const char *portname, struct sp_port **port_ptr) { struct sp_port *port; +#ifndef NO_PORT_METADATA enum sp_return ret; +#endif int len; TRACE("%s, %p", portname, port_ptr); @@ -111,38 +113,38 @@ enum sp_return sp_get_port_by_name(const char *portname, struct sp_port **port_p RETURN_OK(); } -char *sp_get_port_name(const struct sp_port *port) +SP_API char *sp_get_port_name(const struct sp_port *port) { TRACE("%p", port); if (!port) return NULL; - RETURN_VALUE("%s", port->name); + RETURN_STRING(port->name); } -char *sp_get_port_description(struct sp_port *port) +SP_API char *sp_get_port_description(struct sp_port *port) { TRACE("%p", port); if (!port || !port->description) return NULL; - RETURN_VALUE("%s", port->description); + RETURN_STRING(port->description); } -enum sp_transport sp_get_port_transport(struct sp_port *port) +SP_API enum sp_transport sp_get_port_transport(struct sp_port *port) { TRACE("%p", port); if (!port) RETURN_ERROR(SP_ERR_ARG, "Null port"); - RETURN_VALUE("%d", port->transport); + RETURN_INT(port->transport); } -enum sp_return sp_get_port_usb_bus_address(const struct sp_port *port, - int *usb_bus, int *usb_address) +SP_API enum sp_return sp_get_port_usb_bus_address(const struct sp_port *port, + int *usb_bus,int *usb_address) { TRACE("%p", port); @@ -159,8 +161,8 @@ enum sp_return sp_get_port_usb_bus_address(const struct sp_port *port, RETURN_OK(); } -enum sp_return sp_get_port_usb_vid_pid(const struct sp_port *port, - int *usb_vid, int *usb_pid) +SP_API enum sp_return sp_get_port_usb_vid_pid(const struct sp_port *port, + int *usb_vid, int *usb_pid) { TRACE("%p", port); @@ -177,37 +179,37 @@ enum sp_return sp_get_port_usb_vid_pid(const struct sp_port *port, RETURN_OK(); } -char *sp_get_port_usb_manufacturer(const struct sp_port *port) +SP_API char *sp_get_port_usb_manufacturer(const struct sp_port *port) { TRACE("%p", port); if (!port || port->transport != SP_TRANSPORT_USB || !port->usb_manufacturer) return NULL; - RETURN_VALUE("%s", port->usb_manufacturer); + RETURN_STRING(port->usb_manufacturer); } -char *sp_get_port_usb_product(const struct sp_port *port) +SP_API char *sp_get_port_usb_product(const struct sp_port *port) { TRACE("%p", port); if (!port || port->transport != SP_TRANSPORT_USB || !port->usb_product) return NULL; - RETURN_VALUE("%s", port->usb_product); + RETURN_STRING(port->usb_product); } -char *sp_get_port_usb_serial(const struct sp_port *port) +SP_API char *sp_get_port_usb_serial(const struct sp_port *port) { TRACE("%p", port); if (!port || port->transport != SP_TRANSPORT_USB || !port->usb_serial) return NULL; - RETURN_VALUE("%s", port->usb_serial); + RETURN_STRING(port->usb_serial); } -char *sp_get_port_bluetooth_address(const struct sp_port *port) +SP_API char *sp_get_port_bluetooth_address(const struct sp_port *port) { TRACE("%p", port); @@ -215,10 +217,11 @@ char *sp_get_port_bluetooth_address(const struct sp_port *port) || !port->bluetooth_address) return NULL; - RETURN_VALUE("%s", port->bluetooth_address); + RETURN_STRING(port->bluetooth_address); } -enum sp_return sp_get_port_handle(const struct sp_port *port, void *result_ptr) +SP_API enum sp_return sp_get_port_handle(const struct sp_port *port, + void *result_ptr) { TRACE("%p, %p", port, result_ptr); @@ -236,7 +239,8 @@ enum sp_return sp_get_port_handle(const struct sp_port *port, void *result_ptr) RETURN_OK(); } -enum sp_return sp_copy_port(const struct sp_port *port, struct sp_port **copy_ptr) +SP_API enum sp_return sp_copy_port(const struct sp_port *port, + struct sp_port **copy_ptr) { TRACE("%p, %p", port, copy_ptr); @@ -253,10 +257,10 @@ enum sp_return sp_copy_port(const struct sp_port *port, struct sp_port **copy_pt DEBUG("Copying port structure"); - RETURN_VALUE("%p", sp_get_port_by_name(port->name, copy_ptr)); + RETURN_INT(sp_get_port_by_name(port->name, copy_ptr)); } -void sp_free_port(struct sp_port *port) +SP_API void sp_free_port(struct sp_port *port) { TRACE("%p", port); @@ -289,7 +293,8 @@ void sp_free_port(struct sp_port *port) RETURN(); } -struct sp_port **list_append(struct sp_port **list, const char *portname) +SP_PRIV struct sp_port **list_append(struct sp_port **list, + const char *portname) { void *tmp; unsigned int count; @@ -308,7 +313,7 @@ fail: return NULL; } -enum sp_return sp_list_ports(struct sp_port ***list_ptr) +SP_API enum sp_return sp_list_ports(struct sp_port ***list_ptr) { struct sp_port **list; int ret; @@ -345,7 +350,7 @@ enum sp_return sp_list_ports(struct sp_port ***list_ptr) } } -void sp_free_port_list(struct sp_port **list) +SP_API void sp_free_port_list(struct sp_port **list) { unsigned int i; @@ -387,7 +392,7 @@ void sp_free_port_list(struct sp_port **list) CHECK_PORT_HANDLE(); \ } while (0) -enum sp_return sp_open(struct sp_port *port, enum sp_mode flags) +SP_API enum sp_return sp_open(struct sp_port *port, enum sp_mode flags) { struct port_data data; struct sp_port_config config; @@ -553,7 +558,7 @@ enum sp_return sp_open(struct sp_port *port, enum sp_mode flags) RETURN_OK(); } -enum sp_return sp_close(struct sp_port *port) +SP_API enum sp_return sp_close(struct sp_port *port) { TRACE("%p", port); @@ -587,7 +592,7 @@ enum sp_return sp_close(struct sp_port *port) RETURN_OK(); } -enum sp_return sp_flush(struct sp_port *port, enum sp_buffer buffers) +SP_API enum sp_return sp_flush(struct sp_port *port, enum sp_buffer buffers) { TRACE("%p, 0x%x", port, buffers); @@ -626,7 +631,7 @@ enum sp_return sp_flush(struct sp_port *port, enum sp_buffer buffers) RETURN_OK(); } -enum sp_return sp_drain(struct sp_port *port) +SP_API enum sp_return sp_drain(struct sp_port *port) { TRACE("%p", port); @@ -662,7 +667,8 @@ enum sp_return sp_drain(struct sp_port *port) #endif } -enum sp_return sp_blocking_write(struct sp_port *port, const void *buf, size_t count, unsigned int timeout) +SP_API enum sp_return sp_blocking_write(struct sp_port *port, const void *buf, + size_t count, unsigned int timeout) { TRACE("%p, %p, %d, %d", port, buf, count, timeout); @@ -677,7 +683,7 @@ enum sp_return sp_blocking_write(struct sp_port *port, const void *buf, size_t c DEBUG("Writing %d bytes to port %s, no timeout", count, port->name); if (count == 0) - RETURN_VALUE("0", 0); + RETURN_INT(0); #ifdef _WIN32 DWORD bytes_written = 0; @@ -704,13 +710,13 @@ enum sp_return sp_blocking_write(struct sp_port *port, const void *buf, size_t c DEBUG("Waiting for write to complete"); GetOverlappedResult(port->hdl, &port->write_ovl, &bytes_written, TRUE); DEBUG("Write completed, %d/%d bytes written", bytes_written, count); - RETURN_VALUE("%d", bytes_written); + RETURN_INT(bytes_written); } else { RETURN_FAIL("WriteFile() failed"); } } else { DEBUG("Write completed immediately"); - RETURN_VALUE("%d", count); + RETURN_INT(count); } #else size_t bytes_written = 0; @@ -739,7 +745,7 @@ enum sp_return sp_blocking_write(struct sp_port *port, const void *buf, size_t c gettimeofday(&now, NULL); if (timercmp(&now, &end, >)) { DEBUG("write timed out"); - RETURN_VALUE("%d", bytes_written); + RETURN_INT(bytes_written); } timersub(&end, &now, &delta); } @@ -753,7 +759,7 @@ enum sp_return sp_blocking_write(struct sp_port *port, const void *buf, size_t c } } else if (result == 0) { DEBUG("write timed out"); - RETURN_VALUE("%d", bytes_written); + RETURN_INT(bytes_written); } /* Do write. */ @@ -772,11 +778,12 @@ enum sp_return sp_blocking_write(struct sp_port *port, const void *buf, size_t c ptr += result; } - RETURN_VALUE("%d", bytes_written); + RETURN_INT(bytes_written); #endif } -enum sp_return sp_nonblocking_write(struct sp_port *port, const void *buf, size_t count) +SP_API enum sp_return sp_nonblocking_write(struct sp_port *port, + const void *buf, size_t count) { TRACE("%p, %p, %d", port, buf, count); @@ -788,7 +795,7 @@ enum sp_return sp_nonblocking_write(struct sp_port *port, const void *buf, size_ DEBUG("Writing up to %d bytes to port %s", count, port->name); if (count == 0) - RETURN_VALUE("0", 0); + RETURN_INT(0); #ifdef _WIN32 DWORD written = 0; @@ -802,7 +809,7 @@ enum sp_return sp_nonblocking_write(struct sp_port *port, const void *buf, size_ } else { DEBUG("Previous write not complete"); /* Can't take a new write until the previous one finishes. */ - RETURN_VALUE("0", 0); + RETURN_INT(0); } } @@ -829,7 +836,7 @@ enum sp_return sp_nonblocking_write(struct sp_port *port, const void *buf, size_ } else { DEBUG("Asynchronous write running"); port->writing = 1; - RETURN_VALUE("%d", ++written); + RETURN_INT(++written); } } else { /* Actual failure of some kind. */ @@ -843,7 +850,7 @@ enum sp_return sp_nonblocking_write(struct sp_port *port, const void *buf, size_ DEBUG("All bytes written immediately"); - RETURN_VALUE("%d", written); + RETURN_INT(written); #else /* Returns the number of bytes written, or -1 upon failure. */ ssize_t written = write(port->fd, buf, count); @@ -851,11 +858,12 @@ enum sp_return sp_nonblocking_write(struct sp_port *port, const void *buf, size_ if (written < 0) RETURN_FAIL("write() failed"); else - RETURN_VALUE("%d", written); + RETURN_INT(written); #endif } -enum sp_return sp_blocking_read(struct sp_port *port, void *buf, size_t count, unsigned int timeout) +SP_API enum sp_return sp_blocking_read(struct sp_port *port, void *buf, + size_t count, unsigned int timeout) { TRACE("%p, %p, %d, %d", port, buf, count, timeout); @@ -870,7 +878,7 @@ enum sp_return sp_blocking_read(struct sp_port *port, void *buf, size_t count, u DEBUG("Reading %d bytes from port %s, no timeout", count, port->name); if (count == 0) - RETURN_VALUE("0", 0); + RETURN_INT(0); #ifdef _WIN32 DWORD bytes_read = 0; @@ -901,7 +909,7 @@ enum sp_return sp_blocking_read(struct sp_port *port, void *buf, size_t count, u RETURN_FAIL("WaitCommEvent() failed"); } - RETURN_VALUE("%d", bytes_read); + RETURN_INT(bytes_read); #else size_t bytes_read = 0; @@ -930,7 +938,7 @@ enum sp_return sp_blocking_read(struct sp_port *port, void *buf, size_t count, u gettimeofday(&now, NULL); if (timercmp(&now, &end, >)) /* Timeout has expired. */ - RETURN_VALUE("%d", bytes_read); + RETURN_INT(bytes_read); timersub(&end, &now, &delta); } result = select(port->fd + 1, &fds, NULL, NULL, timeout ? &delta : NULL); @@ -943,7 +951,7 @@ enum sp_return sp_blocking_read(struct sp_port *port, void *buf, size_t count, u } } else if (result == 0) { DEBUG("read timed out"); - RETURN_VALUE("%d", bytes_read); + RETURN_INT(bytes_read); } /* Do read. */ @@ -962,11 +970,12 @@ enum sp_return sp_blocking_read(struct sp_port *port, void *buf, size_t count, u ptr += result; } - RETURN_VALUE("%d", bytes_read); + RETURN_INT(bytes_read); #endif } -enum sp_return sp_nonblocking_read(struct sp_port *port, void *buf, size_t count) +SP_API enum sp_return sp_nonblocking_read(struct sp_port *port, void *buf, + size_t count) { TRACE("%p, %p, %d", port, buf, count); @@ -1002,7 +1011,7 @@ enum sp_return sp_nonblocking_read(struct sp_port *port, void *buf, size_t count } } - RETURN_VALUE("%d", bytes_read); + RETURN_INT(bytes_read); #else ssize_t bytes_read; @@ -1015,11 +1024,11 @@ enum sp_return sp_nonblocking_read(struct sp_port *port, void *buf, size_t count /* This is an actual failure. */ RETURN_FAIL("read() failed"); } - RETURN_VALUE("%d", bytes_read); + RETURN_INT(bytes_read); #endif } -enum sp_return sp_input_waiting(struct sp_port *port) +SP_API enum sp_return sp_input_waiting(struct sp_port *port) { TRACE("%p", port); @@ -1033,16 +1042,16 @@ enum sp_return sp_input_waiting(struct sp_port *port) if (ClearCommError(port->hdl, &errors, &comstat) == 0) RETURN_FAIL("ClearCommError() failed"); - RETURN_VALUE("%d", comstat.cbInQue); + RETURN_INT(comstat.cbInQue); #else int bytes_waiting; if (ioctl(port->fd, TIOCINQ, &bytes_waiting) < 0) RETURN_FAIL("TIOCINQ ioctl failed"); - RETURN_VALUE("%d", bytes_waiting); + RETURN_INT(bytes_waiting); #endif } -enum sp_return sp_output_waiting(struct sp_port *port) +SP_API enum sp_return sp_output_waiting(struct sp_port *port) { TRACE("%p", port); @@ -1056,16 +1065,16 @@ enum sp_return sp_output_waiting(struct sp_port *port) if (ClearCommError(port->hdl, &errors, &comstat) == 0) RETURN_FAIL("ClearCommError() failed"); - RETURN_VALUE("%d", comstat.cbOutQue); + RETURN_INT(comstat.cbOutQue); #else int bytes_waiting; if (ioctl(port->fd, TIOCOUTQ, &bytes_waiting) < 0) RETURN_FAIL("TIOCOUTQ ioctl failed"); - RETURN_VALUE("%d", bytes_waiting); + RETURN_INT(bytes_waiting); #endif } -enum sp_return sp_new_event_set(struct sp_event_set **result_ptr) +SP_API enum sp_return sp_new_event_set(struct sp_event_set **result_ptr) { struct sp_event_set *result; @@ -1113,7 +1122,7 @@ static enum sp_return add_handle(struct sp_event_set *event_set, RETURN_OK(); } -enum sp_return sp_add_port_events(struct sp_event_set *event_set, +SP_API enum sp_return sp_add_port_events(struct sp_event_set *event_set, const struct sp_port *port, enum sp_event mask) { TRACE("%p, %p, %d", event_set, port, mask); @@ -1143,7 +1152,7 @@ enum sp_return sp_add_port_events(struct sp_event_set *event_set, RETURN_OK(); } -void sp_free_event_set(struct sp_event_set *event_set) +SP_API void sp_free_event_set(struct sp_event_set *event_set) { TRACE("%p", event_set); @@ -1164,7 +1173,8 @@ void sp_free_event_set(struct sp_event_set *event_set) RETURN(); } -enum sp_return sp_wait(struct sp_event_set *event_set, unsigned int timeout) +SP_API enum sp_return sp_wait(struct sp_event_set *event_set, + unsigned int timeout) { TRACE("%p, %d", event_set, timeout); @@ -1953,7 +1963,7 @@ static enum sp_return set_config(struct sp_port *port, struct port_data *data, RETURN_OK(); } -enum sp_return sp_new_config(struct sp_port_config **config_ptr) +SP_API enum sp_return sp_new_config(struct sp_port_config **config_ptr) { struct sp_port_config *config; @@ -1981,7 +1991,7 @@ enum sp_return sp_new_config(struct sp_port_config **config_ptr) RETURN_OK(); } -void sp_free_config(struct sp_port_config *config) +SP_API void sp_free_config(struct sp_port_config *config) { TRACE("%p", config); @@ -1993,7 +2003,8 @@ void sp_free_config(struct sp_port_config *config) RETURN(); } -enum sp_return sp_get_config(struct sp_port *port, struct sp_port_config *config) +SP_API enum sp_return sp_get_config(struct sp_port *port, + struct sp_port_config *config) { struct port_data data; @@ -2009,7 +2020,8 @@ enum sp_return sp_get_config(struct sp_port *port, struct sp_port_config *config RETURN_OK(); } -enum sp_return sp_set_config(struct sp_port *port, const struct sp_port_config *config) +SP_API enum sp_return sp_set_config(struct sp_port *port, + const struct sp_port_config *config) { struct port_data data; struct sp_port_config prev_config; @@ -2028,7 +2040,7 @@ enum sp_return sp_set_config(struct sp_port *port, const struct sp_port_config * } #define CREATE_ACCESSORS(x, type) \ -enum sp_return sp_set_##x(struct sp_port *port, type x) { \ +SP_API enum sp_return sp_set_##x(struct sp_port *port, type x) { \ struct port_data data; \ struct sp_port_config config; \ TRACE("%p, %d", port, x); \ @@ -2038,14 +2050,16 @@ enum sp_return sp_set_##x(struct sp_port *port, type x) { \ TRY(set_config(port, &data, &config)); \ RETURN_OK(); \ } \ -enum sp_return sp_get_config_##x(const struct sp_port_config *config, type *x) { \ +SP_API enum sp_return sp_get_config_##x(const struct sp_port_config *config, \ + type *x) { \ TRACE("%p, %p", config, x); \ if (!config) \ RETURN_ERROR(SP_ERR_ARG, "Null config"); \ *x = config->x; \ RETURN_OK(); \ } \ -enum sp_return sp_set_config_##x(struct sp_port_config *config, type x) { \ +SP_API enum sp_return sp_set_config_##x(struct sp_port_config *config, \ + type x) { \ TRACE("%p, %d", config, x); \ if (!config) \ RETURN_ERROR(SP_ERR_ARG, "Null config"); \ @@ -2063,7 +2077,8 @@ CREATE_ACCESSORS(dtr, enum sp_dtr) CREATE_ACCESSORS(dsr, enum sp_dsr) CREATE_ACCESSORS(xon_xoff, enum sp_xonxoff) -enum sp_return sp_set_config_flowcontrol(struct sp_port_config *config, enum sp_flowcontrol flowcontrol) +SP_API enum sp_return sp_set_config_flowcontrol(struct sp_port_config *config, + enum sp_flowcontrol flowcontrol) { if (!config) RETURN_ERROR(SP_ERR_ARG, "Null configuration"); @@ -2097,7 +2112,8 @@ enum sp_return sp_set_config_flowcontrol(struct sp_port_config *config, enum sp_ RETURN_OK(); } -enum sp_return sp_set_flowcontrol(struct sp_port *port, enum sp_flowcontrol flowcontrol) +SP_API enum sp_return sp_set_flowcontrol(struct sp_port *port, + enum sp_flowcontrol flowcontrol) { struct port_data data; struct sp_port_config config; @@ -2115,7 +2131,8 @@ enum sp_return sp_set_flowcontrol(struct sp_port *port, enum sp_flowcontrol flow RETURN_OK(); } -enum sp_return sp_get_signals(struct sp_port *port, enum sp_signal *signals) +SP_API enum sp_return sp_get_signals(struct sp_port *port, + enum sp_signal *signals) { TRACE("%p, %p", port, signals); @@ -2155,7 +2172,7 @@ enum sp_return sp_get_signals(struct sp_port *port, enum sp_signal *signals) RETURN_OK(); } -enum sp_return sp_start_break(struct sp_port *port) +SP_API enum sp_return sp_start_break(struct sp_port *port) { TRACE("%p", port); @@ -2171,7 +2188,7 @@ enum sp_return sp_start_break(struct sp_port *port) RETURN_OK(); } -enum sp_return sp_end_break(struct sp_port *port) +SP_API enum sp_return sp_end_break(struct sp_port *port) { TRACE("%p", port); @@ -2187,17 +2204,17 @@ enum sp_return sp_end_break(struct sp_port *port) RETURN_OK(); } -int sp_last_error_code(void) +SP_API int sp_last_error_code(void) { TRACE(""); #ifdef _WIN32 - RETURN_VALUE("%d", GetLastError()); + RETURN_INT(GetLastError()); #else - RETURN_VALUE("%d", errno); + RETURN_INT(errno); #endif } -char *sp_last_error_message(void) +SP_API char *sp_last_error_message(void) { TRACE(""); @@ -2215,13 +2232,13 @@ char *sp_last_error_message(void) (LPTSTR) &message, 0, NULL ); - RETURN_VALUE("%s", message); + RETURN_STRING(message); #else - RETURN_VALUE("%s", strerror(errno)); + RETURN_STRING(strerror(errno)); #endif } -void sp_free_error_message(char *message) +SP_API void sp_free_error_message(char *message) { TRACE("%s", message); @@ -2234,7 +2251,7 @@ void sp_free_error_message(char *message) RETURN(); } -void sp_set_debug_handler(void (*handler)(const char *format, ...)) +SP_API void sp_set_debug_handler(void (*handler)(const char *format, ...)) { TRACE("%p", handler); @@ -2243,7 +2260,7 @@ void sp_set_debug_handler(void (*handler)(const char *format, ...)) RETURN(); } -void sp_default_debug_handler(const char *format, ...) +SP_API void sp_default_debug_handler(const char *format, ...) { va_list args; va_start(args, format); @@ -2254,42 +2271,42 @@ void sp_default_debug_handler(const char *format, ...) va_end(args); } -int sp_get_major_package_version(void) +SP_API int sp_get_major_package_version(void) { return SP_PACKAGE_VERSION_MAJOR; } -int sp_get_minor_package_version(void) +SP_API int sp_get_minor_package_version(void) { return SP_PACKAGE_VERSION_MINOR; } -int sp_get_micro_package_version(void) +SP_API int sp_get_micro_package_version(void) { return SP_PACKAGE_VERSION_MICRO; } -const char *sp_get_package_version_string(void) +SP_API const char *sp_get_package_version_string(void) { return SP_PACKAGE_VERSION_STRING; } -int sp_get_current_lib_version(void) +SP_API int sp_get_current_lib_version(void) { return SP_LIB_VERSION_CURRENT; } -int sp_get_revision_lib_version(void) +SP_API int sp_get_revision_lib_version(void) { return SP_LIB_VERSION_REVISION; } -int sp_get_age_lib_version(void) +SP_API int sp_get_age_lib_version(void) { return SP_LIB_VERSION_AGE; } -const char *sp_get_lib_version_string(void) +SP_API const char *sp_get_lib_version_string(void) { return SP_LIB_VERSION_STRING; }