/******************************************************************
类型定义
*******************************************************************/
typedef char * va_list;
/******************************************************************
可变参数的宏定义
*******************************************************************/
#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )
#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
#define va_end(ap) ( ap = (va_list)0 )
/*****************************************************************
函数声明
*******************************************************************/
void myputchar(char c);
void number_to_char_printf(int num);
void myprintf(char *,...);
int location(int arow,int row) ;
/*****************************************************************
全局变量
******************************************************************/
int arow=10,row=80;/*定位从arow行row列开始打印,基地址从0xb8000000开始*/
int position=0;/*记录目前打印到终端的个数,*/
/*****************************************************************
主程序main人口
*******************************************************************/
main()
{ char c='?',a[6]="test";
int b=100;
myprintf("%%%**** this is my %s %c number is %d %%%",a,c,b);
}
void myprintf(char * format,...)
{
va_list ap;
char c;
va_start(ap,format);
while(c=*format++){
switch(c){
/*可以添加%的格式打印*/
case '%': {
switch(*format){
/*可以添加%c的格式打印*/
case 'c':{
char ch = va_arg(ap , int);
myputchar (ch);
format++;
break;
}
/*可以添加%d的格式打印*/
case 'd':{
int num= va_arg(ap,int);
number_to_char_printf(num);
format++;
break;
}
/*可以添加%s的格式打印,*/
case 's':{
char * ch= va_arg(ap,int);
myputs(ch);
format++;
break;
}
/*可以添加%f的格式打印,你懂的,自己实现吧*/
case 'f':{
}
/*如果不是匹配格式,直接打印%字符*/
default:{
myputchar (c);
break;
}
}
break;
}
/*是不是制表符*/
case '\t': {
}
/*是不是回车,你懂的,自己实现吧*/
case '\n': {
}
default:myputchar(c);
}
}
va_end(ap);
}
/******************************************************************
number_to_char_printf:
把一个整型类型的数转化成字符类型,储存
在numchar数组里,然后把numchar数组里的
字符串打印到终端。
输入:
num 一个int型变量
输出:
没有
返回值类型:
无返回值
*******************************************************************/
void number_to_char_printf(int num)
{
char numchar[5];
int temp=num,n=0;
while(temp){
numchar[n++]=temp%10+'0';
temp=temp/10;
}
n--;
do{
myputchar(numchar[n--]);
}while(n+1);
}
/******************************************************************
myputchar:
打印一个字符串,把字符打印到终端。
输入:
c 一个char *型变量
输出:
没有
返回值:
返回字符串的个数n
*******************************************************************/
int myputs(char * c)
{
int n=0;
for(;*c!=0;c++){
myputchar(*c);
n++;
}
return n;
}
/******************************************************************
myputchar:
打印一个字符,把字符打印到终端。
输入:
c 一个char型变量
输出:
没有
返回值类型:
无返回值
*******************************************************************/
void myputchar(char c)
{
int pos=location(arow,row);
while(1){
*(char far *)(0xb8000000+pos+2*position)=c;
position++;
break;
}
}
/******************************************************************
location:
定位要把字符打印到终端的行与列。
输入:
arow 行号
row 列号
输出:
没有
返回值类型:
无返回值
*******************************************************************/
int location(int arow,int row)
{
return 160*arow+row;
} |