📄 lstring.c
字号:
/////////////////////////////////////////////////////////////////////////////////// Copyright(c) 2001-2002 Hybus Co,.ltd. All rights reserved.//// Module name:// lstring.c//// Description:////// Author:// bedguy//// Created:// 2002.10/////////////////////////////////////////////////////////////////////////////////#include "stdarg.h"#include "lstring.h"static void PrintChar(char *fmt, char c);static void PrintDec(char *fmt, int value);static void PrintHex(char *fmt, uint value);static void PrintString(char *fmt, char *cptr);static int Power(int num, int cnt);void MemCpy32(void *dest, void *src, int numWords){ volatile long *s1=dest, *s2=src; while(numWords--) { *s1++ = *s2++; } return;} // MemCpy32.void MemCpy(void *dest, void *src, int cnt){ char *s1=dest, *s2=src, *endptr=(char *)dest+cnt; while (s1<endptr) *s1++ = *s2++; return;} // MemCpy.void MemSet(void *dest, char c, int len){ char *s=dest; char *limit = (char *)dest+len; while (s < limit) *s++ = c;} // MemSet.int MemCmp(void *addr1, void *addr2, int len){ volatile char *s1=addr1, *s2=addr2; volatile char *endptr = (char*)addr1+len; while ((ulong)s1 < (ulong)endptr){ if (*s1++ != *s2++) return *(--s1) - *(--s2); } return 0;} // MemCmp.void StrCpy(char *dest, char *src){ volatile char *s1=dest, *s2=src; while (*s2!=0) *s1++ = *s2++; *s1 = 0; return;} // StrCpy.int StrLen(char *dest){ volatile char *tmp = dest; if (!tmp) return -1; while (*tmp!=0) tmp++; return (tmp - dest);} // StrLen.int StrNCmp(char *s1, char *s2, int len){ int i; for(i = 0; i < len; i++){ if(s1[i] != s2[i]) return ((int)s1[i]) - ((int)s2[i]); if(s1[i] == 0) return 0; } return 0;} // StrNCmp.int StrCmp(char *s1, char *s2){ for (; *s1 && *s2; s1++, s2++){ if (*s1 != *s2) return ((int)(*s1) - (int)(*s2)); } if (*s1 || *s2) return ((int)(*s1) - (int)(*s2)); return 0;} // StrCmp.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;} // HexToInt.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;} // DecToLong.void HexDump(char *addr, int len){ char *s=addr, *endPtr=(char *)((long)addr+len); int i, remainder=len%16; printf("\n"); printf("Offset Hex Value Ascii value\n"); // print out 16 byte blocks. while (s+16<=endPtr){ // offset 免仿. printf("0x%08lx ", (long)(s-addr)); // 16 bytes 窜困肺 郴侩 免仿. for (i=0; i<16; i++){ printf("%02x ", s[i]); } printf(" "); for (i=0; i<16; i++){ if (s[i]>=32 && s[i]<=125) printf("%c", s[i]); else printf("."); } s += 16; printf("\n"); } // Print out remainder. if (remainder){ // offset 免仿. printf("0x%08lx ", (long)(s-addr)); // 16 bytes 窜困肺 免仿窍绊 巢篮 巴 免仿. for (i=0; i<remainder; i++){ printf("%02x ", s[i]); } for (i=0; i<(16-remainder); i++){ printf(" "); } printf(" "); for (i=0; i<remainder; i++){ if (s[i]>=32 && s[i]<=125) printf("%c", s[i]); else printf("."); } for (i=0; i<(16-remainder); i++){ printf(" "); } printf("\n"); } return;} // HexDump.//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;///*// va_list args;// static char printf_buf[512];// int i;//// va_start(args, fmt);// i = vsnprintf(printf_buf, sizeof(printf_buf), fmt, args);// va_end(args);// PrintString("%s",printf_buf);// //return i;// return ;//*/ //}void PrintChar(char *fmt, char c){ SerialOutputByte(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) SerialOutputByte('0'); else SerialOutputByte(' '); } else SerialOutputByte((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) SerialOutputByte((char)(result)+'0'); } } return;}void PrintHex(char *fmt, uint l){ int i, j; char c, tol[10]; uchar *s=(uchar*)fmt; bool flag0=false, flagr=false, flagl=false; // flags. long flagcnt=0; bool leading_zero=true; char uHex, lHex; int cnt; // "%5x"狼 版快 5俺父 免仿窍档废 免仿茄 俺荐. // fmt狼 "%08l(L)x"俊辑 '0', '8', 'l', '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=='r') flagr=true; // SWAP else if (c=='l') flagl=true; // Long Type else continue; } s = (uchar *)(&l); if(!flagr) 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) SerialOutputByte('0'); else SerialOutputByte(' '); } else SerialOutputByte(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) SerialOutputByte('0'); else SerialOutputByte(' '); } else SerialOutputByte(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) SerialOutputByte('0'); else SerialOutputByte(' '); } else SerialOutputByte(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) SerialOutputByte(uHex); if (lHex!=0 || i==3) leading_zero = false; if (lHex<10) lHex+='0'; else lHex+='A'-10; if (!leading_zero) SerialOutputByte(lHex); } } return;}void PrintString(char *fmt, char *s){ if (!fmt || !s) return; while (*s) SerialOutputByte(*s++); return;}int Power(int num, int cnt){ long retval=num; cnt--; while (cnt--){ retval *= num; } return retval;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -