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);
}
相关文章推荐
- C指针原理(16)-C指针基础
- C++基础7【难】 多态:实现原理 vptr指针 证明vptr存在 类的步长 纯虚函数:抽象类 案例 【面试题】
- C语音基础-指针初识15
- C指针原理(17)-C指针基础
- C指针原理(33)-C指针基础
- C指针原理(21)-C指针基础
- C指针原理 (26)-C指针基础
- JAVA基础--JAVA API集合框架(其他集合类,集合原理)15
- C指针原理(18)-C指针基础
- C指针原理(19)-C指针基础
- C指针原理 (25)-C指针基础
- C指针原理(14)-C指针基础
- C指针原理(96)-C基础综合应用
- C++基础积累(2)指针与数组、指针与函数关系详解
- C指针原理(40)-GLIB
- (15)- 常用基础知识
- 指针和引用区别(More Effective_C++_1(基础))
- Socket原理与编程基础
- 【c语言基础】字符串数组与字符串指针的理解心得
- C++学习15:指针与const