- 论坛徽章:
- 0
|
本帖最后由 wangzhen11aaa 于 2011-10-02 16:40 编辑
<---------_______________
关于test_path_simplify()这个函数是将路径化简为最有效并且等价的路径。也是为了减少运输的数据量,具体的各个模式化简方式以后讨论。
all_tests()
{
. . . . . .
mu_run_test(test_append_uri_pathel); /*1、_______________----------->/usr/url.c*/
. . . . . .
}
1、_______________-------------->
const char *test_append_uri_pathel()
{
2212 {
2213 int i;
2214 struct {
2215 char *original_url;
2216 char *input;
2217 bool escaped;
2218 char *expected_result;
2219 } test_array[] = {
2220 { "http://www.yoyodyne.com/path/", "somepage.html", false, "http://www.yoyodyne.com/path/somepage.html" },
2221 };
2222 /*这里就检测一个url路径*/
2223 for (i = 0; i < sizeof(test_array)/sizeof(test_array[0]); ++i)
2224 {
2225 struct growable dest; /* 此和4的一样*/
2226 const char *p = test_array.input;
2227
2228 memset (&dest, 0, sizeof (dest)); /*这个lib库的函数*/
2229
2230 append_string (test_array.original_url, &dest); /*2、_____________------------>/src/url.c*/
2231 append_uri_pathel (p, p + strlen(p), test_array.escaped, &dest); /*3、___________---------->*/
2232 append_char ('\0', &dest);
2233
2234 mu_assert ("test_append_uri_pathel: wrong result",
2235 strcmp (dest.base, test_array.expected_result) == 0);
2236 }
2237
2238 return NULL;
2239 }
2、_____________---------------->
1274 static void
1275 append_string (const char *str, struct growable *dest)
1276 {
1277 int l = strlen (str); /*获得字符串长度*/
1278 GROW (dest, l);/*3、___________________------------->/src/url.c*/
1279 memcpy (TAIL (dest), str, l);/*7、_______------------>/src/url.c虽然分配了空间,但是还没有赋值所以末尾值还是0*/
1280 TAIL_INCR (dest, l); /*8、___________------------->/src/url.c,改变tail 的值*/
1281 }
3、___________________------------------->
1260 #define GROW(g, append_size) do { \
1261 struct growable *G_ = g; /*4、___________------------> /src/url.c*/ \
1262 DO_REALLOC (G_->base, G_->size, G_->tail + append_size, char); /*5 、____----> \
1263 } while (0)
4、______________------------->
struct growable{
char *base;
int size; /*初始化是这些值都是0*/
int tail;
}
5、_______________------------------->
#define DO_REALLOC(basevar, sizevar, needed_size, type) do{
299 long DR_needed_size = (needed_size); /*这里是一个式子*/ \
300 long DR_newsize = 0; \
301 while ((sizevar) < (DR_needed_size)) { \
302 DR_newsize = sizevar << 1; /* 分配的大小是2^n,至少16个字节*/ \
303 if (DR_newsize < 16) \
304 DR_newsize = 16; \
305 (sizevar) = DR_newsize; \
306 } \
307 if (DR_newsize) \
308 basevar = xrealloc (basevar, DR_newsize * sizeof (type)); /*分配大小,这里出现了c++的类和c,当然我选择的是c6、____---------->lib/xmalloc.c*/ /*type 本来就是char 类型,为什么还要sizeof(type)?我觉得为了少出人为的错*/\
309 } while (0)
310
6、_______-------------->
52 void *
53 xrealloc (void *p, size_t n)
54 {
55 if (!n && p)
56 {
57
59 free (p);
60 return NULL;
61 }
62
63 p = realloc (p, n); /*分配在这里*/
64 if (!p && n)
65 xalloc_die (); /*abort()*/
66 return p;
67 }
<---------------------------____________________________
GROW调用后,dest被初始化,类型中既有地址,而且有大小*/
7、_______________---------------->
#define TAIL(r) ((r)->base + (r)->tail)
8、_______------------>
#define #define TAIL_INCR(r, append_count) ((r)->tail += append_count)
<------------------------------------______________________________________________
返回到 mu_run_test(test_append_uri_pathel()函数中
append_uri_pathel() _________----------->9、/src/url.c*/
1372 static void
1373 append_uri_pathel (const char *b, const char *e, bool escaped,
1374 struct growable *dest)
1375 {
1376 const char *p;
1377 int quoted, outlen;
1378
1379 int mask;
1380 if (opt.restrict_files_os == restrict_unix)
1381 mask = filechr_not_unix; /*判断unix类型*/
1382 else
1383 mask = filechr_not_windows;
1384 if (opt.restrict_files_ctrl)
1385 mask |= filechr_control;
1386
1387
1388 if (escaped) /*如果期望值是1*/
1389 {
1390 char *unescaped;
1391 BOUNDED_TO_ALLOCA (b, e, unescaped);/*10、______------->/src/wget.h*/
1392 url_unescape (unescaped);
1393 b = unescaped;
1394 e = unescaped + strlen (unescaped);
1395 }
1396
1397
1398
1399 if (e - b == 2 && b[0] == '.' && b[1] == '.')
1400 {
1401 b = "%2E%2E";
1402 e = b + 6;
1403 }
1404
1407 quoted = 0;
1408 for (p = b; p < e; p++)
1409 if (FILE_CHAR_TEST (*p, mask))
1410 ++quoted;
1411
1412 /* Calculate the length of the output string. e-b is the input
1413 string length. Each quoted char introduces two additional
1414 characters in the string, hence 2*quoted. */
1415 outlen = (e - b) + (2 * quoted);
1416 GROW (dest, outlen);
1417
1418 if (!quoted)
1419 {
1420
1421
1422 memcpy (TAIL (dest), b, outlen);
1423 }
1424 else
1425 {
1426 char *q = TAIL (dest);
1427 for (p = b; p < e; p++)
1428 {
1429 if (!FILE_CHAR_TEST (*p, mask))
1430 *q++ = *p;
1431 else
1432 {
1433 unsigned char ch = *p;
1434 *q++ = '%';
1435 *q++ = XNUM_TO_DIGIT (ch >> 4);
1436 *q++ = XNUM_TO_DIGIT (ch & 0xf);
1437 }
1438 }
1439 assert (q - TAIL (dest) == outlen);
1440 }
1443 if (opt.restrict_files_case == restrict_lowercase
1444 || opt.restrict_files_case == restrict_uppercase)
1445 {
1446 char *q;
1447 for (q = TAIL (dest); q < TAIL (dest) + outlen; ++q)
1448 {
1449 if (opt.restrict_files_case == restrict_lowercase)
1450 *q = c_tolower (*q);
1451 else
1452 *q = c_toupper (*q);
1453 }
1454 }
1455
1456 TAIL_INCR (dest, outlen);
1457 }
10、____________------------>
#define BOUNDED_TO_ALLOC(beg, end, place) \
要装不下了。下移*/ |
|