Chinaunix首页 | 论坛 | 博客

分类: LINUX

2011-10-02 21:26:40

191           c = X2DIGITS_TO_NUM (h[1], h[2]);/*____________----------->/src/wget.h*/
192           /* Don't unescape %00 because there is no way to insert it
193              into a C string without effectively truncating it.,不要丢掉%00的情况,因为无法插入c字符串无法有效截断它 */
194           if (c == '\0')
195             goto copychar;
196           *t = c; /*转化后赋值给指针指向的地方。
197           h += 2;
198         }
199     }
200   *t = '\0';
201 }

#define X2DIGITS_TO_NUM(h1, h2) ((XDIGIT_TO_NUM (h1) << 4) + XDIGIT_TO_NUM (h2))  
#define XDIGIT_TO_NUM(h) ((h) < 'A' ? (h) - '0' : c_toupper (h) - 'A' + 10)
/*此处判断%号后面如果不为NULL ,而且都为16 进制数的话,那么就进行宏定义的判断,将这些字符转化成十进制的ASCII码,后面加的是加10是转化到10-15之间的数,16进制a以上至少为10。*/
/*此处<<4因为是高四位*/
<---------------------____________________________
转化第一个字符串。返回到append_uri_pathel()
1393       b = unescaped;
1394       e = unescaped + strlen (unescaped);/*这是期望的那个字符串地址。
1399   if (e - b == 2 && b[0] == '.' && b[1] == '.')
1400     {
1401       b = "%2E%2E";
1402       e = b + 6;
1403     }   /*如果发现期望字符串和input字符串之间地址差二,而iput地址为b[0],b[1]那么就就上述那样,期望地址从b+6的地方开始,提防恶意输入*/
1407   quoted = 0;
1408   for (p = b; p < e; p++)
1409     if (FILE_CHAR_TEST (*p, mask))  /*遍历路径字符串,看看需要多少字符串1、_____------->url.c*/
1410       ++quoted;
1、______--------->
1300 #define FILE_CHAR_TEST(c, mask) \
1301     ((opt.restrict_files_nonascii && !c_isascii ((unsigned char)(c))) || \  /*这两个判断字符值是否大于127,上面这个式子非常妙,自己分析吧*/
1302     (filechr_table[(unsigned char)(c)] & (mask)))  /*mask 是前面的一系列赋值, filechr_table是数量为256个的表。如果c的值大于127那么会用两个8进制数据来表示或者当在filechar_table中命中,那么 此值为int类型。*/
1415   outlen = (e - b) + (2 * quoted);
1416   GROW (dest, outlen);
1417
1418   if (!quoted)
1419     {
1420       /* If there's nothing to quote, we can simply append the string
1421          without processing it again.  */
1422       memcpy (TAIL (dest), b, outlen);  /*如果没有要引用的,那么拷贝到dest的尾部*/
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++ = '%';                 /*否则用这种格式来来处理,再转化成字符原来16进制形式*/
1435               *q++ = XNUM_TO_DIGIT (ch >> 4);
1436               *q++ = XNUM_TO_DIGIT (ch & 0xf);
1437             }
1438         }
1439       assert (q - TAIL (dest) == outlen); /*断言是否相等*/
1440     }
1441
1442   /* Perform inline case transformation if required.  */
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 }

<------------------____________________
回到 test_append_uri_pathel()

2232       append_char ('\0', &dest);_________-------------->/src/url.c*/
2233
2234       mu_assert ("test_append_uri_pathel: wrong result",
2235                  strcmp (dest.base, test_array[i].expected_result) == 0); /*比较dest的字符串和期望的是否相同。不相等的话就打印出错误值
2236     }
________------------>
1287 append_char (char ch, struct growable *dest)
1288 {
1289   GROW (dest, 1);
1290   *TAIL (dest) = ch;
1291   TAIL_INCR (dest, 1);  /*给最后的字符串加\0*/
1292 }
阅读(561) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~