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 ...
随机推荐
- Centos7.5系统 SSH升级到7.9
SSH7.9安装 #!/bin/bash#删除旧版ssh包 危险操作,不删除也可以安装,建议跳过此操作.#rpm -e `rpm -qa | grep openssh` #安装zlib依赖包wget ...
- OnApplicationFocus & OnApplicationPause &时间戳
锁屏.切到后台 程序强制暂停时使用 private long leaveTime; private void OnApplicationFocus(bool focus) { if (focus==f ...
- Codeforces1100F. Ivan and Burgers(离线+线性基)
题目链接:传送门 思路: 按查询的右端点离线. 然后从左到右维护线性基. 每个基底更新为最右边的方案,可以让尽量多的查询享受到这个基底. 用ci维护后更新右端点为i的答案. 代码(析构1000ms,别 ...
- Python之简单验证码实现
def v_code(): ret = '' for i in range(5): num = random.randint(0,9) alf = chr(random.randint(65,122) ...
- IntelliJ IDEA 使用教程
在IDEA当中,Project和 Module是作为两个不同的概念,对项目结构是重要意义的 eclipse和idea的区别 IDEA里面的子工程要称为Module就是模块化的概念,作为聚合工程亦或普 ...
- gradle安装操作
下载你所需要对应的版本,gradle-4.3.1-bin.zip 下载后解压到你想要的目录 设置环境变量 在cmd模式下查看,出现信息证明安装成功
- 洛谷10月月赛II题解
[咻咻咻] (https://www.luogu.org/contestnew/show/11616) 令人窒息的洛谷月赛,即将参加NOIp的我竟然只会一道题(也可以说一道也不会),最终145的我只能 ...
- Azure DevOps Server/Team Foundation Server
TFS wasn't designed specifically to support a requirements management process. Epics are like big st ...
- GanttProject 如何显示今天和项目结束
GanttProject 如何显示今天和项目结束 GanttProject 在甘特图中可以很直观的看出项目开始和结束. 同时也可以看到今天的. 把今天的时间线打开,默认是关闭.
- idea调试代码跟踪到tomcat代码里面
在POM.xml文件里面加上如下代码即可: <dependency> <groupId>org.apache.tomcat</groupId> <artifa ...