chiark / gitweb /
protogen: simplify handling of integers and times.
authorRichard Kettlewell <rjk@terraraq.org.uk>
Sun, 7 Aug 2011 12:46:26 +0000 (13:46 +0100)
committerRichard Kettlewell <rjk@terraraq.org.uk>
Sun, 7 Aug 2011 12:46:26 +0000 (13:46 +0100)
They are now moved into the generic command marshalers, rather than
being converted to strings in every stub.  The same technique is used
as for list parameters and command bodies.

lib/client-common.c
lib/client-common.h
lib/client-stubs.c
lib/client.c
lib/eclient-stubs.c
lib/eclient.c
scripts/protocol

index 11c17e2..476117c 100644 (file)
@@ -74,11 +74,10 @@ socklen_t find_server(struct config *c,
   return len;
 }
 
-/** @brief Marker for a command body */
 const char disorder__body[1];
-
-/** @brief Marker for a list of args */
 const char disorder__list[1];
+const char disorder__integer[1];
+const char disorder__time[1];
 
 /*
 Local Variables:
index 3ad4198..26db715 100644 (file)
@@ -33,6 +33,12 @@ extern const char disorder__body[1];
 /** @brief Marker for a list of args */
 extern const char disorder__list[1];
 
+/** @brief Marker for an integer */
+extern const char disorder__integer[1];
+
+/** @brief Marker for a timestamp */
+extern const char disorder__time[1];
+
 #endif /* CLIENT_COMMON_H */
 
 /*
index 1cc03ea..6aaa559 100644 (file)
@@ -160,9 +160,7 @@ int disorder_make_cookie(disorder_client *c, char **cookiep) {
 }
 
 int disorder_move(disorder_client *c, const char *track, long delta) {
-  char buf_delta[16];
-  byte_snprintf(buf_delta, sizeof buf_delta, "%ld", delta);
-  return disorder_simple(c, NULL, "move", track, buf_delta, (char *)NULL);
+  return disorder_simple(c, NULL, "move", track, disorder__integer, delta, (char *)NULL);
 }
 
 int disorder_moveafter(disorder_client *c, const char *target, char **ids, int nids) {
@@ -170,9 +168,7 @@ int disorder_moveafter(disorder_client *c, const char *target, char **ids, int n
 }
 
 int disorder_new_tracks(disorder_client *c, long max, char ***tracksp, int *ntracksp) {
-  char buf_max[16];
-  byte_snprintf(buf_max, sizeof buf_max, "%ld", max);
-  int rc = disorder_simple(c, NULL, "new", buf_max, (char *)NULL);
+  int rc = disorder_simple(c, NULL, "new", disorder__integer, max, (char *)NULL);
   if(rc)
     return rc;
   if(readlist(c, tracksp, ntracksp))
@@ -358,21 +354,15 @@ int disorder_scratch(disorder_client *c, const char *id) {
 }
 
 int disorder_schedule_add_play(disorder_client *c, time_t when, const char *priority, const char *track) {
-  char buf_when[16];
-  byte_snprintf(buf_when, sizeof buf_when, "%lld", (long long)when);
-  return disorder_simple(c, NULL, "schedule-add", buf_when, priority, "play", track, (char *)NULL);
+  return disorder_simple(c, NULL, "schedule-add", disorder__time, when, priority, "play", track, (char *)NULL);
 }
 
 int disorder_schedule_add_set_global(disorder_client *c, time_t when, const char *priority, const char *pref, const char *value) {
-  char buf_when[16];
-  byte_snprintf(buf_when, sizeof buf_when, "%lld", (long long)when);
-  return disorder_simple(c, NULL, "schedule-add", buf_when, priority, "set-global", pref, value, (char *)NULL);
+  return disorder_simple(c, NULL, "schedule-add", disorder__time, when, priority, "set-global", pref, value, (char *)NULL);
 }
 
 int disorder_schedule_add_unset_global(disorder_client *c, time_t when, const char *priority, const char *pref) {
-  char buf_when[16];
-  byte_snprintf(buf_when, sizeof buf_when, "%lld", (long long)when);
-  return disorder_simple(c, NULL, "schedule-add", buf_when, priority, "set-global", pref, (char *)NULL);
+  return disorder_simple(c, NULL, "schedule-add", disorder__time, when, priority, "set-global", pref, (char *)NULL);
 }
 
 int disorder_schedule_del(disorder_client *c, const char *event) {
@@ -471,11 +461,7 @@ int disorder_version(disorder_client *c, char **versionp) {
 }
 
 int disorder_set_volume(disorder_client *c, long left, long right) {
-  char buf_left[16];
-  byte_snprintf(buf_left, sizeof buf_left, "%ld", left);
-  char buf_right[16];
-  byte_snprintf(buf_right, sizeof buf_right, "%ld", right);
-  return disorder_simple(c, NULL, "volume", buf_left, buf_right, (char *)NULL);
+  return disorder_simple(c, NULL, "volume", disorder__integer, left, disorder__integer, right, (char *)NULL);
 }
 
 int disorder_get_volume(disorder_client *c, long *leftp, long *rightp) {
index 6f08fec..987ab01 100644 (file)
@@ -176,6 +176,13 @@ static int check_response(disorder_client *c, char **rp) {
  * then the list is assumed to be NULL-terminated.  This may be used
  * any number of times.
  *
+ * Put @ref disorder__integer in the argument list followed by a long to
+ * send its value in decimal.  This may be used any number of times.
+ *
+ * Put @ref disorder__time in the argument list followed by a time_t
+ * to send its value in decimal.  This may be used any number of
+ * times.
+ *
  * Usually you would call this via one of the following interfaces:
  * - disorder_simple()
  */
@@ -213,6 +220,18 @@ static int disorder_simple_v(disorder_client *c,
          dynstr_append(&d, ' ');
          dynstr_append_string(&d, quoteutf8(arg));
        }
+      } else if(arg == disorder__integer) {
+       long n = va_arg(ap, long);
+       char buffer[16];
+       snprintf(buffer, sizeof buffer, "%ld", n);
+       dynstr_append(&d, ' ');
+       dynstr_append_string(&d, buffer);
+      } else if(arg == disorder__time) {
+       time_t n = va_arg(ap, time_t);
+       char buffer[16];
+       snprintf(buffer, sizeof buffer, "%lld", (long long)n);
+       dynstr_append(&d, ' ');
+       dynstr_append_string(&d, buffer);
       } else {
        dynstr_append(&d, ' ');
        dynstr_append_string(&d, quoteutf8(arg));
index fb48ade..b4e37d6 100644 (file)
@@ -82,9 +82,7 @@ int disorder_eclient_make_cookie(disorder_eclient *c, disorder_eclient_string_re
 }
 
 int disorder_eclient_move(disorder_eclient *c, disorder_eclient_no_response *completed, const char *track, long delta, void *v) {
-  char buf_delta[16];
-  byte_snprintf(buf_delta, sizeof buf_delta, "%ld", delta);
-  return simple(c, no_response_opcallback, (void (*)())completed, v, "move", track, buf_delta, (char *)0);
+  return simple(c, no_response_opcallback, (void (*)())completed, v, "move", track, disorder__integer, delta, (char *)0);
 }
 
 int disorder_eclient_moveafter(disorder_eclient *c, disorder_eclient_no_response *completed, const char *target, char **ids, int nids, void *v) {
@@ -92,9 +90,7 @@ int disorder_eclient_moveafter(disorder_eclient *c, disorder_eclient_no_response
 }
 
 int disorder_eclient_new_tracks(disorder_eclient *c, disorder_eclient_list_response *completed, long max, void *v) {
-  char buf_max[16];
-  byte_snprintf(buf_max, sizeof buf_max, "%ld", max);
-  return simple(c, list_response_opcallback, (void (*)())completed, v, "new", buf_max, (char *)0);
+  return simple(c, list_response_opcallback, (void (*)())completed, v, "new", disorder__integer, max, (char *)0);
 }
 
 int disorder_eclient_nop(disorder_eclient *c, disorder_eclient_no_response *completed, void *v) {
@@ -210,21 +206,15 @@ int disorder_eclient_scratch(disorder_eclient *c, disorder_eclient_no_response *
 }
 
 int disorder_eclient_schedule_add_play(disorder_eclient *c, disorder_eclient_no_response *completed, time_t when, const char *priority, const char *track, void *v) {
-  char buf_when[16];
-  byte_snprintf(buf_when, sizeof buf_when, "%lld", (long long)when);
-  return simple(c, no_response_opcallback, (void (*)())completed, v, "schedule-add", buf_when, priority, "play", track, (char *)0);
+  return simple(c, no_response_opcallback, (void (*)())completed, v, "schedule-add", disorder__time, when, priority, "play", track, (char *)0);
 }
 
 int disorder_eclient_schedule_add_set_global(disorder_eclient *c, disorder_eclient_no_response *completed, time_t when, const char *priority, const char *pref, const char *value, void *v) {
-  char buf_when[16];
-  byte_snprintf(buf_when, sizeof buf_when, "%lld", (long long)when);
-  return simple(c, no_response_opcallback, (void (*)())completed, v, "schedule-add", buf_when, priority, "set-global", pref, value, (char *)0);
+  return simple(c, no_response_opcallback, (void (*)())completed, v, "schedule-add", disorder__time, when, priority, "set-global", pref, value, (char *)0);
 }
 
 int disorder_eclient_schedule_add_unset_global(disorder_eclient *c, disorder_eclient_no_response *completed, time_t when, const char *priority, const char *pref, void *v) {
-  char buf_when[16];
-  byte_snprintf(buf_when, sizeof buf_when, "%lld", (long long)when);
-  return simple(c, no_response_opcallback, (void (*)())completed, v, "schedule-add", buf_when, priority, "set-global", pref, (char *)0);
+  return simple(c, no_response_opcallback, (void (*)())completed, v, "schedule-add", disorder__time, when, priority, "set-global", pref, (char *)0);
 }
 
 int disorder_eclient_schedule_del(disorder_eclient *c, disorder_eclient_no_response *completed, const char *event, void *v) {
@@ -280,11 +270,7 @@ int disorder_eclient_version(disorder_eclient *c, disorder_eclient_string_respon
 }
 
 int disorder_eclient_set_volume(disorder_eclient *c, disorder_eclient_no_response *completed, long left, long right, void *v) {
-  char buf_left[16];
-  byte_snprintf(buf_left, sizeof buf_left, "%ld", left);
-  char buf_right[16];
-  byte_snprintf(buf_right, sizeof buf_right, "%ld", right);
-  return simple(c, no_response_opcallback, (void (*)())completed, v, "volume", buf_left, buf_right, (char *)0);
+  return simple(c, no_response_opcallback, (void (*)())completed, v, "volume", disorder__integer, left, disorder__integer, right, (char *)0);
 }
 
 int disorder_eclient_get_volume(disorder_eclient *c, disorder_eclient_pair_integer_response *completed, void *v) {
index c253b06..d768f57 100644 (file)
@@ -888,6 +888,16 @@ static void vstash_command(disorder_eclient *c,
       } else if(arg == disorder__body) {
        body = va_arg(ap, char **);
        nbody = va_arg(ap, int);
+      } else if(arg == disorder__integer) {
+        long n = va_arg(ap, long);
+        char buffer[16];
+        snprintf(buffer, sizeof buffer, "%ld", n);
+        vector_append(&vec, xstrdup(buffer));
+      } else if(arg == disorder__time) {
+        time_t n = va_arg(ap, time_t);
+        char buffer[16];
+        snprintf(buffer, sizeof buffer, "%lld", (long long)n);
+        vector_append(&vec, xstrdup(buffer));
       } else
         vector_append(&vec, arg);
     }
index 2362f63..c7ef728 100755 (executable)
@@ -242,24 +242,16 @@ sub simple {
         $cmdc =~ s/-/_/g;
     }
     print STDERR "Processing $cmd... ";
-    # C argument types and conversions
+    # C argument types
     my @cargs = ();
-    my @conversions = ();
     for my $arg (@$args) {
         if($arg->[0] eq 'body' or $arg->[0] eq 'list') {
             push(@cargs, "disorder__$arg->[0]", $arg->[1], "n$arg->[1]");
         } elsif($arg->[0] eq 'string') {
             push(@cargs, $arg->[1]);
-        } elsif($arg->[0] eq 'integer') {
-            push(@cargs, "buf_$arg->[1]");
-            push(@conversions,
-                "  char buf_$arg->[1]\[16];\n",
-                 "  byte_snprintf(buf_$arg->[1], sizeof buf_$arg->[1], \"%ld\", $arg->[1]);\n");
-        } elsif($arg->[0] eq 'time') {
-            push(@cargs, "buf_$arg->[1]");
-            push(@conversions,
-                "  char buf_$arg->[1]\[16];\n",
-                 "  byte_snprintf(buf_$arg->[1], sizeof buf_$arg->[1], \"%lld\", (long long)$arg->[1]);\n");
+        } elsif($arg->[0] eq 'integer'
+               or $arg->[0] eq 'time') {
+            push(@cargs, "disorder__$arg->[0]", "$arg->[1]");
         } elsif($arg->[0] eq 'literal') {
             push(@cargs, "\"$arg->[1]\"");
         } else {
@@ -287,8 +279,7 @@ sub simple {
         join(", ", "disorder_client *c",
                    map(c_in_decl($_), @$args),
                     map(c_out_decl($_), @$returns)),
-        ") {\n",
-       @conversions);
+        ") {\n");
     if(!defined $returns or scalar @$returns == 0) {
         # Simple case
        push(@c, "  return disorder_simple(",
@@ -427,8 +418,7 @@ sub simple {
                  "disorder_eclient_$variant *completed",
                  map(c_in_decl($_), @$args),
                  "void *v"),
-            ") {\n",
-            @conversions);
+            ") {\n");
        push(@ac, "  return simple(",
             join(", ", 
                  "c",