2 * Copyright (c) 2006 Sendmail, Inc. and its suppliers.
5 * By using this file, you agree to the terms and conditions set
6 * forth in the LICENSE file which can be found at the top level of
7 * the sendmail distribution.
11 SM_IDSTR(id
, "@(#)$Id: t-qic.c,v 1.9 2006/08/24 21:26:13 ca Exp $")
14 #include <sm/sendmail.h>
15 #include <sm/assert.h>
17 #include <sm/string.h>
20 extern bool SmTestVerbose
;
30 for (i
= 0; s1
[i
] != '\0' && s2
[i
] != '\0'; i
++)
34 fprintf(stderr
, "i=%d, s1[]=%u, s2[]=%u\n",
35 i
, (unsigned char) s1
[i
],
36 (unsigned char) s2
[i
]);
42 fprintf(stderr
, "i=%d, s1[]=%u, s2[]=%u\n",
43 i
, (unsigned char) s1
[i
], (unsigned char) s2
[i
]);
47 char *quote_unquote
__P((char *, char *, int, int));
50 quote_unquote(in
, out
, outlen
, exp
)
61 sm_strlcpy(line_in
, in
, sizeof(line_in
));
62 obp
= quote_internal_chars(in
, out
, &outlen
);
63 bp
= str2prt(line_in
);
64 dequote_internal_chars(obp
, line_back
, sizeof(line_back
));
65 cmp
= strcmp(line_in
, line_back
);
67 if (cmp
!= exp
&& !SmTestVerbose
)
69 fprintf(stderr
, "in: %s\n", bp
);
70 bp
= str2prt(line_back
);
71 fprintf(stderr
, "out:%s\n", bp
);
72 fprintf(stderr
, "cmp=%d\n", cmp
);
73 show_diff(in
, line_back
);
77 fprintf(stderr
, "%s -> ", bp
);
79 fprintf(stderr
, "%s\n", bp
);
80 fprintf(stderr
, "cmp=%d\n", cmp
);
92 typedef struct sm_qic_S sm_qic_T
;
100 char line_in
[1024], line
[256], line_out
[32], *obp
;
104 , { "abcdef", "abcdef", 0 }
105 , { "01234567890123456789", "01234567890123456789", 0 }
106 , { "01234567890123456789\001", "01234567890123456789\001",
108 , { "012345\2067890123456789", "012345\377\2067890123456789",
110 , { "\377", "\377\377", 0 }
111 , { "\240", "\240", 0 }
112 , { "\220", "\377\220", 0 }
113 , { "\240\220", "\240\377\220", 0 }
114 , { "\377\377", "\377\377\377\377", 0 }
115 , { "\377a\377b", "\377\377a\377\377b", 0 }
116 , { "\376a\377b", "\376a\377\377b", 0 }
117 , { "\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240",
118 "\377\200\377\201\377\202\377\203\377\204\377\205\377\206\377\207\377\210\377\211\377\212\377\213\377\214\377\215\377\216\377\217\377\220\377\221\377\222\377\223\377\224\377\225\377\226\377\227\377\230\377\231\377\232\377\233\377\234\377\235\377\236\377\237\240",
123 sm_test_begin(argc
, argv
, "test meta quoting");
124 for (i
= 0; i
< sizeof(line_out
); i
++)
126 for (i
= 0; i
< sizeof(line_in
); i
++)
128 for (i
= 0; i
< sizeof(line_in
) / 2; i
++)
137 los
= sizeof(line_out
) / 2;
138 obp
= quote_unquote(line_in
, line_out
, los
, 0);
142 for (i
= 0; i
< sizeof(line_in
); i
++)
144 for (i
= 0; i
< sizeof(line_in
) / 2; i
++)
153 los
= sizeof(line_in
);
154 obp
= quote_unquote(line_in
, line_in
, los
, 0);
158 for (i
= 0; inout
[i
].qic_in
!= NULL
; i
++)
160 los
= sizeof(line_out
) / 2;
161 obp
= quote_unquote(inout
[i
].qic_in
, line_out
, los
,
163 cmp
= strcmp(inout
[i
].qic_out
, obp
);
164 SM_TEST(inout
[i
].qic_exp
== cmp
);
165 if (inout
[i
].qic_exp
!= cmp
&& !SmTestVerbose
)
170 fprintf(stderr
, "got: %s\n", bp
);
171 bp
= str2prt(inout
[i
].qic_out
);
172 fprintf(stderr
, "exp:%s\n", bp
);
173 fprintf(stderr
, "cmp=%d\n", cmp
);
174 show_diff(inout
[i
].qic_in
, inout
[i
].qic_out
);
180 /* use same buffer for in and out */
181 for (i
= 0; inout
[i
].qic_in
!= NULL
; i
++)
185 same
= strcmp(inout
[i
].qic_in
, inout
[i
].qic_out
) == 0;
186 los
= sm_strlcpy(line
, inout
[i
].qic_in
, sizeof(line
));
187 SM_TEST(los
+ 1 < sizeof(line
));
189 obp
= quote_unquote(line
, line
, los
, inout
[i
].qic_exp
);
190 cmp
= strcmp(inout
[i
].qic_out
, obp
);
191 SM_TEST(inout
[i
].qic_exp
== cmp
);
192 if (inout
[i
].qic_exp
!= cmp
&& !SmTestVerbose
)
197 fprintf(stderr
, "got: %s\n", bp
);
198 bp
= str2prt(inout
[i
].qic_out
);
199 fprintf(stderr
, "exp:%s\n", bp
);
200 fprintf(stderr
, "cmp=%d\n", cmp
);
201 show_diff(inout
[i
].qic_in
, inout
[i
].qic_out
);
207 show_diff(obp
, inout
[i
].qic_out
);
212 /* use NULL buffer for out */
213 for (i
= 0; inout
[i
].qic_in
!= NULL
; i
++)
216 obp
= quote_unquote(inout
[i
].qic_in
, NULL
, los
,
218 SM_TEST(obp
!= NULL
);
219 cmp
= strcmp(inout
[i
].qic_out
, obp
);
220 SM_TEST(inout
[i
].qic_exp
== cmp
);
221 if (inout
[i
].qic_exp
!= cmp
&& !SmTestVerbose
)
226 fprintf(stderr
, "got: %s\n", bp
);
227 bp
= str2prt(inout
[i
].qic_out
);
228 fprintf(stderr
, "exp:%s\n", bp
);
229 fprintf(stderr
, "cmp=%d\n", cmp
);
230 show_diff(inout
[i
].qic_in
, inout
[i
].qic_out
);
234 return sm_test_end();