#include "myinclude.h"
/*
*********************************************************************************************************
* 复制
*********************************************************************************************************
*/
void gmemcpy(void *pDst, const void *pSrc, unsigned long iNum)
{
unsigned long i;
char *ucdst;
char *ucsrc;
ucdst = (char *)pDst;
ucsrc = (char *)pSrc;
for(i=0; i<iNum; ++i)
{
*ucdst++ = *ucsrc++;
}
}
/*
*********************************************************************************************************
* 设置
*********************************************************************************************************
*/
void gmemset(void *pDst, unsigned char value, unsigned long iNum)
{
unsigned long i;
char *ucdst;
ucdst = (char*)pDst;
for(i=0; i<iNum; ++i)
{
*ucdst++ = value;
}
}
/*
*********************************************************************************************************
* 比较
*********************************************************************************************************
*/
char gmemcmp(const void *buf1, const void *buf2, unsigned long count)
{
if(!count)
return(0);
while ( --count && *(char *)buf1 == *(char *)buf2)
{
buf1 = (char *)buf1 + 1;
buf2 = (char *)buf2 + 1;
}
return( *((unsigned char *)buf1) - *((unsigned char *)buf2) );
}
/*
*********************************************************************************************************
* 取字符串长度
*********************************************************************************************************
*/
unsigned short gstrlen(const char *strbuf)
{
unsigned short i;
for(i=0; strbuf[i]; i++);
return i;
}
/*
*********************************************************************************************************
* 字符串截取(参数const char*)
*********************************************************************************************************
*/
char *gstrtok(char *strbuf, const char *dm)
{
static char *last;
char *tok;
if(strbuf == NULL)
strbuf = last;
if(strbuf == NULL)
return NULL;
tok = (char *)strbuf;
while((*strbuf) != '\0')
{
while(*dm)
{
if(*strbuf == *dm)
{
*strbuf = '\0';
last = strbuf + 1;
break;
}
strbuf++;
}
}
return tok;
}
/*
*********************************************************************************************************
* 字符串截取(参数char)
*********************************************************************************************************
*/
char *gstrtokc(char *strbuf, char dm)
{
static char *last;
char *tok;
if(strbuf == NULL)
strbuf = last;
if(strbuf == NULL)
return NULL;
tok = (char *)strbuf;
while((*strbuf) != '\0')
{
while(dm)
{
if(*strbuf == dm)
{
*strbuf = '\0';
last = strbuf + 1;
break;
}
strbuf++;
}
}
return tok;
}
/*
*********************************************************************************************************
* 字符串数字转
*********************************************************************************************************
*/
char isspace(char x)
{
if((x==' ')||(x=='\t')||(x=='\n')||(x=='\f')||(x=='\b')||(x=='\r'))
return 1;
else
return 0;
}
char isdigit(char x)
{
if((x<='9') && (x>='0'))
return 1;
else
return 0;
}
long gatoi(const char *nptr)
{
unsigned char c; // current char
unsigned char sign; // if '-', then negative, otherwise positive
long total; // current total
// skip whitespace
while(isspace((char)*nptr))
++nptr;
c = (unsigned char)*nptr++;
sign = c; // save sign indication
if (c == '-' || c == '+')
c = (unsigned char)*nptr++; // skip sign
total = 0;
while (isdigit((char)c)) {
total = 10 * total + (c - '0');// accumulate digit
c = (unsigned char)*nptr++; // get next char
}
if (sign == '-')
return -total;
else
return total; // return result, negated if necessary
}
/*
*********************************************************************************************************
* printf函数
*********************************************************************************************************
*/
//#include <stdarg.h> //使用可变参数必须要加的头文件
#ifdef _M_ALPHA
typedef struct {
char *a0; // pointer to first homed integer argument
int offset; // byte offset of next parameter
} va_list;
#else
typedef char * va_list;
#endif
//_INTSIZEOF 宏,获取类型占用的空间长度,最小占用长度为int的整数倍:
#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
//VA_START宏,获取可变参数列表的第一个参数的地址(ap是类型为va_list的指针,v是可变参数最左边的参数):
#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )
//VA_ARG宏,获取可变参数的当前参数,返回指定类型并将指针指向下一参数(t参数描述了当前参数的类型):
#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
//VA_END宏,清空va_list可变参数列表:
#define va_end(ap) ( ap = (va_list)0 )
/********************************************************************/
typedef struct
{
int dest;
void (*func)(char);
char *loc;
} PRINTK_INFO;
int printk (PRINTK_INFO *, const char *, va_list);
/********************************************************************/
#define FLAGS_MINUS (0x01)
#define FLAGS_PLUS (0x02)
#define FLAGS_SPACE (0x04)
#define FLAGS_ZERO (0x08)
#define FLAGS_POUND (0x10)
#define IS_FLAG_MINUS(a) (a & FLAGS_MINUS)
#define IS_FLAG_PLUS(a) (a & FLAGS_PLUS)
#define IS_FLAG_SPACE(a) (a & FLAGS_SPACE)
#define IS_FLAG_ZERO(a) (a & FLAGS_ZERO)
#define IS_FLAG_POUND(a) (a & FLAGS_POUND)
#define LENMOD_h (0x01)
#define LENMOD_l (0x02)
#define LENMOD_L (0x04)
#define IS_LENMOD_h(a) (a & LENMOD_h)
#define IS_LENMOD_l(a) (a & LENMOD_l)
#define IS_LENMOD_L(a) (a & LENMOD_L)
#define FMT_d (0x0001)
#define FMT_o (0x0002)
#define FMT_x (0x0004)
#define FMT_X (0x0008)
#define FMT_u (0x0010)
#define FMT_c (0x0020)
#define FMT_s (0x0040)
#define FMT_p (0x0080)
#define FMT_n (0x0100)
#define IS_FMT_d(a) (a & FMT_d)
#define IS_FMT_o(a) (a & FMT_o)
#define IS_FMT_x(a) (a & FMT_x)
#define IS_FMT_X(a) (a & FMT_X)
#define IS_FMT_u(a) (a & FMT_u)
#define IS_FMT_c(a) (a & FMT_c)
#define IS_FMT_s(a) (a & FMT_s)
#define IS_FMT_p(a) (a & FMT_p)
#define IS_FMT_n(a) (a & FMT_n)
/********************************************************************/
static void printk_putc (char c, int *count, PRINTK_INFO *info)
{
switch (info->dest)
{
case DEST_CONSOLE:
info->func((unsigned char)c);
break;
case DEST_STRING:
info->func((unsigned char)c);
break;
case DEST_BUFFER:
*info->loc = (unsigned char)c;
没有合适的资源?快使用搜索试试~ 我知道了~
单片机下实现的部分经典C库函数,包括printf,memset等,可以用来学习printf源码实现方法
共2个文件
c:1个
h:1个
2星 需积分: 42 53 下载量 87 浏览量
2015-03-02
16:50:36
上传
评论 3
收藏 5KB RAR 举报
温馨提示
单片机下实现的部分经典C库函数,包括printf,memset等,可以用来学习printf源码实现方法,还包括了memset,memcpy,memcmp,strtok,strlen,sprintf,printf函数的C语言实现方法
资源推荐
资源详情
资源评论
收起资源包目录
user_clib.rar (2个子文件)
GeneralFX.h 1KB
GeneralFX.c 23KB
共 2 条
- 1
资源评论
- Fighting@20202020-03-29搬运的代码,一般般吧,不好阅读
- Alphatyy2020-11-17对我来说,基本没用
- 千鸟逐风2018-04-25看不懂,注释比较少
tstfx
- 粉丝: 3
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功