Browse Source

ft232r: ft232r_read_all function to simplify exact-length reads

Luke Dashjr 13 years ago
parent
commit
634223fde3
2 changed files with 15 additions and 2 deletions
  1. 14 2
      ft232r.c
  2. 1 0
      ft232r.h

+ 14 - 2
ft232r.c

@@ -238,12 +238,14 @@ ssize_t ft232r_write(struct ft232r_device_handle *dev, void *data, size_t count)
 	return ft232r_readwrite(dev, dev->o, data, count);
 }
 
-ssize_t ft232r_write_all(struct ft232r_device_handle *dev, void *data, size_t count)
+typedef ssize_t (*ft232r_rwfunc_t)(struct ft232r_device_handle *, void*, size_t);
+
+static ssize_t ft232r_rw_all(ft232r_rwfunc_t rwfunc, struct ft232r_device_handle *dev, void *data, size_t count)
 {
 	char *p = data;
 	ssize_t writ, total = 0;
 
-	while (count && (writ = ft232r_write(dev, p, count)) > 0) {
+	while (count && (writ = rwfunc(dev, p, count)) > 0) {
 		p += writ;
 		count -= writ;
 		total += writ;
@@ -251,6 +253,11 @@ ssize_t ft232r_write_all(struct ft232r_device_handle *dev, void *data, size_t co
 	return total ?: writ;
 }
 
+ssize_t ft232r_write_all(struct ft232r_device_handle *dev, void *data, size_t count)
+{
+	return ft232r_rw_all(ft232r_write, dev, data, count);
+}
+
 ssize_t ft232r_read(struct ft232r_device_handle *dev, void *data, size_t count)
 {
 	if (!dev->ibufLen) {
@@ -270,6 +277,11 @@ ssize_t ft232r_read(struct ft232r_device_handle *dev, void *data, size_t count)
 	return count;
 }
 
+ssize_t ft232r_read_all(struct ft232r_device_handle *dev, void *data, size_t count)
+{
+	return ft232r_rw_all(ft232r_read, dev, data, count);
+}
+
 #if 0
 int main() {
 	libusb_init(NULL);

+ 1 - 0
ft232r.h

@@ -34,5 +34,6 @@ extern bool ft232r_set_bitmode(struct ft232r_device_handle *, uint8_t mask, uint
 extern ssize_t ft232r_write(struct ft232r_device_handle *, void *data, size_t count);
 extern ssize_t ft232r_write_all(struct ft232r_device_handle *, void *data, size_t count);
 extern ssize_t ft232r_read(struct ft232r_device_handle *, void *buf, size_t count);
+extern ssize_t ft232r_read_all(struct ft232r_device_handle *, void *data, size_t count);
 
 #endif