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 11c17e265757022563f31070087cfc7ac6d0c76a..476117ce93fe524bcbd6027452ea510622430e9d 100644 (file)
@@ -74,11 +74,10 @@ socklen_t find_server(struct config *c,
   return len;
 }
 
   return len;
 }
 
-/** @brief Marker for a command body */
 const char disorder__body[1];
 const char disorder__body[1];
-
-/** @brief Marker for a list of args */
 const char disorder__list[1];
 const char disorder__list[1];
+const char disorder__integer[1];
+const char disorder__time[1];
 
 /*
 Local Variables:
 
 /*
 Local Variables:
index 3ad41986d2b39c2a7be620e917c34383b9c529e1..26db71564faf091e7011694698bc83570d7b11ad 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 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 */
 
 /*
 #endif /* CLIENT_COMMON_H */
 
 /*
index 1cc03eaf47a20f9ef68dd36c147e6ec88a9e0b7f..6aaa5595965f12bf1e8ae38c2a3fe6a3ad7e0ef8 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) {
 }
 
 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) {
 }
 
 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) {
 }
 
 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))
   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) {
 }
 
 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) {
 }
 
 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) {
 }
 
 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) {
 }
 
 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) {
 }
 
 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) {
 }
 
 int disorder_get_volume(disorder_client *c, long *leftp, long *rightp) {
index 6f08fecc5546e38118cefcf7f19b844a33dc1228..987ab01edaf07cde9d23e7e3fe9234cf397d20cc 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.
  *
  * 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()
  */
  * 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));
        }
          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));
       } else {
        dynstr_append(&d, ' ');
        dynstr_append_string(&d, quoteutf8(arg));
index fb48adee770b53a8310e1eca8c8ebeeec3e01605..b4e37d6e4087fd6fa1052d5c44aea3be9b721c2d 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) {
 }
 
 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) {
 }
 
 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) {
 }
 
 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) {
 }
 
 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) {
 }
 
 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) {
 }
 
 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) {
 }
 
 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) {
 }
 
 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) {
 }
 
 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) {
 }
 
 int disorder_eclient_get_volume(disorder_eclient *c, disorder_eclient_pair_integer_response *completed, void *v) {
index c253b06b880ddfb12ca49744240d2461da17e227..d768f57446bf1e4b906f875dc33b8906b8ecb03b 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__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);
     }
       } else
         vector_append(&vec, arg);
     }
index 2362f633831650a0ff1ce7369b4b24f1c9078017..c7ef72850cbb39163cecb103868bc41cddc87c33 100755 (executable)
@@ -242,24 +242,16 @@ sub simple {
         $cmdc =~ s/-/_/g;
     }
     print STDERR "Processing $cmd... ";
         $cmdc =~ s/-/_/g;
     }
     print STDERR "Processing $cmd... ";
-    # C argument types and conversions
+    # C argument types
     my @cargs = ();
     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]);
     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 {
         } 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)),
         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(",
     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"),
                  "disorder_eclient_$variant *completed",
                  map(c_in_decl($_), @$args),
                  "void *v"),
-            ") {\n",
-            @conversions);
+            ") {\n");
        push(@ac, "  return simple(",
             join(", ", 
                  "c",
        push(@ac, "  return simple(",
             join(", ", 
                  "c",