10
10
use cast:: transmute;
11
11
use either:: * ;
12
12
use libc:: { c_void, uintptr_t, c_char, exit, STDERR_FILENO } ;
13
- use option:: { Some , None , Option } ;
13
+ use option:: { Some , None } ;
14
14
use rt:: util:: dumb_println;
15
15
use str:: StrSlice ;
16
16
use str:: raw:: from_c_str;
@@ -20,7 +20,7 @@ use vec::ImmutableVector;
20
20
21
21
22
22
struct LogDirective {
23
- name : Option < ~str > ,
23
+ name : ~str ,
24
24
level : u32
25
25
}
26
26
@@ -30,6 +30,7 @@ struct ModEntry{
30
30
log_level : * mut u32
31
31
}
32
32
33
+ static MAX_LOG_DIRECTIVES : u32 = 255 ;
33
34
static MAX_LOG_LEVEL : u32 = 255 ;
34
35
static DEFAULT_LOG_LEVEL : u32 = 1 ;
35
36
@@ -67,82 +68,42 @@ fn iter_crate_map(map: *u8, f: &fn(*mut ModEntry)) {
67
68
data : * c_void ) ;
68
69
}
69
70
}
70
- static log_level_names : & ' static [ & ' static str ] = & ' static[ "error" , "warn" , "info" , "debug" ] ;
71
-
72
- /// Parse an individual log level that is either a number or a symbolic log level
73
- fn parse_log_level ( level : & str ) -> Option < u32 > {
74
- let num = u32:: from_str ( level) ;
75
- let mut log_level;
76
- match num {
77
- Some ( num) => {
78
- if num < MAX_LOG_LEVEL {
79
- log_level = Some ( num) ;
80
- } else {
81
- log_level = Some ( MAX_LOG_LEVEL ) ;
82
- }
83
- }
84
- _ => {
85
- let position = log_level_names. iter ( ) . position ( |& name| name == level) ;
86
- match position {
87
- Some ( position) => {
88
- log_level = Some ( u32:: min ( MAX_LOG_LEVEL , ( position + 1 ) as u32 ) )
89
- } ,
90
- _ => {
91
- log_level = None ;
92
- }
93
- }
94
- }
95
- }
96
- log_level
97
- }
98
-
99
71
100
72
/// Parse a logging specification string (e.g: "crate1,crate2::mod3,crate3::x=1")
101
73
/// and return a vector with log directives.
102
- /// Valid log levels are 0-255, with the most likely ones being 1-4 (defined in std::).
103
- /// Also supports string log levels of error, warn, info, and debug
104
-
74
+ /// Valid log levels are 0-255, with the most likely ones being 0-3 (defined in std::).
105
75
fn parse_logging_spec ( spec : ~str ) -> ~[ LogDirective ] {
106
76
let mut dirs = ~[ ] ;
107
77
for s in spec. split_iter ( ',' ) {
108
78
let parts: ~[ & str ] = s. split_iter ( '=' ) . collect ( ) ;
109
- let mut log_level;
110
- let mut name = Some ( parts[ 0 ] . to_owned ( ) ) ;
79
+ let mut loglevel;
111
80
match parts. len ( ) {
112
- 1 => {
113
- //if the single argument is a log-level string or number,
114
- //treat that as a global fallback
115
- let possible_log_level = parse_log_level ( parts[ 0 ] ) ;
116
- match possible_log_level {
117
- Some ( num) => {
118
- name = None ;
119
- log_level = num;
120
- } ,
121
- _ => {
122
- log_level = MAX_LOG_LEVEL
123
- }
124
- }
125
- }
81
+ 1 => loglevel = MAX_LOG_LEVEL ,
126
82
2 => {
127
- let possible_log_level = parse_log_level ( parts[ 1 ] ) ;
128
- match possible_log_level {
83
+ let num = u32 :: from_str ( parts[ 1 ] ) ;
84
+ match ( num ) {
129
85
Some ( num) => {
130
- log_level = num;
131
- } ,
86
+ if num < MAX_LOG_LEVEL {
87
+ loglevel = num;
88
+ } else {
89
+ loglevel = MAX_LOG_LEVEL ;
90
+ }
91
+ }
132
92
_ => {
133
- dumb_println ( fmt ! ( "warning: invalid logging spec \
134
- '%s', ignoring it", parts [ 1 ] ) ) ;
135
- loop ;
93
+ dumb_println ( fmt ! ( "warning: invalid logging spec \
94
+ '%s', ignoring it", s ) ) ;
95
+ loop ;
136
96
}
137
97
}
98
+ if loglevel > MAX_LOG_LEVEL { loglevel = MAX_LOG_LEVEL }
138
99
} ,
139
100
_ => {
140
101
dumb_println ( fmt ! ( "warning: invalid logging spec '%s',\
141
102
ignoring it", s) ) ;
142
103
loop ;
143
104
}
144
105
}
145
- let dir = LogDirective { name : name , level : log_level } ;
106
+ let dir = LogDirective { name : parts [ 0 ] . to_owned ( ) , level : loglevel } ;
146
107
dirs. push ( dir) ;
147
108
}
148
109
return dirs;
@@ -152,30 +113,18 @@ fn parse_logging_spec(spec: ~str) -> ~[LogDirective]{
152
113
/// of log directives
153
114
fn update_entry ( dirs : & [ LogDirective ] , entry : * mut ModEntry ) -> u32 {
154
115
let mut new_lvl: u32 = DEFAULT_LOG_LEVEL ;
155
- let mut longest_match = - 1 i ;
116
+ let mut longest_match = 0 ;
156
117
unsafe {
157
118
for dir in dirs. iter ( ) {
158
- match dir. name {
159
- None => {
160
- if longest_match == -1 {
161
- longest_match = 0 ;
162
- new_lvl = dir. level ;
163
- }
164
- }
165
- Some ( ref dir_name) => {
166
- let name = from_c_str ( ( * entry) . name ) ;
167
- let len = dir_name. len ( ) as int ;
168
- if name. starts_with ( * dir_name) &&
169
- len >= longest_match {
170
- longest_match = len;
171
- new_lvl = dir. level ;
172
- }
173
- }
174
- } ;
119
+ let name = from_c_str ( ( * entry) . name ) ;
120
+ if name. starts_with ( dir. name ) && dir. name . len ( ) > longest_match {
121
+ longest_match = dir. name . len ( ) ;
122
+ new_lvl = dir. level ;
123
+ }
175
124
}
176
125
* ( * entry) . log_level = new_lvl;
177
126
}
178
- if longest_match >= 0 { return 1 ; } else { return 0 ; }
127
+ if longest_match > 0 { return 1 ; } else { return 0 ; }
179
128
}
180
129
181
130
#[ fixed_stack_segment] #[ inline( never) ]
@@ -289,66 +238,45 @@ extern {
289
238
// Tests for parse_logging_spec()
290
239
#[ test]
291
240
fn parse_logging_spec_valid ( ) {
292
- let dirs = parse_logging_spec ( ~"crate1:: mod1=1 , crate1:: mod2, crate2=4 ") ;
241
+ let dirs: ~ [ LogDirective ] = parse_logging_spec ( ~"crate1:: mod1=1 , crate1:: mod2, crate2=4 ") ;
293
242
assert_eq ! ( dirs. len( ) , 3 ) ;
294
- assert!( dirs[ 0 ] . name == Some ( ~"crate1:: mod1") );
243
+ assert ! ( dirs[ 0 ] . name == ~"crate1:: mod1");
295
244
assert_eq!(dirs[0].level, 1);
296
245
297
- assert!(dirs[1].name == Some( ~" crate1:: mod2") );
246
+ assert!(dirs[1].name == ~" crate1:: mod2");
298
247
assert_eq!(dirs[1].level, MAX_LOG_LEVEL);
299
248
300
- assert!(dirs[2].name == Some( ~" crate2") );
249
+ assert!(dirs[2].name == ~" crate2");
301
250
assert_eq!(dirs[2].level, 4);
302
251
}
303
252
304
253
#[test]
305
254
fn parse_logging_spec_invalid_crate() {
306
255
// test parse_logging_spec with multiple = in specification
307
- let dirs = parse_logging_spec(~" crate1:: mod1=1 =2 , crate2=4 ");
256
+ let dirs: ~[LogDirective] = parse_logging_spec(~" crate1:: mod1=1 =2 , crate2=4 ");
308
257
assert_eq!(dirs.len(), 1);
309
- assert!(dirs[0].name == Some( ~" crate2") );
258
+ assert!(dirs[0].name == ~" crate2");
310
259
assert_eq!(dirs[0].level, 4);
311
260
}
312
261
313
262
#[test]
314
263
fn parse_logging_spec_invalid_log_level() {
315
264
// test parse_logging_spec with 'noNumber' as log level
316
- let dirs = parse_logging_spec(~" crate1:: mod1=noNumber, crate2=4 ");
265
+ let dirs: ~[LogDirective] = parse_logging_spec(~" crate1:: mod1=noNumber, crate2=4 ");
317
266
assert_eq!(dirs.len(), 1);
318
- assert!(dirs[0].name == Some( ~" crate2") );
267
+ assert!(dirs[0].name == ~" crate2");
319
268
assert_eq!(dirs[0].level, 4);
320
269
}
321
270
322
- #[test]
323
- fn parse_logging_spec_string_log_level() {
324
- // test parse_logging_spec with 'warn' as log level
325
- let dirs = parse_logging_spec(~" crate1:: mod1=wrong, crate2=warn");
326
- assert_eq!(dirs.len(), 1);
327
- assert!(dirs[0].name == Some(~" crate2"));
328
- assert_eq!(dirs[0].level, 2);
329
- }
330
-
331
- #[test]
332
- fn parse_logging_spec_global() {
333
- // test parse_logging_spec with no crate
334
- let dirs = parse_logging_spec(~" warn, crate2=4 ");
335
- assert_eq!(dirs.len(), 2);
336
- assert!(dirs[0].name == None);
337
- assert_eq!(dirs[0].level, 2);
338
- assert!(dirs[1].name == Some(~" crate2"));
339
- assert_eq!(dirs[1].level, 4);
340
- }
341
-
342
271
// Tests for update_entry
343
272
#[test]
344
273
fn update_entry_match_full_path() {
345
274
use c_str::ToCStr;
346
- let dirs = ~[LogDirective {name: Some(~" crate1:: mod1"), level: 2 },
347
- LogDirective {name: Some(~" crate2"), level: 3}];
348
- let level = &mut 0;
275
+ let dirs = ~[LogDirective {name: ~" crate1:: mod1", level: 2 },
276
+ LogDirective {name: ~" crate2", level: 3}];
349
277
unsafe {
350
278
do " crate1:: mod1".to_c_str().with_ref |ptr| {
351
- let entry= &ModEntry {name: ptr, log_level: level };
279
+ let entry= &ModEntry {name: ptr, log_level: &mut 0 };
352
280
let m = update_entry(dirs, transmute(entry));
353
281
assert!(*entry.log_level == 2);
354
282
assert!(m == 1);
@@ -359,12 +287,11 @@ fn update_entry_match_full_path() {
359
287
#[test]
360
288
fn update_entry_no_match() {
361
289
use c_str::ToCStr;
362
- let dirs = ~[LogDirective {name: Some(~" crate1:: mod1"), level: 2 },
363
- LogDirective {name: Some(~" crate2"), level: 3}];
364
- let level = &mut 0;
290
+ let dirs = ~[LogDirective {name: ~" crate1:: mod1", level: 2 },
291
+ LogDirective {name: ~" crate2", level: 3}];
365
292
unsafe {
366
293
do " crate3:: mod1".to_c_str().with_ref |ptr| {
367
- let entry= &ModEntry {name: ptr, log_level: level };
294
+ let entry= &ModEntry {name: ptr, log_level: &mut 0 };
368
295
let m = update_entry(dirs, transmute(entry));
369
296
assert!(*entry.log_level == DEFAULT_LOG_LEVEL);
370
297
assert!(m == 0);
@@ -375,12 +302,11 @@ fn update_entry_no_match() {
375
302
#[test]
376
303
fn update_entry_match_beginning() {
377
304
use c_str::ToCStr;
378
- let dirs = ~[LogDirective {name: Some(~" crate1:: mod1"), level: 2 },
379
- LogDirective {name: Some(~" crate2"), level: 3}];
380
- let level = &mut 0;
305
+ let dirs = ~[LogDirective {name: ~" crate1:: mod1", level: 2 },
306
+ LogDirective {name: ~" crate2", level: 3}];
381
307
unsafe {
382
308
do " crate2:: mod1".to_c_str().with_ref |ptr| {
383
- let entry= &ModEntry {name: ptr, log_level: level };
309
+ let entry= &ModEntry {name: ptr, log_level: &mut 0 };
384
310
let m = update_entry(dirs, transmute(entry));
385
311
assert!(*entry.log_level == 3);
386
312
assert!(m == 1);
@@ -391,39 +317,14 @@ fn update_entry_match_beginning() {
391
317
#[test]
392
318
fn update_entry_match_beginning_longest_match() {
393
319
use c_str::ToCStr;
394
- let dirs = ~[LogDirective {name: Some(~" crate1:: mod1"), level: 2 },
395
- LogDirective {name: Some(~" crate2"), level: 3},
396
- LogDirective {name: Some(~" crate2:: mod "), level: 4}];
397
- let level = &mut 0;
320
+ let dirs = ~[LogDirective {name: ~" crate1:: mod1", level: 2 },
321
+ LogDirective {name: ~" crate2", level: 3}, LogDirective {name: ~" crate2:: mod ", level: 4}];
398
322
unsafe {
399
323
do " crate2:: mod1" . to_c_str( ) . with_ref |ptr| {
400
- let entry = &ModEntry {name: ptr, log_level: level };
324
+ let entry = & ModEntry { name: ptr, log_level: & mut 0 } ;
401
325
let m = update_entry( dirs, transmute( entry) ) ;
402
326
assert!( * entry. log_level == 4 ) ;
403
327
assert!( m == 1 ) ;
404
328
}
405
329
}
406
330
}
407
-
408
- #[test]
409
- fn update_entry_match_default() {
410
- use c_str::ToCStr;
411
- let dirs = ~[LogDirective {name: Some(~" crate1:: mod1"), level: 2 },
412
- LogDirective {name: None, level: 3}
413
- ];
414
- let level = &mut 0;
415
- unsafe {
416
- do " crate1:: mod1".to_c_str().with_ref |ptr| {
417
- let entry= &ModEntry {name: ptr, log_level: level};
418
- let m = update_entry(dirs, transmute(entry));
419
- assert!(*entry.log_level == 2);
420
- assert!(m == 1);
421
- }
422
- do " crate2:: mod2" . to_c_str( ) . with_ref |ptr| {
423
- let entry= & ModEntry { name: ptr, log_level: level} ;
424
- let m = update_entry( dirs, transmute( entry) ) ;
425
- assert!( * entry. log_level == 3 ) ;
426
- assert!( m == 1 ) ;
427
- }
428
- }
429
- }
0 commit comments