Deep BlueVBScriptWMIPHPC语言JavaScriptWindows API路由器Windows函数Python | 用C语言实现PHP的basename函数写一个程序要用到,于是整理了一下。在PHP源码中的ext/standard/string.c中。
#include <stdio.h> #include <stdlib.h> #include <string.h> /*********************************** Author : Demon Website : http://demon.tw E-mail : [email protected] ***********************************/ /* {{{ php_basename */ void php_basename(char *s, size_t len, char *suffix, size_t sufflen, char **p_ret, size_t *p_len) { char *ret = NULL, *c, *comp, *cend; size_t inc_len, cnt; int state; c = comp = cend = s; cnt = len; state = 0; while (cnt > 0) { inc_len = 1; if (*c == '/' || *c == '\\') { if (state == 1) { state = 0; cend = c; } } else { if (state == 0) { comp = c; state = 1; } } c += inc_len; cnt -= inc_len; } if (state == 1) { cend = c; } if (suffix != NULL && sufflen < (size_t)(cend - comp) && memcmp(cend - sufflen, suffix, sufflen) == 0) { cend -= sufflen; } len = cend - comp; if (p_ret) { ret = malloc(len + 1); memcpy(ret, comp, len); ret[len] = '\0'; *p_ret = ret; } if (p_len) { *p_len = len; } } /* }}} */ /* {{{ proto string basename(string path [, string suffix]) Returns the filename component of the path */ char *basename(char *string, char *suffix) { char *ret; int string_len = strlen(string), suffix_len = strlen(suffix); size_t ret_len; php_basename(string, string_len, suffix, suffix_len, &ret, &ret_len); return ret; } /* }}} */ int main(void) { char *path = "/home/httpd/html/index.php"; char *file = basename(path, ""); printf("%s\n", file); free(file); file = basename(path, ".php"); printf("%s\n", file); free(file); return 0; } |