summaryrefslogtreecommitdiff
path: root/qa/src/write-bf.c
diff options
context:
space:
mode:
authorIgor Pashev <pashev.igor@gmail.com>2014-10-26 12:33:50 +0400
committerIgor Pashev <pashev.igor@gmail.com>2014-10-26 12:33:50 +0400
commit47e6e7c84f008a53061e661f31ae96629bc694ef (patch)
tree648a07f3b5b9d67ce19b0fd72e8caa1175c98f1a /qa/src/write-bf.c
downloadpcp-debian.tar.gz
Debian 3.9.10debian/3.9.10debian
Diffstat (limited to 'qa/src/write-bf.c')
-rw-r--r--qa/src/write-bf.c106
1 files changed, 106 insertions, 0 deletions
diff --git a/qa/src/write-bf.c b/qa/src/write-bf.c
new file mode 100644
index 0000000..8eff75f
--- /dev/null
+++ b/qa/src/write-bf.c
@@ -0,0 +1,106 @@
+#include <pcp/pmapi.h>
+#include <pcp/impl.h>
+
+typedef struct {
+ unsigned int a:16;
+ unsigned int b:7;
+ unsigned int c:3;
+ unsigned int d:3;
+ unsigned int e:3;
+ unsigned int f:4;
+ unsigned int g:12;
+} ext_bits_t;
+
+typedef struct {
+ unsigned int a:16;
+ unsigned int b:7;
+ unsigned int c:3;
+ unsigned int d:3;
+ unsigned int e:3;
+ unsigned int f:4;
+ unsigned int g:12;
+} bits_t;
+
+bits_t outbits = { 0xdead, 0x5f, 0x3, 0x5, 0x7, 0xc, 0xafe };
+
+int
+main(int argc, char *argv[])
+{
+ bits_t inbits;
+ ext_bits_t extbits;
+ __uint32_t *ip;
+ int i;
+ int sts;
+
+ fprintf(stderr, "sizeof(bits_t): %d\n", (int)sizeof(bits_t));
+
+ if (strcmp(basename(argv[0]), "read-bf") == 0) {
+ sts = read(0, &extbits, sizeof(ext_bits_t));
+ if (sts != sizeof(ext_bits_t)) {
+ fprintf(stderr, "read() returns %d not %d as expected\n", sts, (int)sizeof(ext_bits_t));
+ exit(1);
+ }
+
+ fprintf(stderr, "read: ");
+ for (i = 0, ip = (__uint32_t *)&extbits; i < sizeof(ext_bits_t); i += sizeof(*ip), ip++)
+ fprintf(stderr, " %08x", *ip);
+ fputc('\n', stderr);
+
+ /*
+ * swap bytes, then assign fields
+ */
+ for (i = 0, ip = (__uint32_t *)&extbits; i < sizeof(ext_bits_t); i += sizeof(*ip), ip++)
+ *ip = ntohl(*ip);
+
+ inbits.a = extbits.a;
+ inbits.b = extbits.b;
+ inbits.c = extbits.c;
+ inbits.d = extbits.d;
+ inbits.e = extbits.e;
+ inbits.f = extbits.f;
+ inbits.g = extbits.g;
+
+ if (inbits.a != outbits.a)
+ fprintf(stderr, "Error: \"a\" got %x expected %x\n", inbits.a, outbits.a);
+ if (inbits.b != outbits.b)
+ fprintf(stderr, "Error: \"b\" got %x expected %x\n", inbits.b, outbits.b);
+ if (inbits.c != outbits.c)
+ fprintf(stderr, "Error: \"c\" got %x expected %x\n", inbits.c, outbits.c);
+ if (inbits.d != outbits.d)
+ fprintf(stderr, "Error: \"d\" got %x expected %x\n", inbits.d, outbits.d);
+ if (inbits.e != outbits.e)
+ fprintf(stderr, "Error: \"e\" got %x expected %x\n", inbits.e, outbits.e);
+ if (inbits.f != outbits.f)
+ fprintf(stderr, "Error: \"f\" got %x expected %x\n", inbits.f, outbits.f);
+ if (inbits.g != outbits.g)
+ fprintf(stderr, "Error: \"g\" got %x expected %x\n", inbits.g, outbits.g);
+ }
+ else {
+ /*
+ * assign fields, then swap bytes
+ */
+ memset((void *)&extbits, 0, sizeof(ext_bits_t));
+ extbits.a = outbits.a;
+ extbits.b = outbits.b;
+ extbits.c = outbits.c;
+ extbits.d = outbits.d;
+ extbits.e = outbits.e;
+ extbits.f = outbits.f;
+ extbits.g = outbits.g;
+
+ for (i = 0, ip = (__uint32_t *)&extbits; i < sizeof(ext_bits_t); i += sizeof(*ip), ip++)
+ *ip = htonl(*ip);
+
+ fprintf(stderr, "write: ");
+ for (i = 0, ip = (__uint32_t *)&extbits; i < sizeof(ext_bits_t); i += sizeof(*ip), ip++)
+ fprintf(stderr, " %08x", *ip);
+ fputc('\n', stderr);
+
+ sts = write(1, &extbits, sizeof(bits_t));
+ if (sts != sizeof(bits_t)) {
+ fprintf(stderr, "write() returns %d not %d as expected\n", sts, (int)sizeof(bits_t));
+ exit(1);
+ }
+ }
+ exit(0);
+}