⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lstring.c

📁 这是一个uC/OS-II For cs8900的移植项目源代码.可以在uCOSV252.exe上运行
💻 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 + -