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

#ifdef _WIN32static 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指针原理(13)-C指针基础相关推荐

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

    简单C指针 指向整数的指针,以及指针的指针 myhaspl@myhaspl:~ % vim test1.c#include <stdio.h>int main(void){int x;x= ...

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

    2.指向数组的指针 #include <stdio.h>int main(void){int i;char x[20]="0123456789ABCDEFGHIJ";f ...

  3. C指针原理(44)-汇编基础

    AT&T汇编语语言中的数据段与数据类型 .data段定义的数据元素保留在内存中能够被指令读取和写入; .rodata段定义的数据元素只读: .data与.rodata段的数据类型: .asci ...

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

    取自netbsd中的源码,检查运算溢出,用C语言实现,方法很精妙 /* hide bintime for _STANDALONE because this header is used for hpc ...

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

    指针本身也是一种变量,支持常用的运算.比如加.减 #include <stdio.h>int main(void){int i;char x[20]="0123456789ABC ...

  6. C指针原理(14)-C指针基础

    make与makefile make是一个工具程序(Utility software),经由读取叫做"makefile"的文件,自动化建构软件.它是一种转化文件形式的工具,转换的目 ...

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

    tcctok.h定义了C语言的词法分析的基本元素,主要定义了关键字. / keywords /DEF(TOK_INT, "int")DEF(TOK_VOID, "void ...

  8. C指针原理(19)-C指针基础

    不用下标,直接引用多维数组名时,多维数组名代表一个指针变量,这个指针变量指向是最后一维长度的数组的指针,假设x是一个2*5的数组,定义为: int x[2][5] 直接引用x,不使用任何下标,此时x代 ...

  9. C指针原理(43)-helloworld的C程序汇编剖析

    一.汇编基础 1.指令码与数据处理 当计算机处理应用程序运行指令码时,数据指针指示处理器如何在内存的数据区域寻找要处理的数据,这块区域也称为堆栈,指令码放在另外的指令区,此外,还有指令指针机制,当处理 ...

最新文章

  1. C#时间(DateTime)格式化
  2. Java并发包中的几种ExecutorService
  3. Python直接赋值,浅拷贝和深度拷贝
  4. 5、Power View—图块与切片器的应用
  5. psp能装安卓软件吗_王思聪:翻译软件能翻译出文化吗?
  6. Matter-JS Render.create 渲染器创建
  7. uni-app在h5端和app端的使用。/deep/ css兼容性问题如何解决?
  8. Java aop中参数传递
  9. 使用微信即时远程开门
  10. 【IDEA 教程系列第 14 篇】idea 快速跳转到错误位置
  11. 初中计算机课感悟,初中信息技术课教育随笔
  12. ps—选择连续的多个图层、同时操作多个图层、选择所有图层与取消选择图层、锁定图层、锁定透明像素、锁定图像像素、锁定位置、锁定全部
  13. -1-0 Java 简介 java是什么 java简单介绍
  14. 旋转木马 css,CSS:3D旋转木马效果
  15. 微信公众号二次开发之消息回复
  16. skimage 学习第三天:ski官网示例程序总结(2)
  17. flash连连看算法
  18. 3D立体游戏的起源和目前的发展
  19. 腾讯应用管理中心,认领应用
  20. 春节福利|《闲鱼技术2022年度白皮书》公开下载

热门文章

  1. spark UDAF
  2. 【BZOJ1934】善意的投票(网络流)
  3. 世界是有生命的(通向财富自由之路学习笔记十五)
  4. jQ复制按钮的插件zclip
  5. android使用tabhost实现导航
  6. .net中的socket异步通信实现--客户端代码
  7. 配置Memcache服务器并实现主从复制功能(repcached)
  8. hdu 1301 Jungle Roads 最小生成树
  9. powershell 下独立silent 安装 浏览器问题
  10. 一些软件设计的原则【转】——本来想自己总结,结果发现个更全的,