if (cp == NULL)  abort ();
_nss_netgroup_parseline (char **cursor, struct __netgrent *result,			 char *buffer, int buflen){  enum nss_status status;  const char *host, *user, *domain;  char *cp = *cursor;  /* First skip leading spaces.  */  while (isspace (*cp))    ++cp;  if (*cp != '(')    {      /* We have a list of other netgroups.  */      char *name = cp;      while (*cp != '\0' && ! isspace (*cp))	++cp;      if (name != cp)	{	  /* It is another netgroup name.  */	  int last = *cp == '\0';	  result->type = group_val;	  result->val.group = name;	  *cp = '\0';	  if (! last)	    ++cp;	  *cursor = cp;	  first = 0;	  return NSS_STATUS_SUCCESS;	}      return first ? NSS_STATUS_NOTFOUND : NSS_STATUS_RETURN;    }  /* Match host name.  */  host = ++cp;  while (*cp != ',')    if (*cp++ == '\0')      return first ? NSS_STATUS_NOTFOUND : NSS_STATUS_RETURN;  /* Match user name.  */  user = ++cp;  while (*cp != ',')    if (*cp++ == '\0')      return first ? NSS_STATUS_NOTFOUND : NSS_STATUS_RETURN;  /* Match domain name.  */  domain = ++cp;  while (*cp != ')')    if (*cp++ == '\0')      return first ? NSS_STATUS_NOTFOUND : NSS_STATUS_RETURN;  ++cp;  /* When we got here we have found an entry.  Before we can copy it     to the private buffer we have to make sure it is big enough.  */  if (cp - host > buflen)    {      __set_errno (ERANGE);      status = NSS_STATUS_UNAVAIL;    }  else    {      memcpy (buffer, host, cp - host);      result->type = triple_val;      buffer[(user - host) - 1] = '\0';      result->val.triple.host = *host == ',' ? NULL : buffer;      buffer[(domain - host) - 1] = '\0';      result->val.triple.user = *user == ',' ? NULL : buffer + (user - host);      buffer[(cp - host) - 1] = '\0';      result->val.triple.domain =	*domain == ')' ? NULL : buffer + (domain - host);      status = NSS_STATUS_SUCCESS;      /* Rememember where we stopped reading.  */      *cursor = cp;      first = 0;    }  return status;}