OSDN Git Service

* strings.h (strechr): New function.
authorcgf <cgf>
Mon, 27 Jan 2003 00:16:01 +0000 (00:16 +0000)
committercgf <cgf>
Mon, 27 Jan 2003 00:16:01 +0000 (00:16 +0000)
* uinfo.cc (pwdgrp::next_str): Search only for input char in string.  Return
EOS on failure.  Don't check for NULL since it shouldn't be possible.
(pwdgrp::add_line): Revert to replacing '\n' in input line with '\0'.
(pwdgrp::next_num): Pass explicit separator character to next_str.
* grp.cc (pwdgrp::parse_group): Ditto.
* passwd.cc (pwdgrp::parse_passwd): Ditto.  Revamp test for garbage input.
* pwdgrp.h (pwdgrp::next_str): Don't use default parameter.

winsup/cygwin/ChangeLog
winsup/cygwin/grp.cc
winsup/cygwin/passwd.cc
winsup/cygwin/pwdgrp.h
winsup/cygwin/string.h
winsup/cygwin/uinfo.cc

index 7ad151b..b965d82 100644 (file)
@@ -1,5 +1,18 @@
 2003-01-26  Christopher Faylor  <cgf@redhat.com>
 
+       * strings.h (strechr): New function.
+       * uinfo.cc (pwdgrp::next_str): Search only for input char in string.
+       Return EOS on failure.  Don't check for NULL since it shouldn't be
+       possible.
+       (pwdgrp::add_line): Revert to replacing '\n' in input line with '\0'.
+       (pwdgrp::next_num): Pass explicit separator character to next_str.
+       * grp.cc (pwdgrp::parse_group): Ditto.
+       * passwd.cc (pwdgrp::parse_passwd): Ditto.  Revamp test for garbage
+       input.
+       * pwdgrp.h (pwdgrp::next_str): Don't use default parameter.
+
+2003-01-26  Christopher Faylor  <cgf@redhat.com>
+
        * uinfo.cc (pwdgrp::load): Regularize strace output.  Add warning for
        CreateFile failure.
 
index 44abc97..35bba1f 100644 (file)
@@ -37,11 +37,11 @@ bool
 pwdgrp::parse_group ()
 {
 # define grp (*group_buf)[curr_lines]
-  grp.gr_name = next_str ();
+  grp.gr_name = next_str (':');
   if (!*grp.gr_name)
     return false;
 
-  grp.gr_passwd = next_str ();
+  grp.gr_passwd = next_str (':');
 
   if (!next_num (grp.gr_gid))
     return false;
index 113f92a..c257bd6 100644 (file)
@@ -38,18 +38,17 @@ bool
 pwdgrp::parse_passwd ()
 {
 # define res (*passwd_buf)[curr_lines]
-  res.pw_name = next_str ();
-  res.pw_passwd = next_str ();
-
-  if (res.pw_name == res.pw_passwd)
-    return false;
-
+  res.pw_name = next_str (':');
+  res.pw_passwd = next_str (':');
+  char *p = raw_ptr ();
   (void) next_num (res.pw_uid);
+  if (p == raw_ptr ())
+    return false;      /* parsing did not advance.  line is garbage */
   (void) next_num (res.pw_gid);
   res.pw_comment = NULL;
-  res.pw_gecos = next_str ();
-  res.pw_dir =  next_str ();
-  res.pw_shell = next_str ();
+  res.pw_gecos = next_str (':');
+  res.pw_dir =  next_str (':');
+  res.pw_shell = next_str (':');
   return true;
 # undef res
 }
index a5fdc19..73d41a0 100644 (file)
@@ -46,7 +46,7 @@ class pwdgrp
   void read_group ();
   char *add_line (char *);
   char *raw_ptr () const {return lptr;}
-  char *next_str (char = 0);
+  char *next_str (char);
   bool next_num (unsigned long&);
   bool next_num (unsigned int& i)
   {
index 6e41024..0ac9745 100644 (file)
@@ -38,6 +38,27 @@ strchr (const char *s, int c)
   return res;
 }
 
+#undef strechr
+#define strechr cygwin_strechr
+static inline __stdcall char *
+strechr (const char *s, int c)
+{
+  register char * res;
+  __asm__ __volatile__ ("\
+       movb    %%al,%%ah\n\
+1:     movb    (%1),%%al\n\
+       cmpb    %%ah,%%al\n\
+       je      2f\n\
+       incl    %1\n\
+       testb   %%al,%%al\n\
+       jne     1b\n\
+       decl    %1\n\
+2:     movl    %1,%0\n\
+       ":"=a" (res), "=r" (s)
+       :"0" (c), "1" (s));
+  return res;
+}
+
 extern const char isalpha_array[];
 
 #undef strcasematch
index 82712d9..a6831e2 100644 (file)
@@ -394,24 +394,17 @@ cygheap_user::env_name (const char *name, size_t namelen)
 char *
 pwdgrp::next_str (char c)
 {
-  if (!lptr)
-    return NULL;
-  char search[] = ":\n\0\0";
-  search[2] = c;
   char *res = lptr;
-  char *p = strpbrk (lptr, search);
-  if (p)
-    {
-      lptr = (*p == '\n') ? p : p + 1;
-      *p = '\0';
-    }
+  lptr = strechr (lptr, c);
+  if (*lptr)
+    *lptr++ = '\0';
   return res;
 }
 
 bool
 pwdgrp::next_num (unsigned long& n)
 {
-  char *p = next_str ();
+  char *p = next_str (':');
   if (!p)
     return -1;
   char *cp;
@@ -425,11 +418,13 @@ pwdgrp::add_line (char *eptr)
   if (eptr)
     {
       lptr = eptr;
-      eptr = strchr (lptr, '\n');
-      if (eptr)
+      eptr = strechr (lptr, '\n');
+      if (*eptr)
        {
          if (eptr > lptr && eptr[-1] == '\r')
-           eptr[-1] = '\n';
+           eptr[-1] = '\0';
+         else
+           *eptr = '\0';
          eptr++;
        }
       if (curr_lines >= max_lines)