From d6c1e64628f7bbce5e2441ae29e08e2e86520d80 Mon Sep 17 00:00:00 2001 From: Jonas 'Sortie' Termansen Date: Tue, 24 Sep 2013 23:18:57 +0200 Subject: [PATCH] Fix poor implementation of the strchr(3) family. --- libc/strchr.cpp | 6 +++--- libc/strchrnul.cpp | 10 +++++----- libc/strrchr.cpp | 14 ++++++++------ 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/libc/strchr.cpp b/libc/strchr.cpp index 26f110a8..f6f3b751 100644 --- a/libc/strchr.cpp +++ b/libc/strchr.cpp @@ -24,8 +24,8 @@ #include -extern "C" char* strchr(const char* str, int c) +extern "C" char* strchr(const char* str, int uc) { - char* ret = strchrnul(str, c); - return ret && c == ret[0] ? ret : NULL; + char* ret = strchrnul(str, uc); + return uc == ((unsigned char*) ret)[0] ? ret : NULL; } diff --git a/libc/strchrnul.cpp b/libc/strchrnul.cpp index 2079021f..ce685d2d 100644 --- a/libc/strchrnul.cpp +++ b/libc/strchrnul.cpp @@ -24,10 +24,10 @@ #include -extern "C" char* strchrnul(const char* str, int c) +extern "C" char* strchrnul(const char* str, int uc) { - for ( ; *str != c; str++ ) - if ( !*str ) - return NULL; - return (char*) str; + const unsigned char* ustr = (const unsigned char*) str; + for ( size_t i = 0; true; i++) + if ( ustr[i] == uc || !ustr[i] ) + return (char*) str + i; } diff --git a/libc/strrchr.cpp b/libc/strrchr.cpp index 641efa42..6ff50aab 100644 --- a/libc/strrchr.cpp +++ b/libc/strrchr.cpp @@ -1,6 +1,6 @@ /******************************************************************************* - Copyright(C) Jonas 'Sortie' Termansen 2011, 2012. + Copyright(C) Jonas 'Sortie' Termansen 2011, 2012, 2013. This file is part of the Sortix C Library. @@ -24,14 +24,16 @@ #include -extern "C" char* strrchr(const char* str, int c) +extern "C" char* strrchr(const char* str, int uc) { + const unsigned char* ustr = (const unsigned char*) str; const char* last = NULL; - while ( *str ) + for ( size_t i = 0; true; i++ ) { - if ( *str == c ) - last = str; - str++; + if ( ustr[i] == uc ) + last = str + i; + if ( !ustr[i] ) + break; } return (char*) last; }