Linux内核中的printf实现
1 #ifndef __PRINT_H_
2 #define __PRINT_H_
3
4 void print(char* fmt, ...);
5 void printch(char ch);
6 void printdec(int dec);
7 void printflt(double flt);
8 void printbin(int bin);
9 void printhex(int hex);
10 void printstr(char* str);
11
12 #define console_print(ch) putchar(ch)
13
14 #endif /*#ifndef __PRINT_H_*/
#include <stdio.h>
2 #include <stdarg.h>
3 #include "print.h"
4
5 int main(void)
6 {
7 print("print: %c\n", 'c');
8 print("print %d\n", 1234567);
9 print("print: %f\n", 1234567.1234567);
10 print("print: %s\n", "string test");
11 print("print: %b\n", 0x12345ff);
12 print("print: %x\n", 0xabcdef);
13 print("print: %%\n");
14 return 0;
15 }
16
17 void print(char* fmt, ...)
18 {
19 double vargflt = 0;
20 int vargint = 0;
21 char* vargpch = NULL;
22 char vargch = 0;
23 char* pfmt = NULL;
24 va_list vp;
25
26 va_start(vp, fmt);
27 pfmt = fmt;
28
29 while(*pfmt)
30 {
31 if(*pfmt == '%')
32 {
33 switch(*(++pfmt))
34 {
35
36 case 'c':
37 vargch = va_arg(vp, int);
38 /* va_arg(ap, type), if type is narrow type (char, short, float) an error is given in strict ANSI
39 mode, or a warning otherwise.In non-strict ANSI mode, 'type' is allowed to be any expression. */
40 printch(vargch);
41 break;
42 case 'd':
43 case 'i':
44 vargint = va_arg(vp, int);
45 printdec(vargint);
46 break;
47 case 'f':
48 vargflt = va_arg(vp, double);
49 /* va_arg(ap, type), if type is narrow type (char, short, float) an error is given in strict ANSI
50 mode, or a warning otherwise.In non-strict ANSI mode, 'type' is allowed to be any expression. */
51 printflt(vargflt);
52 break;
53 case 's':
54 vargpch = va_arg(vp, char*);
55 printstr(vargpch);
56 break;
57 case 'b':
58 case 'B':
59 vargint = va_arg(vp, int);
60 printbin(vargint);
61 break;
62 case 'x':
63 case 'X':
64 vargint = va_arg(vp, int);
65 printhex(vargint);
66 break;
67 case '%':
68 printch('%');
69 break;
70 default:
71 break;
72 }
73 pfmt++;
74 }
75 else
76 {
77 printch(*pfmt++);
78 }
79 }
80 va_end(vp);
81 }
82
83 void printch(char ch)
84 {
85 console_print(ch);
86 }
87
88 void printdec(int dec)
89 {
90 if(dec==0)
91 {
92 return;
93 }
94 printdec(dec/10);
95 printch( (char)(dec%10 + '0'));
96 }
97
98 void printflt(double flt)
99 {
100 int icnt = 0;
101 int tmpint = 0;
102
103 tmpint = (int)flt;
104 printdec(tmpint);
105 printch('.');
106 flt = flt - tmpint;
107 tmpint = (int)(flt * 1000000);
108 printdec(tmpint);
109 }
110
111 void printstr(char* str)
112 {
113 while(*str)
114 {
115 printch(*str++);
116 }
117 }
118
119 void printbin(int bin)
120 {
121 if(bin == 0)
122 {
123 printstr("0b");
124 return;
125 }
126 printbin(bin/2);
127 printch( (char)(bin%2 + '0'));
128 }
129
130 void printhex(int hex)
131 {
132 if(hex==0)
133 {
134 printstr("0x");
135 return;
136 }
137 printhex(hex/16);
138 if(hex < 10)
139 {
140 printch((char)(hex%16 + '0'));
141 }
142 else
143 {
144 printch((char)(hex%16 - 10 + 'a' ));
145 }
146 }
Linux内核中的printf实现的更多相关文章
- Linux内核中的printf实现【转】
转自:http://www.cnblogs.com/chenglei/archive/2009/08/06/1540702.html 从main.c中的printf开始读这个函数. 首先看printf ...
- Linux内核中双向链表的经典实现
概要 前面一章"介绍双向链表并给出了C/C++/Java三种实现",本章继续对双向链表进行探讨,介绍的内容是Linux内核中双向链表的经典实现和用法.其中,也会涉及到Linux内核 ...
- (十)Linux内核中的常用宏container_of
Container_of在Linux内核中是一个常用的宏,用于从包含在某个结构中的指针获得结构本身的指针,通俗地讲就是通过结构体变量中某个成员的首地址进而获得整个结构体变量的首地址. Containe ...
- Linux内核中的常用宏container_of
Container_of在Linux内核中是一个常用的宏,用于从包含在某个结构中的指针获得结构本身的指针,通俗地讲就是通过结构体变量中某个成员的首地址进而获得整个结构体变量的首地址. Containe ...
- linux内核中的C语言常规算法(前提:你的编译器要支持typeof和type)
学过C语言的伙伴都知道,曾经比较两个数,输出最大或最小的一个,或者是比较三个数,输出最大或者最小的那个,又或是两个数交换,又或是绝对值等等,其实这些算法在linux内核中通通都有实现,以下的代码是我从 ...
- linux内核中的排序接口--sort函数
linux内核中的sort函数,其实跟我们所说的qsort函数很像,我们来看看qsort: qsort 的函数原型是 void qsort(void*base,size_t num,size_t wi ...
- C语言在linux内核中do while(0)妙用之法
为什么说do while(0) 妙?因为它的确就是妙,而且在linux内核中实现是相当的妙,我们来看看内核中的相关代码: #define db_error(fmt, ...) \ do { \ fpr ...
- Linux内核中的常用宏container_of其实很简单【转】
转自:http://blog.csdn.net/npy_lp/article/details/7010752 开发平台:Ubuntu11.04 编 译器:gcc version 4.5.2 (Ubun ...
- Linux内核中的信号机制--一个简单的例子【转】
本文转载自:http://blog.csdn.net/ce123_zhouwei/article/details/8562958 Linux内核中的信号机制--一个简单的例子 Author:ce123 ...
随机推荐
- NS3可视化及动画工具(PyViz和NetAnim)
一.PyViz安装 1.安装依赖包 sudo apt-get install python-dev python-pygraphviz python-kiwi python-pygoocanvas p ...
- java 删除多层文件夹
/** * 因为不小心,写了一个死循环,在电脑里创建的了n多层空文件夹 * 并且手动最外层删除不掉. * 所以用写了本代码,从里向外的进行删除操作. * @author Singularity * @ ...
- nodejs-QQ空间灌水
在本地编写javascript代码,node环境下命令行内运行,请求网页实现给QQ好友留言. 1.登录QQ空间,给好友留言,在开发者工具中打开网络面板,在network中找到addXXX开头的请求. ...
- 使用new来分配内存
对指针的工作方式有一定的了解之后,来看看他如何实现在程序运行时分配内存.前面我们都将指针初始化为变量的地址(int * pt; pt = & a):变量是在编译时分配的有名称的内存,而指针只是 ...
- vue 数字随机滚动(数字递增)
html: <span v-for="i in numArr">{{i}}</span> data: numArr: [], methods: perN ...
- 锋利的jQuery初学(5)
层级选择器: 层级选择器 符号 解释 使用 空格 后代选择器 $("div p").css("","") + 紧邻选择器 $("d ...
- Python学习笔记,day3
Python学习第三天 一.集合 集合是一个无序的,不重复的数据组合,它的主要作用如下: 去重,把一个列表变成集合,就自动去重了 关系测试,测试两组数据之前的交集.差集.并集等关系 常用操作: s = ...
- python 一些方法的时间测试
尝试一些方法的不同实现,比较一下时间,电脑比较渣,不过只是做个比较 虽然用python主要是方便,肯定是不快的,不过能快一点还是快一点好 numpy中大量使用同样 shape 的全 0 array,可 ...
- Linux第十节课学习笔记
部署LVM三步: 1.pv:使设备支持LVM: 2.vg:对支持LVM的设备进行整合: 3.lv:将整合的空间进行切割. 每个基本单元PE的大小为4M,分配空间必须是4M的整数倍.可以容量或基本单元个 ...
- 【python】问题汇总
1.pip降级 python -m pip install pip==9.0.3 2. Flask利用pymysql出现Warning:1366的解决办法 错误提示:(1366, "Inco ...