1
- use core:: ffi:: VaListImpl ;
2
- use core:: fmt:: Write ;
3
-
4
1
/// Implements edge-nal traits
5
2
#[ cfg( feature = "edge-nal" ) ]
6
3
pub mod edge_nal_compat;
7
4
8
- #[ no_mangle]
9
- pub unsafe extern "C" fn snprintf ( dst : * mut u8 , n : u32 , format : * const u8 , args: ...) -> i32 {
10
- vsnprintf ( dst, n, format, args)
11
- }
12
-
13
- #[ no_mangle]
14
- extern "C" fn vsnprintf (
15
- dst : * mut u8 ,
16
- _max_len : u32 ,
17
- format : * const u8 ,
18
- mut args : VaListImpl ,
19
- ) -> i32 {
20
- unsafe {
21
- let fmt_str_ptr = format;
22
- let mut res_str = StrBuf :: new ( ) ;
23
-
24
- let strbuf = StrBuf :: from ( fmt_str_ptr) ;
25
- let s = strbuf. as_str_ref ( ) ;
26
-
27
- let mut format_char = ' ' ;
28
- let mut is_long = false ;
29
- let mut found = false ;
30
- for c in s. chars ( ) . into_iter ( ) {
31
- if !found {
32
- if c == '%' {
33
- found = true ;
34
- }
35
-
36
- if !found {
37
- res_str. append_char ( c) ;
38
- }
39
- } else {
40
- if c. is_numeric ( ) || c == '-' || c == 'l' || c == 'z' || c == '#' {
41
- if c == 'l' {
42
- is_long = true ;
43
- }
44
- // ignore
45
- } else {
46
- // a format char
47
- format_char = c;
48
- }
49
- }
50
-
51
- if found && format_char != ' ' {
52
- // have to format an arg
53
- match format_char {
54
- 'd' => {
55
- if is_long {
56
- let v = args. arg :: < i32 > ( ) ;
57
- write ! ( res_str, "{}" , v) . ok ( ) ;
58
- } else {
59
- let v = args. arg :: < i32 > ( ) ;
60
- write ! ( res_str, "{}" , v) . ok ( ) ;
61
- }
62
- }
63
-
64
- 'u' => {
65
- let v = args. arg :: < u32 > ( ) ;
66
- write ! ( res_str, "{}" , v) . ok ( ) ;
67
- }
68
-
69
- 'p' => {
70
- let v = args. arg :: < u32 > ( ) ;
71
- write ! ( res_str, "0x{:x}" , v) . ok ( ) ;
72
- }
73
-
74
- 'X' => {
75
- let v = args. arg :: < u32 > ( ) ;
76
- write ! ( res_str, "{:02x}" , ( v & 0xff000000 ) >> 24 ) . ok ( ) ;
77
- }
78
-
79
- 'x' => {
80
- let v = args. arg :: < u32 > ( ) ;
81
- write ! ( res_str, "{:02x}" , v) . ok ( ) ;
82
- }
83
-
84
- 's' => {
85
- let v = args. arg :: < u32 > ( ) as * const i8 ;
86
- let str = core:: ffi:: CStr :: from_ptr ( v) ;
87
- let str = match str. to_str ( ) {
88
- Ok ( str) => str,
89
- Err ( _err) => "Invalid" ,
90
- } ;
91
- write ! ( res_str, "{}" , str ) . ok ( ) ;
92
- }
93
-
94
- 'c' => {
95
- let v = args. arg :: < u8 > ( ) ;
96
- if v != 0 {
97
- write ! ( res_str, "{}" , v as char ) . ok ( ) ;
98
- }
99
- }
100
-
101
- _ => {
102
- write ! ( res_str, "<UNKNOWN{}>" , format_char) . ok ( ) ;
103
- }
104
- }
105
-
106
- format_char = ' ' ;
107
- found = false ;
108
- is_long = false ;
109
- }
110
- }
111
-
112
- // TODO apply max_len
113
- core:: ptr:: copy_nonoverlapping ( res_str. buffer . as_ptr ( ) , dst, res_str. len ) ;
114
- let idx = res_str. len as isize ;
115
- * ( dst. offset ( idx) ) = 0 ;
116
-
117
- idx as i32
118
- }
119
- }
120
-
121
5
#[ no_mangle]
122
6
extern "C" fn rand ( ) -> crate :: c_ulong {
123
7
unsafe { crate :: random ( ) }
@@ -136,22 +20,6 @@ impl StrBuf {
136
20
}
137
21
}
138
22
139
- pub unsafe fn from ( c_str : * const u8 ) -> StrBuf {
140
- let mut res = StrBuf {
141
- buffer : [ 0u8 ; 512 ] ,
142
- len : 0 ,
143
- } ;
144
-
145
- let mut idx: usize = 0 ;
146
- while * ( c_str. offset ( idx as isize ) ) != 0 {
147
- res. buffer [ idx] = * ( c_str. offset ( idx as isize ) ) ;
148
- idx += 1 ;
149
- }
150
-
151
- res. len = idx;
152
- res
153
- }
154
-
155
23
pub fn append ( & mut self , s : & str ) {
156
24
let mut idx: usize = self . len ;
157
25
s. chars ( ) . for_each ( |c| {
0 commit comments