使用者:Antigng-bot/infobox

<source lang="c"> char *detect[]={"imagename","width","job","birthname","dateofbirth","placeofbirth","dateofdeath","placeofdeath","languages","educate","award"}; char *replace[]={"image","box_width","occupation","birth_name","birth_date","birth_place","death_date","death_place","language","education","awards"}; int judge(char *n) {

  char *name;
  int i,j;
  i=0;j=0;length=0;
  name=(char *)calloc(strlen(n)+2,1);
 /*
  我们首先除去所有的空格
 */
  while(n[i])
  {
     if(n[i]&&n[i]!=' '&&n[i]!='\n'&&n[i]!='-'&&n[i]!='|') 

{ name[j]=n[i];j++; } i++;

  }
  name[j]=0;
 /*
  朴素的模式匹配
  */
  for(i=0;i<sizeof(detect)/sizeof(char *);i++)
  {
      length=strlen(detect[i);
     for(j=0;j<length;j++)

{ if(name[j]!=detect[i][j]) break; } if(j==length) { free(name); return i; } } free(name);

return -1; }


int proceedchild(char *title) {

   struct template

{ int flag; char *name; char *value; struct template *next; int eq; } *cite,*pre,*cur,*tail;

     /*
     模板存储在以上的结构构成的单链表中,变量cite(链表头),pre(先前的位置),cur(当前位置),tail(链表尾)
     flag代表参数的值,如果是平凡的(如name,不需要转换),则置位-1,反之,则置为一个大于等于0的数,由judge函数返回
     name是参数名,value是参数值
     next是下一个节点
     */
       HTTP f,g;
     /*
       f,g是两个可变长的数组,f存储从http服务器返回的所有内容(包括响应头);g存储修改后的新页面
     */

int i=0,j=0,k=0,flag=0,status=0,todo=0,div=0,mark=0,perr=0,effect=0,done=1,idone=1,bra=0,ready=0,comment=0,eq=0,tag=0,rcl=0; char c[5000],name[500],value[10000],errmsg[10000],record[100];

      /*
        字符数组c用于存储页面的URL,不会超过5000字节的;name,value用于存储模板参数名和参数值;errmsg是分析模板过程中产生的错误信心;record在匹配模板时用到,rcl是它   的长度*/

char ch,cht,chet;

      /*
         从f中取来的字符存在ch,cht是ch之前的一个字符,chet是ch之前的一个非' '非'\n'字符
      */

const char *match="infobox_people",*MATCH="INFOBOX PEOPLE";

      /*
         匹配infobox_people,INFOBOX PEOPLE模板
       */

const int length=strlen(match);

       /*
           match的长度
       */

struct neditargv point,source;

      /*
           这两个变量现在不用,等将来需要提交编辑了再用
         */

strcpy(c,"https://zh.wikipedia.org/w/index.php?action=raw&title=");

strcat(c,title);

f=hopen(); if(get(c,0,f)) { hclose(f);

return -5; } /*

            从服务器获取页面,如果失败,直接返回
          */

flag=0; while(!heof(f))

   {
 	  ch=hgetc(f);
 
 	  if(ch=='\r')
 	  {
 	  	if(flag==0) flag=1;
 	  	 else if(flag==2) flag=3;
 	  	

}

if(ch=='\n') { if(flag==1) flag=2; else if(flag==3) { flag=4; break; } } if(ch!='\n'&&ch!='\r') flag=0; } if(flag!=4) {


hclose(f); return -1; } /*

          找\r\n\r\n去除响应头,如果响应头后面无内容,直接返回
        */
 status=0;todo=0;div=0;cite=0;pre=0;i=0;j=0;name[0]=0;value[0]=0;perr=0;mark=-2;comment=0;eq=0;tag=0;
 g=hopen();
 cht=ch;
 if(ch!=' '&&ch!='\n') chet=ch;
     ch=hgetc(f);


 while(!heof(f))
 {
     

if(perr==2&&bra==0&&chet=='}'&&ch!='}') { strcat(errmsg,"-->"); k=0; while(errmsg[k]) { if(showerr) smartURLEncode(errmsg[k],g); k++; } perr=0; errmsg[0]=0; }

          /*
               在第三种模式下,选取合适的位置以注释的形式加入错误信息
           */

if(status<length) { if(((!status&&chet=='{')||status)&&(ch==match[status]||ch==MATCH[status])) { status++; record[rcl]=ch; rcl++; record[rcl]=0; } else { status=0; if(rcl) { for(i=0;i<rcl;i++) { smartURLEncode(record[i],g); } } rcl=0; record[0]=0; smartURLEncode(ch,g); }

                 /*
                    匹配模板
                  */

} else { if(mark==-2) { perr=0;comment=0;eq=0;tag=0;errmsg[0]=0;bra=0; cite=(struct template *)calloc(sizeof(struct template),1); cite->next=0; pre=cur=cite; strcpy(errmsg,"