summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorErick Tryzelaar <erick.tryzelaar@gmail.com>2013-08-06 21:06:12 -0700
committerErick Tryzelaar <erick.tryzelaar@gmail.com>2013-08-07 14:06:45 -0700
commite053bff5d0c83a5b36afcaf4c58a40a27162ec0f (patch)
tree747f485962acb15803ccf8f4a2500c322b9dd314 /src/libstd
parent5eaa4d1d2f6eafc4233892d3d1dafb0d05799ac3 (diff)
downloadrust-e053bff5d0c83a5b36afcaf4c58a40a27162ec0f.tar.gz
rust-e053bff5d0c83a5b36afcaf4c58a40a27162ec0f.zip
std: Fix c_str.iter() and add test
Diffstat (limited to 'src/libstd')
-rw-r--r--src/libstd/c_str.rs23
1 files changed, 20 insertions, 3 deletions
diff --git a/src/libstd/c_str.rs b/src/libstd/c_str.rs
index 6c5853019b0..25c6d4379fa 100644
--- a/src/libstd/c_str.rs
+++ b/src/libstd/c_str.rs
@@ -148,10 +148,10 @@ pub struct CStringIterator<'self> {
 
 impl<'self> Iterator<libc::c_char> for CStringIterator<'self> {
     fn next(&mut self) -> Option<libc::c_char> {
-        if self.ptr.is_null() {
+        let ch = unsafe { *self.ptr };
+        if ch == 0 {
             None
         } else {
-            let ch = unsafe { *self.ptr };
             self.ptr = ptr::offset(self.ptr, 1);
             Some(ch)
         }
@@ -163,6 +163,7 @@ mod tests {
     use super::*;
     use libc;
     use ptr;
+    use option::{Some, None};
 
     #[test]
     fn test_to_c_str() {
@@ -210,7 +211,23 @@ mod tests {
     #[should_fail]
     #[ignore(cfg(windows))]
     fn test_with_ref_empty_fail() {
-        let c_str = CString::new(ptr::null(), false);
+        let c_str = unsafe { CString::new(ptr::null(), false) };
         c_str.with_ref(|_| ());
     }
+
+    #[test]
+    fn test_iterator() {
+        let c_str = "".to_c_str();
+        let mut iter = c_str.iter();
+        assert_eq!(iter.next(), None);
+
+        let c_str = "hello".to_c_str();
+        let mut iter = c_str.iter();
+        assert_eq!(iter.next(), Some('h' as libc::c_char));
+        assert_eq!(iter.next(), Some('e' as libc::c_char));
+        assert_eq!(iter.next(), Some('l' as libc::c_char));
+        assert_eq!(iter.next(), Some('l' as libc::c_char));
+        assert_eq!(iter.next(), Some('o' as libc::c_char));
+        assert_eq!(iter.next(), None);
+    }
 }