📄 string.c
字号:
#include <types.h>#include <string.h>#include <ctype.h>void *blkzero(void *dest, unsigned int cnt){ unsigned long *l = dest; cnt = cnt / 4 / 4; while (cnt--){ *l++ = 0x00; *l++ = 0x00; *l++ = 0x00; *l++ = 0x00; } return dest;}void *blkset(void *dest, unsigned long val, unsigned int cnt){ unsigned long *l = dest; cnt = cnt / 4 / 4; if (cnt) do { *l++ = val; *l++ = val; *l++ = val; *l++ = val; } while (--cnt); return dest;}int blkcmp(const void *dest, const void *src, unsigned int cnt){ const ulong *l1=dest, *l2=src; cnt = cnt / 4 / 4; if (cnt) do { if (*l1++ != *l2++) goto diff; if (*l1++ != *l2++) goto diff; if (*l1++ != *l2++) goto diff; if (*l1++ != *l2++) goto diff; } while (--cnt); return 0;diff : return *(--l1) - *(--l2);}/*void *memcpy(void *dest, const void *src, uint cnt){ char *d = dest; const char *s = src; while (cnt--) *d++ = *s++; return dest;}*//*void *memcpy(void *dest, const void *src, uint cnt){ char *s1=dest, *endptr=(char *)dest+cnt; const char *s2=src; while (s1 < endptr) *s1++ = *s2++; return dest;}*/void *memset(void *dest, int c, uint cnt){ char *s=(char *)dest; while (cnt--) *s++ = c; return s;}int memcmp(const void *cs, const void *ct, uint cnt){ const uchar *s1=cs, *s2=ct; while (cnt-- > 0){ if (*s1++ == *s2++) continue; return *(s1-1) - *(s2-1); } return 0;}char *strcpy(char *dest, const char *src){ char *tmp = dest; if (!dest) return 0; while ((*dest++ = *src++) != '\0'); return tmp;}uint strlen(const char *s){ const char *sc = s; if (!sc) return 0; for (sc=s; *sc; sc++); return (sc - s);}uint strnlen(const char *s, uint cnt){ const char *sc; for (sc = s; cnt-- && *sc != '\0'; ++sc); return sc - s;}int strcmp(const char *cs, const char *ct){ int retval = 0; while (1) if (((retval= *cs - *ct++) != 0) || !*cs++) break; return retval;}int strncmp(const char *cs, const char *ct, uint cnt){ int retval = 0; while (cnt-- > 0){ if ((retval= *cs - *ct++) != 0 || !*cs++) break; } return retval;}char *strchr(const char *s, int c){ while (*s != (char)c){ if (*s == '\0') return 0; s++; } return (char *)s;}bool strtoul(const char *cp, ulong *result, int base){ ulong value, retval; if (!cp) return false; // base(柳过)捞 绝阑 锭绰 巩磊凯狼 屈侥栏肺 8, 10, 16柳荐甫 备盒. if (!base){ base = 10; if (*cp == '0'){ base = 8; cp++; if (*cp == 'x'){ base = 16; cp++; } } } else { if (base==8 && *cp=='0') cp++; if (base==16 && (*cp=='0' && cp[1]=='x')) cp += 2; } retval = 0; while (*cp){ if (isxdigit(*cp) && (value = isdigit(*cp) ? *cp-'0' : toupper(*cp)-'A'+10) < base){ retval = retval * base + value; cp++; } else return false; } *result = retval; return true;}bool strtol(const char *cp, long *value, int base){ bool res; ulong tmp; if (!cp) return false; if (*cp == '-'){ res = strtoul(cp + 1, &tmp, base); if (res) *value = (long)(-tmp); } else { res = strtoul(cp, &tmp, base); if (res) *value = (long)tmp; } return res;}/*bool HexToInt(char *s, void *retval, VAR_TYPE type){ char c; int i; long rval; if (!s || !retval) return false; if (!strncmp(s, "0x", 2)) s+=2; // fine int value. for (i=0, rval=0; i<type/4; i++){ if (*s=='\0'){ if (i==0) return false; else break; } c = *s++; if (c>='0' && c<='9') c-='0'; else if (c>='a' && c<='f') c=c-'a'+10; else if (c>='A' && c<='F') c=c-'A'+10; else return false; rval = rval<<4 | c; } // make retval. switch (type){ case 8 : *(char *)retval = (char)rval; break; case 16 : *(short *)retval = (short)rval; break; case 32 : *(long *)retval = (long)rval; break; default : return false; } return true;}bool DecToLong(char *s, long *retval){ long remainder; if (!s || !s[0]) return false; for (*retval=0; *s; s++){ if (*s < '0' || *s > '9') return false; remainder = *s - '0'; *retval = *retval * 10 + remainder; } return true;}*//*void printf(char *fmt, ...){ int i; va_list args; char *s=fmt; char format[10]; // fmt狼 牢磊啊 "%08lx"扼搁, "08l"甫 烙矫肺 扁废. va_start(args, fmt); while (*s){ if (*s=='%'){ s++; // s俊辑 "%08lx"屈侥阑 啊廉客 format俊 扁废. 唱吝俊 免仿窃荐俊 逞败淋. format[0] = '%'; for (i=1; i<10;){ if (*s=='c' || *s=='d' || *s=='x' || *s=='s' || *s=='%'){ format[i++] = *s; format[i] = '\0'; break; } else { format[i++] = *s++; } } // "%s", "%c", "%d", "%x"甫 茫酒 免仿且 窃荐 龋免. switch (*s++){ case 'c' : PrintChar(format, va_arg(args, int)); break; case 'd' : PrintDec(format, va_arg(args, int)); break; case 'x' : PrintHex(format, va_arg(args, int)); break; case 's' : PrintString(format, va_arg(args, char *)); break; case '%' : PrintChar("%c", '%'); break; } } else { PrintChar("%c", *s); s++; } } va_end(args); return;}void PrintChar(char *fmt, char c){ serial_putc(c); return;}void PrintDec(char *fmt, int l){ int i, j; char c, *s=fmt, tol[10]; bool flag0=false, flagl=false; // "%08lx"俊辑 '0', 'l'狼 粮犁 咯何. long flagcnt=0; // "%08lx"俊辑 "8"阑 茫酒辑 long屈栏肺. bool leading_zero=true; // long屈狼 data甫 免仿窍扁 困茄 函荐. long divisor, result, remainder; // fmt狼 "%08lx"俊辑 '0', '8', 'l'阑 秦籍. for (i=0; (c=s[i]); i++){ if (c=='d') break; else if (c>='1' && c<='9'){ for (j=0; s[i]>='0' && s[i]<='9'; j++){ tol[j] = s[i++]; } tol[j] = '\0'; i--; DecToLong(tol, &flagcnt); } else if (c=='0') flag0=true; else if (c=='l') flagl=true; else continue; } // 困狼 flag俊 蝶扼 免仿. if (flagcnt){ if (flagcnt>9) flagcnt=9; remainder = l%(Power(10, flagcnt)); // flagcnt焊促 拉磊府狼 荐绰 吧矾晨. 199俊 flagcnt==2捞搁, 99父. for (divisor=Power(10, flagcnt-1); divisor>0; divisor/=10){ result = remainder/divisor; remainder %= divisor; if (result!=0 || divisor==1) leading_zero = false; if (leading_zero==true){ if (flag0) serial_putc('0'); else serial_putc(' '); } else serial_putc((char)(result)+'0'); } } else { remainder = l; for (divisor=1000000000; divisor>0; divisor/=10){ result = remainder/divisor; remainder %= divisor; if (result!=0 || divisor==1) leading_zero = false; if (leading_zero==false) serial_putc((char)(result)+'0'); } } return;}void PrintHex(char *fmt, int l){ int i, j; char c, *s=fmt, tol[10]; bool flag0=false, flagl=false; // flags. long flagcnt=0; bool leading_zero=true; char uHex, lHex; int cnt; // "%5x"狼 版快 5俺父 免仿窍档废 免仿茄 俺荐. // fmt狼 "%08lx"俊辑 '0', '8', 'l'阑 秦籍. for (i=0; (c=s[i]); i++){ if (c=='x') break; else if (c>='1' && c<='9'){ for (j=0; s[i]>='0' && s[i]<='9'; j++){ tol[j] = s[i++]; } tol[j] = '\0'; i--; DecToLong(tol, &flagcnt); } else if (c=='0') flag0=true; else if (c=='l') flagl=true; else continue; } s = (char *)(&l); l = SWAP32(l); // little, big endian俊 蝶扼辑.(big捞 免仿窍扁 浆况 鉴辑甫 官厕) // 困狼 flag俊 蝶扼 免仿. if (flagcnt){ if (flagcnt&0x01){ // flagcnt啊 圈荐 老锭, upper甫 公矫, lower父 免仿. c = s[(8-(flagcnt+1))/2]; // 圈荐 老锭 弊 困摹甫 器窃窍绰 镑狼 蔼阑 啊廉 可聪促. // lower 4 bits甫 啊廉客辑 ascii code肺. lHex = ((c>>0)&0x0f); if (lHex!=0) leading_zero=false; if (lHex<10) lHex+='0'; else lHex+='A'-10; // lower 4 bits 免仿. if (leading_zero){ if (flag0) serial_putc('0'); else serial_putc(' '); } else serial_putc(lHex); flagcnt--; } // byte窜困狼 data甫 Hex肺 免仿. for (cnt=0, i=(8-flagcnt)/2; i<4; i++){ c = s[i]; // get upper 4 bits and lower 4 bits. uHex = ((c>>4)&0x0f); lHex = ((c>>0)&0x0f); // upper 4 bits and lower 4 bits to '0'~'9', 'A'~'F'. // upper 4 bits甫 ascii code肺. if (uHex!=0) leading_zero = false; if (uHex<10) uHex+='0'; else uHex+='A'-10; // upper 4 bits 免仿. if (leading_zero){ if (flag0) serial_putc('0'); else serial_putc(' '); } else serial_putc(uHex); // lower 4 bits甫 ascii code肺. if (lHex!=0) leading_zero = false; if (lHex<10) lHex+='0'; else lHex+='A'-10; // lower 4 bits 免仿. if (leading_zero){ if (flag0) serial_putc('0'); else serial_putc(' '); } else serial_putc(lHex); } } else { for (i=0; i<4; i++){ c = s[i]; // get upper 4 bits and lower 4 bits. uHex = ((c>>4)&0x0f); lHex = ((c>>0)&0x0f); // upper 4 bits and lower 4 bits to '0'~'9', 'A'~'F'. if (uHex!=0) leading_zero = false; if (uHex<10) uHex+='0'; else uHex+='A'-10; if (!leading_zero) serial_putc(uHex); if (lHex!=0 || i==3) leading_zero = false; if (lHex<10) lHex+='0'; else lHex+='A'-10; if (!leading_zero) serial_putc(lHex); } } return;}void PrintString(char *fmt, char *s){ if (!fmt || !s) return; while (*s) serial_putc(*s++); return;}int Power(int num, int cnt){ long retval=num; cnt--; while (cnt--){ retval *= num; } return retval;}*/char *stradd(char *str1, char *str2)
{
int len1 = strlen(str1);
int len2 = strlen(str2);
char address[len1 + len2 + 1];
int i=0;
while((address[i++] = *str1++) != '\0');
i--;
while((address[i++] = *str2++) != '\0');
return address;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -