⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lfname.c

📁 网络爬虫程序
💻 C
📖 第 1 页 / 共 3 页
字号:
  lfname_lsp_var_free(var->param3);  if(var->type == LF_LSP_STR)    _free(var->val.str);  _free(var);}static struct lfname_lsp_var *lfname_lsp_analyze(const char **pstr){  struct lfname_lsp_var *retv = NULL;  enum lfname_lsp_type type;  char *p;  const char *cp;  type = lfname_lsp_token_type(pstr);  switch (type)  {  case LF_LSP_UNKNOWN:    xprintf(0, gettext("LSP analyze error: bad token at - %s\n"), *pstr);    break;  case LF_LSP_NUM:    {      int nval;      errno = 0;      nval = strtol(*pstr, &p, 0);      if((errno == ERANGE) || (*p != '\0' && *p != ')' && *p != ' '))      {        xprintf(0, gettext("LSP analyze error: bad numeric value at - %s\n"),          *pstr);        break;      }      retv = lfname_lsp_var_new(type);      retv->val.num = nval;      *pstr = p;    }    break;  case LF_LSP_MACRO:    {      if(!lfname_check_macro(**pstr) ||        (*(*pstr + 1) != '\0' && *(*pstr + 1) != ')' && *(*pstr + 1) != ' '))      {        xprintf(0, gettext("LSP analyze error: bad macro at - %s\n"),          *pstr - 1);        break;      }      retv = lfname_lsp_var_new(type);      retv->val.macro = **pstr;      *pstr += 1;    }    break;  case LF_LSP_STR:    {      char *tmp = _malloc(strlen(*pstr) + 1);      char *tp;      cp = *pstr;      tp = tmp;      while(*cp)      {        if(*cp == '\"')          break;        if(*cp == '\\')          cp++;        *tp = *cp;        tp++;        if(*cp)          cp++;      }      *tp = '\0';      if(*cp != '\"')      {        xprintf(0,          gettext("LSP analyze error: unterminated string at - %s\n"),          *pstr - 1);        break;      }      retv = lfname_lsp_var_new(type);      retv->val.str = tl_strdup(tmp);      _free(tmp);      *pstr = cp + 1;    }    break;  default:    {      struct lfname_lsp_var *p1 = NULL;      struct lfname_lsp_var *p2 = NULL;      struct lfname_lsp_var *p3 = NULL;      if(lfname_lsp_ftbl[type].params >= 1)      {        cp = *pstr;        p1 = lfname_lsp_analyze(pstr);        if(!p1)          break;        if(p1->rettype != lfname_lsp_ftbl[type].p1type)        {          xprintf(0,            gettext("LSP analyze error: bad parameter type at - %s\n"), cp);          lfname_lsp_var_free(p1);          break;        }      }      if(p1 && lfname_lsp_ftbl[type].params >= 2)      {        cp = *pstr;        p2 = lfname_lsp_analyze(pstr);        if(!p2)        {          lfname_lsp_var_free(p1);          break;        }        if(p2->rettype != lfname_lsp_ftbl[type].p2type)        {          xprintf(0,            gettext("LSP analyze error: bad parameter type at - %s\n"), cp);          lfname_lsp_var_free(p1);          lfname_lsp_var_free(p2);          break;        }      }      if(p2 && lfname_lsp_ftbl[type].params >= 3)      {        cp = *pstr;        p3 = lfname_lsp_analyze(pstr);        if(!p3)        {          lfname_lsp_var_free(p1);          lfname_lsp_var_free(p2);          break;        }        if(p3->rettype != lfname_lsp_ftbl[type].p3type)        {          xprintf(0,            gettext("LSP analyze error: bad parameter type at - %s\n"), cp);          lfname_lsp_var_free(p1);          lfname_lsp_var_free(p2);          lfname_lsp_var_free(p3);          break;        }      }      while(**pstr == ' ')        (*pstr)++;      if(**pstr != ')')      {        xprintf(0, gettext("LSP analyze error: bad token at - %s\n"), *pstr);        if(p1)          lfname_lsp_var_free(p1);        if(p2)          lfname_lsp_var_free(p2);        if(p3)          lfname_lsp_var_free(p3);      }      else      {        (*pstr)++;        retv = lfname_lsp_var_new(type);        retv->param1 = p1;        retv->param2 = p2;        retv->param3 = p3;      }    }    break;  }  return retv;}/*Removes a parameter from an URL-String.e.g. removeparameter("myurl.php3?var=something","var") will convert theURL to "myurl.php3?"*/static char *lfname_fn_removeparameter(char *urlstr, char *var){  char *p, *found;  int pos1;  int parlen;  /* &var= */  p = tl_str_concat(NULL, "&", var, "=", NULL);  parlen = strlen(p);  found = strstr(urlstr, p);  if(!found)  {    /* ?var= */    *p = '?';    found = strstr(urlstr, p);    if(!found)    {      /* var= */      if((parlen > 1) && !strncmp(urlstr, p + 1, parlen - 1))      {        found = urlstr;      }    }  }  _free(p);  if(!found)    return tl_strdup(urlstr);  pos1 = found - urlstr + 1;  found = strstr((urlstr + pos1 + 1), "&");  if(!found)  {    return tl_strndup(urlstr, pos1 - 1);  }  urlstr = tl_strndup(urlstr, pos1);  return tl_str_concat(urlstr, found + 1, NULL);}/*reads a value from parameter of an URL-String.e.g. lfname_fn_getvalue("myurl.php3?var=value","var") results in value*/static char *lfname_fn_getvalue(char *urlstr, char *var){  char *p, *found;  int parlen;  /* &var= */  p = tl_str_concat(NULL, "&", var, "=", NULL);  parlen = strlen(p);  found = strstr(urlstr, p);  if(!found)  {    /* ?var= */    *p = '?';    found = strstr(urlstr, p);    if(!found)    {      /* var= */      if((parlen > 1) && !strncmp(urlstr, p + 1, parlen - 1))      {        parlen--;        found = urlstr;      }    }  }  _free(p);  if(!found)    return tl_strdup("");  return tl_strndup(found + parlen, strcspn(found + parlen, "&"));}static int lfname_lsp_eval(struct lfname_lsp_interp *interp,  struct lfname_lsp_var *var){  if(var->param1)    lfname_lsp_eval(interp, var->param1);  if(var->param2)    lfname_lsp_eval(interp, var->param2);  if(var->param3)    lfname_lsp_eval(interp, var->param3);  var->ret_val.str = NULL;  switch (var->type)  {  case LF_LSP_UNKNOWN:    break;  case LF_LSP_STR:    var->ret_val.str = tl_strdup(var->val.str);    break;  case LF_LSP_NUM:    var->ret_val.num = var->val.num;    break;  case LF_LSP_MACRO:    var->ret_val.str =      tl_strdup(lfname_interp_get_macro(interp, var->val.macro));    break;  case LF_LSP_SUB:#ifdef HAVE_REGEX    var->ret_val.str = lfname_re_sub(interp->orig,      interp->urlstr, var->param1->ret_val.num);#endif    break;  case LF_LSP_SC:    {      char *p;      p =        _malloc(strlen(var->param1->ret_val.str) +        strlen(var->param2->ret_val.str) + 1);      strcpy(p, var->param1->ret_val.str);      strcat(p, var->param2->ret_val.str);      var->ret_val.str = p;    }    break;  case LF_LSP_SS:    {      char *p;      p = var->param1->ret_val.str;      if(var->param2->ret_val.num > 0)        p +=          (strlen(p) >=          var->param2->ret_val.num) ? var->param2->ret_val.num : strlen(p);      if(var->param3->ret_val.num > 0)        var->ret_val.str = tl_strndup(p, var->param3->ret_val.num);      else        var->ret_val.str = tl_strdup(p);    }    break;  case LF_LSP_HASH:    var->ret_val.num = str_hash_func(var->param2->ret_val.num,      (dllist_t) var->param1->ret_val.str);    break;  case LF_LSP_MD5:    var->ret_val.str = _md5(var->param1->ret_val.str);    break;  case LF_LSP_LOWER:    var->ret_val.str = lowerstr(var->param1->ret_val.str);    break;  case LF_LSP_UPPER:    var->ret_val.str = upperstr(var->param1->ret_val.str);    break;  case LF_LSP_UENC:    var->ret_val.str = url_encode_str(var->param1->ret_val.str,      var->param2->ret_val.str);    break;  case LF_LSP_UDEC:    var->ret_val.str = url_decode_str(var->param1->ret_val.str,      strlen(var->param1->ret_val.str));    break;  case LF_LSP_DELCHR:    var->ret_val.str = tr_del_chr(var->param2->ret_val.str,      var->param1->ret_val.str);    break;  case LF_LSP_TRCHR:    var->ret_val.str = tr_chr_chr(var->param2->ret_val.str,      var->param3->ret_val.str, var->param1->ret_val.str);    break;  case LF_LSP_TRSTR:    var->ret_val.str = tr_str_str(var->param2->ret_val.str,      var->param3->ret_val.str, var->param1->ret_val.str);    break;  case LF_LSP_STRSPN:    var->ret_val.num = strspn(var->param1->ret_val.str,      var->param2->ret_val.str);    break;  case LF_LSP_STRCSPN:    var->ret_val.num = strcspn(var->param1->ret_val.str,      var->param2->ret_val.str);    break;  case LF_LSP_STRLEN:    var->ret_val.num = strlen(var->param1->ret_val.str);    break;  case LF_LSP_NRSTR:    {      char pom[1024];      snprintf(pom, sizeof(pom), var->param1->ret_val.str, var->param2->ret_val.num);      var->ret_val.str = tl_strdup(pom);    }    break;  case LF_LSP_LCHR:    {      char *p;      p = strrchr(var->param1->ret_val.str, *var->param2->ret_val.str);      var->ret_val.num = p ? p - var->param1->ret_val.str : 0;    }    break;  case LF_LSP_PLS:    var->ret_val.num = var->param1->ret_val.num + var->param2->ret_val.num;    break;  case LF_LSP_MNS:    var->ret_val.num = var->param1->ret_val.num - var->param2->ret_val.num;    break;  case LF_LSP_MOD:    var->ret_val.num = var->param1->ret_val.num % var->param2->ret_val.num;    break;  case LF_LSP_MUL:    var->ret_val.num = var->param1->ret_val.num * var->param2->ret_val.num;    break;  case LF_LSP_DIV:    var->ret_val.num = var->param1->ret_val.num / var->param2->ret_val.num;    break;  case LF_LSP_REMOVEPARAMETER:    var->ret_val.str =      lfname_fn_removeparameter(var->param1->ret_val.str,      var->param2->ret_val.str);    break;  case LF_LSP_GETVALUE:    var->ret_val.str =      lfname_fn_getvalue(var->param1->ret_val.str, var->param2->ret_val.str);    break;  case LF_LSP_SIF:    var->ret_val.str = var->param1->ret_val.num ?      tl_strdup(var->param2->ret_val.str) :      tl_strdup(var->param3->ret_val.str);    break;  case LF_LSP_NOT:    var->ret_val.num = !var->param1->ret_val.num;    break;  case LF_LSP_AND:    var->ret_val.num = var->param1->ret_val.num && var->param2->ret_val.num;    break;  case LF_LSP_OR:    var->ret_val.num = var->param1->ret_val.num || var->param2->ret_val.num;    break;  case LF_LSP_GETEXT:    var->ret_val.str = tl_strdup(tl_get_extension(var->param1->ret_val.str));    break;  case LF_LSP_SEQ:    var->ret_val.num = !strcmp(var->param1->ret_val.str,      var->param2->ret_val.str);    break;#ifdef HAVE_MOZJS  case LF_LSP_JSF:    var->ret_val.str = pjs_run_fnrules_func(var->param1->ret_val.str, interp);    break;#endif  }  if(var->rettype == LF_LSP_STR && !var->ret_val.str)    var->ret_val.str = tl_strdup("");  return 0;}static char *lfname_lsp_get_by_url(struct lfname_lsp_interp *interp){  char *retv = NULL;  struct lfname_lsp_var *variant;  const char *p;  p = interp->orig->transstr;  variant = lfname_lsp_analyze(&p);  if(variant)  {    lfname_lsp_eval(interp, variant);    if(variant->rettype == LF_LSP_NUM)    {      char nr[10];      sprintf(nr, "%d", variant->ret_val.num);      retv = tl_strdup(nr);    }    else    {      retv = tl_strdup(variant->ret_val.str);    }    lfname_lsp_var_free(variant);  }  return retv;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -