LAOXU 发表于 2024-3-8 16:10:22

缓冲区操作 和 字符串操作 标淮库程序, 全部改写成 可重入 类型 !

* 缓冲区操作 和 字符串操作 标淮库程序, 全部改写成 可重入 类型 !
* ( 注: strtok 函数除外), 但增加了 strtok_s 函数(可重入),
                                                         用以代替 strtok 函数。
* 可轻松应用于 OS系统, 适用于所有 MCS-51系列。
* 不用担心 C51标准库函数, 由于不可重入的原因, 引起系统崩溃死机。
* 使用时, 外挂 STRING_51.LIB 库, 以及用 STRING2.H 头文件,
   替换原标准 STRING.H 头文件, 即可。




LAOXU 发表于 2024-3-8 16:14:23

所含函数文件例表, 除 strtok 函数之外, 其他函数都是可重入的 !

#pragma SAVE
#pragma REGPARMS
extern char *strcat (char *s1, char *s2);
extern char *strncat (char *s1, char *s2, int n);

extern char strcmp (char *s1, char *s2);    // (char *R0R4R5, char *R1R2R3)
extern char strncmp (char *s1, char *s2, int n);

extern char *strcpy (char *s1, char *s2);        // (char *R0R4R5, char *R1R2R3); *s2-->*s1
extern char *strncpy (char *s1, char *s2, int n);

extern int strlen (char *);

extern char *strchr (const char *s, char c);        // (const char *R1R2R3, char R5)
extern int strpos (const char *s, char c);                // (const char *R1R2R3, char R5)
extern char *strrchr (const char *s, char c);        // (const char *R1R2R3, char R5)
extern int strrpos (const char *s, char c);                // (const char *R1R2R3, char R5)

extern int strspn (char *s, char *set);
extern int strcspn (char *s, char *set);
extern char *strpbrk (char *s, char *set);
extern char *strrpbrk (char *s, char *set);
extern char *strstr(char *s, char *sub);
extern char *strtok(char *str, const char *set);
extern char *strtok_s(char *str, const char *set, char **str_p);    // 新增

extern char memcmp (void *s1, void *s2, int n);    // (void *R0R4R5, void *R1R2R3, int R6R7)
extern void *memcpy (void *s1, void *s2, int n);   // (void *R0R4R5, void *R1R2R3, int R6R7); *s2-->*s1
extern void *memchr (void *s, char val, int n);           // (void *R1R2R3, char R5, int R6R7)
extern void *memccpy (void *s1, void *s2, char val, int n);                                                                   // *s2-->*s1
extern void *memmove (void *s1, void *s2, int n);// (void *R0R4R5, void *R1R2R3, int R6R7); *s2-->*s1
extern void *memset(void *s, char val, int n);   // (void *R1R2R3, char R5, int R6R7)
#pragma RESTORE

_奶咖君_ 发表于 2024-3-8 16:17:01

啊 这个用开模拟栈么{:4_194:}

LAOXU 发表于 2024-3-8 16:28:47

_奶咖君_ 发表于 2024-3-8 16:17
啊 这个用开模拟栈么
不用开模拟栈, 属干仿内嵌函数类型, 所有数据参数 仅使用
R0-R7,A,B,PSW,DPTR 13个专用寄存器,
部分程序 局部变量 不够用,
自行 动态占用 SP堆栈(完全等同于 标准可重入函数 方式), 退出时自行销毁.

属于 100% 类 标准可重入函数.

神农鼎 发表于 2024-3-8 16:44:08

老许 威武 !已广为宣传

21cnsound 发表于 2024-3-8 17:08:03

技术大拿{:4_174:}

_奶咖君_ 发表于 2024-3-8 17:35:52

LAOXU 发表于 2024-3-8 16:28
不用开模拟栈, 属干仿内嵌函数类型, 所有数据参数 仅使用
R0-R7,A,B,PSW,DPTR 13个专用寄存器,
部分程序 ...

老许 威武,,牛的{:4_168:}

LAOXU 发表于 2024-3-8 18:45:51

由于 51构架的特殊性, Keil C51(包括 IAR , SDCC 等所有的 C51编译器) , 最大的短板,
就是利用 固定内存(非堆栈, 动态内存)传递参数变量, 以达到减少代码长度.

笔者改写的 缓冲区操作 和 字符串操作 标淮库程序, 全部 使用 R0-R7 传递参数变量,
函数体内如需使用局部变量, 仅占用少量堆栈, 是彻头彻尾的 标准 可重入 函数 类型 !

jwd 发表于 2024-3-8 19:37:04

{:4_250:}{:4_250:}

社区闲人 发表于 2024-3-20 17:18:31

顶楼主!
页: [1]
查看完整版本: 缓冲区操作 和 字符串操作 标淮库程序, 全部改写成 可重入 类型 !