为了账号安全,请及时绑定邮箱和手机立即绑定

C指针原理(13)-C指针基础

标签:
C++


规范路径格式,win32(windows环境下,路径之间的各个目录分隔将“\”改为"/",用“/”分隔,这样的好处是在UNIX和WINDOWS都兼容,而且也简化了目录表示。

#ifdef _WIN32

static char normalize_slashes(char path)

{

    char p;

    for (p = path; p; ++p)

        if (p == '\')

            p = '/';

    return path;

}

static HMODULE tcc_module;

win32环境下,我们假设lib和include在tcc.exe所在的位置。

/ on win32, we suppose the lib and includes are at the location of 'tcc.exe' /

static void tcc_set_lib_path_w32(TCCState s)

{

    char path[1024], p;

   得到 当前TCC的完整路径

    GetModuleFileNameA(tcc_module, path, sizeof path);

   得到路径的目录部分,注意得到的值是一个位置,指示目录部分的结尾处

    p = tcc_basename(normalize_slashes(strlwr(path)));

   跳过bin目录名,取前面的目录,因为tcc.exe可能在/bin/目录下

    if (p - 5 > path && 0 == strncmp(p - 5, "/bin/", 5))

        p -= 5;

   下面取前面的目录,p--是为了删掉目录的最后一个"/"

    else if (p > path)

        p--;

    *p = 0;

    设置lib路径

    tcc_set_lib_path(s, path);

}

加入系统目录

#ifdef TCC_TARGET_PE

static void tcc_add_systemdir(TCCState *s)

{

    char buf[1000];

    GetSystemDirectory(buf, sizeof buf);

    tcc_add_library_path(s, normalize_slashes(buf));

}

#endi

静态链接

#ifndef CONFIG_TCC_STATIC

void dlclose(void *p)

{

    FreeLibrary((HMODULE)p);

}

#endif

生成dll

#ifdef LIBTCC_AS_DLL

BOOL WINAPI DllMain (HANDLE hDll, DWORD dwReason, LPVOID lpReserved)

{

    if (DLL_PROCESS_ATTACH == dwReason)

        tcc_module = hDll;

    return TRUE;

}

#endif

#endif

下面是复制并截断字符串的函数,函数读入缓冲区的指针、缓冲区的大小以及源字符串,将源字符串截断并复制到缓冲区中。

/****/

/ copy a string and truncate it. /

PUB_FUNC char pstrcpy(char buf, int buf_size, const char *s)

{

    char q, q_end;

    int c;

    缓冲区大于0,则可以开始复制字符串。

    if (buf_size > 0) {

        计算复制字符串的起始位置

        q = buf;

        q_end = buf + buf_size - 1;

        复制buf_size大小的字符串到新字符串中,最后加上字符串终结符'\0'

        while (q < q_end) {

            c = *s++;

            if (c == '\0')

                break;

            *q++ = c;

        }

        *q = '\0';

}

返回新生成的字符串

    return buf;

}

可以调用上面这个函数,传入指针,指定新字符串在缓冲区的位置,可以先生成一个大的缓冲区,再分次将不同的字符串截断复制进来。

接下来是字符串拼接函数,将新字符串截断并拼接到缓冲区中。

/* strcat and truncate. */

PUB_FUNC char *pstrcat(char *buf, int buf_size, const char *s)

{

    int len;

    len = strlen(buf);

    if (len < buf_size) 

        pstrcpy(buf + len, buf_size - len, s);

    return buf;

}

直接在内存中复制字符串,不是以字符串终结符为标志进行复制,如下:

PUB_FUNC char *pstrncpy(char *out, const char *in, size_t num)

{

    memcpy(out, in, num);

    out[num] = '\0';

    return out;

}

下面这个函数,找到文件完整路径中的目录部分,本身很普通,其实现有些意思,从后面向前面找

/ extract the basename of a file /

PUB_FUNC char tcc_basename(const char name)

{

    先找到字符串终结符0   

    char *p = strchr(name, 0);

   然后从后向前移动指针,发现有目录分隔符后,停止

    while (p > name && !IS_DIRSEP(p[-1]))

        --p;

   返回目录在文件路径字符串的结尾位置。

    return p;

}

下面找到文件扩展名

/* extract extension part of a file

 *

 * (if no extension, return pointer to end-of-string)

 */

PUB_FUNC char *tcc_fileextension (const char *name)

{

    char *b = tcc_basename(name);

   找到标注扩展名前面的点号

    char *e = strrchr(b, '.');

   返回扩展名

    return e ? e : strchr(b, 0);

}

©著作权归作者所有:来自51CTO博客作者myhaspl的原创作品,如需转载,请注明出处,否则将追究法律责任


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消