📄 lstring.c
字号:
/******************************************************************************
* Filename : util.c *
* Program : loader. *
* Copyright : Copyright (C) 2001, Young-Su, Ahn. *
* Author : Young-Su, Ahn <nurie@dreamwiz.com> *
* Description : Simple utility functions for loader. *
* Created at : Wed Mar 13 2001. *
* Based on : blob-1.0.8-pre2 (http://www.lart.tudelft.nl) *
* Modified by : *
* Modified at : *
******************************************************************************/
/* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#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, int value);
static void PrintString(char *fmt, char *cptr);
static int Power(int num, int cnt);
// 开且 : long屈栏肺 memory狼 郴侩 汗荤.
// 加档甫 吝矫窍瘤 臼绰 促搁 肋 荤侩救窃????
// 概俺 :
// 馆券 :
// 林狼 : numWords绰 4 byte 窜困狼 俺荐.
void MemCpy32(void *dest, void *src, int numWords){
volatile long *s1=dest, *s2=src;
while(numWords--) {
*s1++ = *s2++;
}
return;
} // MemCpy32.
// 开且 : char屈栏肺 memory狼 郴侩 汗荤.
// 概俺 :
// 馆券 :
// 林狼 : cnt绰 1 byte 窜困狼 辨捞.
void MemCpy(void *dest, void *src, int cnt){
char *s1=dest, *s2=src, *endptr=(char *)dest+cnt;
while (s1<endptr)
*s1++ = *s2++;
return;
} // MemCpy.
// 开且 : memory甫 漂沥茄 蔼栏肺 盲框. man memset.
// 概俺 : dest : 林家.
// c : 盲匡 巩磊.
// len : 1 byte 窜困狼 辨捞.
// 馆券 :
// 林狼 :
void MemSet(void *dest, char c, int len){
char *s=dest;
char *limit = (char *)dest+len;
while (s < limit) *s++ = c;
} // MemSet.
// 开且 : addr1, addr2 memory俊 扁废等 蔼阑 辨捞 len父怒 厚背.
// 概俺 : dest : 林家.
// 馆券 : return : 0 : equal ret : addr1 > addr2 -ret : addr1 < addr2.
// 林狼 :
int MemCmp(void *addr1, void *addr2, int len){
volatile char *s1=addr1, *s2=addr2;
volatile char *endptr = addr1+len;
while ((ulong)s1 < (ulong)endptr){
if (*s1++ != *s2++) return *(--s1) - *(--s2);
}
return 0;
} // MemCmp.
// 开且 : 巩磊凯 汗荤. '\0'啊 唱棵 锭鳖瘤.
// 概俺 : dest : 措惑 林家.
// src : 盔夯 林家.
// 馆券 :
// 林狼 :
void StrCpy(char *dest, char *src){
volatile char *s1=dest, *s2=src;
while (*s2!=0) *s1++ = *s2++;
*s1 = 0;
return;
} // StrCpy.
// 巩磊凯 辨捞 备窍扁.
// return : 巩磊凯 辨捞.
int StrLen(char *dest){
volatile char *tmp = dest;
if (!tmp) return -1;
while (*tmp!=0) tmp++;
return (tmp - dest);
} // StrLen.
// 巩磊凯 s1, s2阑 辨捞 len狼 裹困 捞郴俊辑 厚背.
// return : 0 : equil ret : s1 > s2 -ret : s1 < s2
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.
// 巩磊凯 s1, s2甫 厚背.
// return : 0 : equil ret : s1 > s2 -ret : s1 < s2
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.
// 开且 : 16柳荐 巩磊凯 s俊辑 1, 2, 4 byte 沥荐屈阑 父甸绢 retval俊 扁废.
// 概俺 : s : 函券且 巩磊凯狼 林家.
// retval : 函券等 蔼捞 扁废瞪 林家. short肺 函券窍绊磊 窍搁 short * 屈捞绢具 窃.
// type : char : 8, short : 16, long : 32.
// 馆券 : return : 1 : success 0 : failure.
// 林狼 : no type check. retval狼 函荐屈俊 林狼秦辑 荤侩窍技夸....
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.
// 开且 : 10柳荐 巩磊凯 s俊辑 沥荐甫 父甸绢 retval捞 啊府虐绰 困摹俊 扁废.
// 概俺 : s : 函券且 巩磊凯狼 林家.
// retval : 函券等 蔼捞 扁废瞪 林家.
// 馆券 : return : 1 : success 0 : failure.
// 林狼 :
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.
#ifndef TINY_LOADER
// hexdump.
// 免仿.
// offset Hex Value Ascii Value
// 0x00000000 ff 0A 7A 79 00 00 78 7D ff 0A 7A 79 00 00 78 7D ..zy..x}..zy..x}
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.
#endif
// 开且 : printf() 吝 老何甫 埃窜窍霸 备泅.
// 概俺 : fmt : printf()客 悼老窍唱 "%s", "%c", "%d", "%x" 荤侩 啊瓷.
// %d, %x狼 版快俊绰 "%08x", "%8x"客 鞍捞 唱鸥尘 辨捞客 后 傍埃阑 0栏肺 盲匡瘤 急琶 啊瓷.
// 馆券 : 绝澜.
// 林狼 : 绝澜.
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){
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, 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) 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 + -