您的位置:首页 > 其它

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

2013-11-15 09:50 225 查看


本博客所有内容是原创,如果转载请注明来源


http://blog.csdn.net/myhaspl/

/********************************************************/

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

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