📄 lfname.c
字号:
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 + -