pack.c
来自「GNet是一个简单的网络库。它是目标定向的」· C语言 代码 · 共 347 行
C
347 行
/* Gnet-Pack test * Copyright (C) 2000, 2002 David Helder * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */#include <glib.h>#include <stdio.h>#include <stdlib.h>#include <gnet.h>static int failed = 0;void test_bytes (int test_num, char* s /* binary */, int len, char* answer /* ascii */);#define TEST0(NUM, ANSWER, FORMAT, SIZE) do { \ gnet_pack (FORMAT, buffer, SIZE); \ test_bytes (NUM, buffer, SIZE, ANSWER); \ len = gnet_pack_strdup (FORMAT, &str); \ test_bytes (NUM+1, buffer, SIZE, ANSWER); \ g_free (str); } while (0)#define TEST1(NUM, ANSWER, FORMAT, SIZE, ARG1) do { \ gnet_pack (FORMAT, buffer, SIZE, ARG1); \ test_bytes (NUM, buffer, SIZE, ANSWER); \ len = gnet_pack_strdup (FORMAT, &str, ARG1); \ test_bytes (NUM+1, buffer, SIZE, ANSWER); \ g_free (str); } while (0)#define TEST2(NUM, ANSWER, FORMAT, SIZE, ARG1, ARG2) do { \ gnet_pack (FORMAT, buffer, SIZE, ARG1, ARG2); \ test_bytes (NUM, buffer, SIZE, ANSWER); \ len = gnet_pack_strdup (FORMAT, &str, ARG1, ARG2); \ test_bytes (NUM+1, buffer, SIZE, ANSWER); \ g_free (str); } while (0)#define TEST3(NUM, ANSWER, FORMAT, SIZE, ARG1, ARG2, ARG3) do { \ gnet_pack (FORMAT, buffer, SIZE, ARG1, ARG2, ARG3); \ test_bytes (NUM, buffer, SIZE, ANSWER); \ len = gnet_pack_strdup (FORMAT, &str, ARG1, ARG2, ARG3); \ test_bytes (NUM+1, buffer, SIZE, ANSWER); \ g_free (str); } while (0)#define TEST4(NUM, ANSWER, FORMAT, SIZE, ARG1, ARG2, ARG3, ARG4) do { \ gnet_pack (FORMAT, buffer, SIZE, ARG1, ARG2, ARG3, ARG4); \ test_bytes (NUM, buffer, SIZE, ANSWER); \ len = gnet_pack_strdup (FORMAT, &str, ARG1, ARG2, ARG3, ARG4); \ test_bytes (NUM+1, buffer, SIZE, ANSWER); \ g_free (str); } while (0)#define MEMTEST1(NUM, FORMAT, SIZE, ARG1) do { \ gnet_pack (FORMAT, buffer, SIZE, ARG1); \ len = gnet_pack_strdup (FORMAT, &str, ARG1); \ g_free (str); } while (0)intmain(int argc, char** argv){ char buffer[1024]; char* str; int len; gnet_init (); /* **************************************** */ /* NATIVE */ TEST0 (10100, "00", "x", 1); TEST1 (10200, "17", "b", 1, 0x17); TEST1 (10210, "f1", "b", 1, 0xf1); TEST1 (10300, "17", "B", 1, 0x17); TEST1 (10310, "f1", "B", 1, 0xf1);#if (G_BYTE_ORDER == G_LITTLE_ENDIAN) /* NATIVE LITTLE ENDIAN */ TEST1 (10400, "0201", "h", sizeof(short), 0x0102); TEST1 (10410, "01f0", "h", sizeof(short), 0xf001); TEST1 (10420, "f001", "h", sizeof(short), 0x01f0); TEST1 (10500, "0201", "H", sizeof(short), 0x0102); TEST1 (10510, "01f0", "H", sizeof(short), 0xf001); TEST1 (10520, "f001", "H", sizeof(short), 0x01f0); TEST1 (10600, "04030201", "i", sizeof(int), 0x01020304); TEST1 (10610, "040302f1", "i", sizeof(int), 0xf1020304); TEST1 (10620, "f4030201", "i", sizeof(int), 0x010203f4); TEST1 (10700, "04030201", "I", sizeof(int), 0x01020304); TEST1 (10710, "040302f1", "I", sizeof(int), 0xf1020304); TEST1 (10720, "f4030201", "I", sizeof(int), 0x010203f4); TEST1 (10800, "04030201", "l", sizeof(int), 0x01020304); TEST1 (10810, "040302f1", "l", sizeof(int), 0xf1020304); TEST1 (10820, "f4030201", "l", sizeof(int), 0x010203f4); TEST1 (10900, "04030201", "L", sizeof(int), 0x01020304); TEST1 (10910, "040302f1", "L", sizeof(int), 0xf1020304); TEST1 (10920, "f4030201", "L", sizeof(int), 0x010203f4); if (sizeof(void*) == 4) { TEST1 (11100, "04030201", "v", sizeof(void*), (void*) 0x01020304); TEST1 (11110, "040302f1", "v", sizeof(void*), (void*) 0xf1020304); TEST1 (11120, "f4030201", "v", sizeof(void*), (void*) 0x010203f4); } TEST3 (11200, "00010002", "bhb", 4, 0x00, 0x0001, 0x02); TEST2 (11210, "0403020108070605", "ii", 8, 0x01020304, 0x05060708); TEST2 (11220, "0403020108070605", "2i", 8, 0x01020304, 0x05060708);#else /* NATIVE BIG ENDIAN */ TEST1 (10400, "0102", "h", sizeof(short), 0x0102); TEST1 (10410, "f001", "h", sizeof(short), 0xf001); TEST1 (10420, "01f0", "h", sizeof(short), 0x01f0); TEST1 (10500, "0102", "H", sizeof(short), 0x0102); TEST1 (10510, "f001", "H", sizeof(short), 0xf001); TEST1 (10520, "01f0", "H", sizeof(short), 0x01f0); TEST1 (10600, "01020304", "i", sizeof(int), 0x01020304); TEST1 (10610, "f1020304", "i", sizeof(int), 0xf1020304); TEST1 (10620, "010203f4", "i", sizeof(int), 0x010203f4); TEST1 (10700, "01020304", "I", sizeof(int), 0x01020304); TEST1 (10710, "f1020304", "I", sizeof(int), 0xf1020304); TEST1 (10720, "010203f4", "I", sizeof(int), 0x010203f4); TEST1 (10800, "01020304", "l", sizeof(int), 0x01020304); TEST1 (10810, "f1020304", "l", sizeof(int), 0xf1020304); TEST1 (10820, "010203f4", "l", sizeof(int), 0x010203f4); TEST1 (10900, "01020304", "L", sizeof(int), 0x01020304); TEST1 (10910, "f1020304", "L", sizeof(int), 0xf1020304); TEST1 (10920, "010203f4", "L", sizeof(int), 0x010203f4); if (sizeof(void*) == 4) { TEST1 (11100, "01020304", "v", sizeof(void*), (void*) 0x01020304); TEST1 (11110, "01020304", "v", sizeof(void*), (void*) 0xf1020304); TEST1 (11120, "01020304", "v", sizeof(void*), (void*) 0x010203f4); } TEST3 (11200, "00000102", "bhb", 4, 0x00, 0x0001, 0x02); TEST2 (11201, "0102030405060708", "ii", 8, 0x01020304, 0x05060708); TEST2 (11202, "0102030405060708", "2i", 8, 0x01020304, 0x05060708);#endif MEMTEST1 (11000, "f", sizeof(float), 23.43); MEMTEST1 (11010, "d", sizeof(double), 43.21); /* **************************************** */ /* LITTLE ENDIAN */ TEST0 (20100, "00", "<x", 1); TEST1 (20200, "17", "<b", 1, 0x17); TEST1 (20210, "f1", "<b", 1, 0xf1); TEST1 (20300, "17", "<B", 1, 0x17); TEST1 (20310, "f1", "<B", 1, 0xf1); TEST1 (20400, "0201", "<h", 2, 0x0102); TEST1 (20410, "01f0", "<h", 2, 0xf001); TEST1 (20420, "f001", "<h", 2, 0x01f0); TEST1 (20500, "0201", "<H", 2, 0x0102); TEST1 (20510, "01f0", "<H", 2, 0xf001); TEST1 (20520, "f001", "<H", 2, 0x01f0); TEST1 (20600, "04030201", "<i", 4, 0x01020304); TEST1 (20610, "040302f1", "<i", 4, 0xf1020304); TEST1 (20620, "f4030201", "<i", 4, 0x010203f4); TEST1 (20700, "04030201", "<I", 4, 0x01020304); TEST1 (20710, "040302f1", "<I", 4, 0xf1020304); TEST1 (20720, "f4030201", "<I", 4, 0x010203f4); TEST1 (20800, "04030201", "<l", 4, 0x01020304); TEST1 (20810, "040302f1", "<l", 4, 0xf1020304); TEST1 (20820, "f4030201", "<l", 4, 0x010203f4); TEST1 (20900, "04030201", "<L", 4, 0x01020304); TEST1 (20910, "040302f1", "<L", 4, 0xf1020304); TEST1 (20920, "f4030201", "<L", 4, 0x010203f4); MEMTEST1 (21000, "<f", sizeof(float), 23.43); MEMTEST1 (21010, "<d", sizeof(double), 43.21); TEST3 (21100, "00010002", "<bhb", 4, 0x00, 0x0001, 0x02); TEST2 (21110, "0403020108070605", "<ii", 8, 0x01020304, 0x05060708); TEST2 (21120, "0403020108070605", "<2i", 8, 0x01020304, 0x05060708); /* **************************************** */ /* BIG ENDIAN */ TEST0 (30100, "00", ">x", 1); TEST1 (30200, "17", ">b", 1, 0x17); TEST1 (30210, "f1", ">b", 1, 0xf1); TEST1 (30300, "17", ">B", 1, 0x17); TEST1 (30310, "f1", ">B", 1, 0xf1); TEST1 (30400, "0102", ">h", 2, 0x0102); TEST1 (30410, "f001", ">h", 2, 0xf001); TEST1 (30420, "01f0", ">h", 2, 0x01f0); TEST1 (30500, "0102", ">H", 2, 0x0102); TEST1 (30510, "f001", ">H", 2, 0xf001); TEST1 (30520, "01f0", ">H", 2, 0x01f0); TEST1 (30600, "01020304", ">i", 4, 0x01020304); TEST1 (30610, "f1020304", ">i", 4, 0xf1020304); TEST1 (30620, "010203f4", ">i", 4, 0x010203f4); TEST1 (30700, "01020304", ">I", 4, 0x01020304); TEST1 (30710, "f1020304", ">I", 4, 0xf1020304); TEST1 (30720, "010203f4", ">I", 4, 0x010203f4); TEST1 (30800, "01020304", ">l", 4, 0x01020304); TEST1 (30810, "f1020304", ">l", 4, 0xf1020304); TEST1 (30820, "010203f4", ">l", 4, 0x010203f4); TEST1 (30900, "01020304", ">L", 4, 0x01020304); TEST1 (30910, "f1020304", ">L", 4, 0xf1020304); TEST1 (30920, "010203f4", ">L", 4, 0x010203f4); MEMTEST1 (31000, ">f", sizeof(float), 23.43); MEMTEST1 (31010, ">d", sizeof(double), 43.21); TEST3 (31200, "00000102", ">bhb", 4, 0x00, 0x0001, 0x02); TEST2 (31210, "0102030405060708", ">ii", 8, 0x01020304, 0x05060708); TEST2 (31220, "0102030405060708", ">2i", 8, 0x01020304, 0x05060708); /* **************************************** */ /* STRINGS */ TEST2 (40000, "68656c6c6f00746865726500", "ss", 12, "hello", "there"); TEST2 (40010, "74686572650068656c6c6f00", "2s", 12, "there", "hello"); TEST1 (40020, "626f6f676572000000000000", "12S", 12, "booger"); TEST1 (40030, "64617669", "4S", 4, "david"); TEST1 (40040, "68656c646572", "6S", 6, "helder"); TEST2 (40050, "64636261", "r", 4, "dcba", 4); TEST4 (40060, "6162636465666768", "2r", 8, "abcd", 4, "efgh", 4); TEST1 (40070, "64636261", "4R", 4, "dcba"); TEST2 (40080, "6566676861626364", "4R4R", 8, "efgh", "abcd"); TEST1 (40090, "0461626364", "p", 5, "abcd"); TEST2 (40100, "04656667680461626364", "2p", 10, "efgh", "abcd"); /* **************************************** */ /* FAILURES (these cause gnet warnings) */#if 0 gnet_pack ("b", buffer, 0, 0); gnet_pack ("B", buffer, 0, 0); gnet_pack ("h", buffer, sizeof(short) - 1, 0); gnet_pack ("H", buffer, sizeof(unsigned short) - 1, 0); gnet_pack ("i", buffer, sizeof(int) - 1, 0); gnet_pack ("I", buffer, sizeof(unsigned int) - 1, 0); gnet_pack ("l", buffer, sizeof(long) - 1, 0); gnet_pack ("L", buffer, sizeof(unsigned long) - 1, 0); gnet_pack ("f", buffer, sizeof(float) - 1, 0); gnet_pack ("d", buffer, sizeof(double) - 1, 0); gnet_pack ("s", buffer, 5, "hello"); gnet_pack ("ss", buffer, 11, "hello", "world"); gnet_pack ("12S", buffer, 11, "booger"); gnet_pack ("4S", buffer, 3, "david"); gnet_pack ("6S", buffer, 5, "helder"); gnet_pack ("2r", buffer, 7, "abcd", 4, "efgh", 4); gnet_pack ("4R", buffer, 3, "dcba"); gnet_pack ("4R4R", buffer, 7, "efgh", "abcd"); gnet_pack ("p", buffer, 4, "abcd"); gnet_pack ("2p", buffer, 9, "efgh", "abcd");#endif /* **************************************** */ if (failed) {/* fprintf (stderr, "FAIL\n"); */ exit (1); }/* fprintf (stderr, "PASS\n"); */ exit (0); return 0;}static gchar bits2hex[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };voidtest_bytes (int test_num, char* s /* binary */, int len, char* answer /* ascii */){ int i; for (i = 0; i < len; ++i) { if (!answer[2 * i] || !answer[(2 * i) + 1] || (bits2hex[(s[i] & 0xf0) >> 4] != answer[2 * i]) || (bits2hex[(s[i] & 0xf) ] != answer[(2 * i) + 1])) { int j; fprintf (stderr, "FAILURE: test #%d at byte %d\n", test_num, i); fprintf (stderr, "\toutput : "); for (j = 0; j < len; ++j) fprintf (stderr, "%c%c", bits2hex[(s[j] & 0xf0) >> 4], bits2hex[s[j] & 0xf]); fprintf (stderr, "\n\tshould be: %s\n", answer); failed = 1; } }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?