您的位置:首页 > 编程语言 > C语言/C++

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

2018-12-01 11:03 621 查看

规范路径格式,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/" 16c8 , 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);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c c++