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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C指针原理(13)-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大小的字符串到新字符串中,最后加上字符串终结符‘‘

????????while?(q?<?q_end)?{

????????????c?=?*s++;

????????????if?(c?==?‘‘)

????????????????break;

????????????*q++?=?c;

????????}

????????*q?=?‘‘;

}

返回新生成的字符串

????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] = ‘‘;
? ? 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指针原理(13)-C指针基础的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

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

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

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