5 Author: Pekka Riikonen <priikone@silcnet.org>
7 Copyright (C) 2002 Pekka Riikonen
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; version 2 of the License.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
21 silc_argument_payload_parse
22 silc_argument_payload_encode
23 silc_argument_payload_encode_one
24 silc_argument_payload_encode_payload
25 silc_argument_payload_free
26 silc_argument_get_arg_num
27 silc_argument_get_arg_first_arg
28 silc_argument_get_arg_next_arg
29 silc_argument_get_arg_type
33 #include "silcargument.h"
37 int main(int argc, char **argv)
39 SilcArgumentPayload payload;
40 SilcBuffer args, args2;
41 char arg[ARG_NUM + 2];
43 unsigned char **argvv, *a;
44 SilcUInt32 *argvv_lens, l;
45 SilcUInt32 *argvv_types, t;
46 SilcBool success = FALSE;
48 if (argc > 1 && !strcmp(argv[1], "-d")) {
50 silc_debug_hexdump = 1;
51 silc_log_set_debug_string("*argument*");
54 SILC_LOG_DEBUG(("Encoding %d arguments", ARG_NUM));
55 argvv = silc_calloc(ARG_NUM, sizeof(unsigned char *));
56 argvv_lens = silc_calloc(ARG_NUM, sizeof(SilcUInt32));
57 argvv_types = silc_calloc(ARG_NUM, sizeof(SilcUInt32));
58 for (i = 0; i < ARG_NUM; i++) {
59 memset(arg, 0, sizeof(arg));
60 memset(arg, 'a', i + 1);
62 SILC_LOG_DEBUG(("Argument %d, len %d, type %d", i + 1,
64 SILC_LOG_HEXDUMP(("Argument data"), arg, strlen(arg));
66 argvv[i] = silc_memdup(arg, strlen(arg));
67 argvv_lens[i] = strlen(arg);
68 argvv_types[i] = i + 1;
70 args = silc_argument_payload_encode(ARG_NUM, argvv, argvv_lens, argvv_types);
73 SILC_LOG_DEBUG(("Encoding was successful"));
76 SILC_LOG_DEBUG(("Adding one extra argument"));
77 memset(arg, 0, sizeof(arg));
78 memset(arg, 'a', ARG_NUM + 1);
79 SILC_LOG_DEBUG(("Argument %d, len %d, type %d", ARG_NUM + 1,
80 strlen(arg), ARG_NUM + 1));
81 SILC_LOG_HEXDUMP(("Argument data"), arg, strlen(arg));
82 args = silc_argument_payload_encode_one(args, arg, strlen(arg),
86 SILC_LOG_DEBUG(("Adding one argument was successful"));
88 SILC_LOG_HEXDUMP(("Encoded payload"), args->data, args->len);
91 SILC_LOG_DEBUG(("Parsing the encoded payload"));
92 payload = silc_argument_payload_parse(args->data, args->len, ARG_NUM + 1);
95 SILC_LOG_DEBUG(("Parsing was successful"));
98 SILC_LOG_DEBUG(("Re-encoding the parsed payload"));
99 args2 = silc_argument_payload_encode_payload(payload);
102 if (args2->len != args->len ||
103 memcmp(args2->data, args->data, args->len)) {
104 SILC_LOG_DEBUG(("Re-encoding failed"));
107 silc_buffer_free(args2);
108 SILC_LOG_DEBUG(("Re-encoding was successful"));
111 SILC_LOG_DEBUG(("Checking number of arguments"));
112 SILC_LOG_DEBUG(("Number of arguments: %d (expecting %d)",
113 silc_argument_get_arg_num(payload), ARG_NUM + 1));
114 if (silc_argument_get_arg_num(payload) != ARG_NUM + 1)
118 SILC_LOG_DEBUG(("Traversing the parsed arguments"));
120 a = silc_argument_get_first_arg(payload, &t, &l);
121 if (!a || t != argvv_types[0] || l != argvv_lens[0] ||
122 memcmp(a, argvv[0], l)) {
123 SILC_LOG_DEBUG(("First argument failed"));
127 if (i + 1 == ARG_NUM + 1) {
128 SILC_LOG_DEBUG(("Argument %d, len %d (expected %d), "
129 "type %d (expected %d)", i + 1, l, strlen(arg),
131 if (!a || t != ARG_NUM + 1 || l != strlen(arg) ||
133 SILC_LOG_DEBUG(("Argument %d failed", ARG_NUM + 1));
137 SILC_LOG_DEBUG(("Argument %d, len %d (expected %d), "
138 "type %d (expected %d)", i + 1, l, argvv_lens[i],
140 if (!a || t != argvv_types[i] || l != argvv_lens[i] ||
141 memcmp(a, argvv[i], l)) {
142 SILC_LOG_DEBUG(("Argument %d failed", i + 1));
146 a = silc_argument_get_next_arg(payload, &t, &l);
149 if (i != ARG_NUM + 1) {
150 SILC_LOG_DEBUG(("All arguments was not parsed, missing %d args",
154 SILC_LOG_DEBUG(("Traversing successful"));
157 SILC_LOG_DEBUG(("Traversing arguments by type"));
158 for (i = 0; i < ARG_NUM + 1; i++) {
159 a = silc_argument_get_arg_type(payload, i + 1, &l);
160 if (i + 1 == ARG_NUM + 1) {
161 if (!a || t != ARG_NUM + 1 || l != strlen(arg) ||
163 SILC_LOG_DEBUG(("Argument %d failed", ARG_NUM + 1));
167 if (!a || l != argvv_lens[i] || memcmp(a, argvv[i], l)) {
168 SILC_LOG_DEBUG(("Argument %d failed", i + 1));
173 SILC_LOG_DEBUG(("Traversing successful"));
178 silc_argument_payload_free(payload);
179 for (i = 0; i < ARG_NUM; i++)
182 silc_free(argvv_lens);
183 silc_free(argvv_types);
184 silc_buffer_free(args);
186 SILC_LOG_DEBUG(("Testing was %s", success ? "SUCCESS" : "FAILURE"));
187 fprintf(stderr, "Testing was %s\n", success ? "SUCCESS" : "FAILURE");