goto no_space;
{ free (old_word); goto no_space; }
parse_glob (char **word, size_t *word_length, size_t *max_length,	    const char *words, size_t *offset, int flags,	    wordexp_t *pwordexp, const char *ifs, const char *ifs_white){  /* We are poised just after a '*', a '[' or a '?'. */  int error;  glob_t globbuf;  int match;  char *matching_word;  int quoted = 0; /* 1 if singly-quoted, 2 if doubly */  for (; words[*offset]; (*offset)++)    {      if ((ifs && strchr (ifs, words[*offset])) ||	  (!ifs && strchr (" \t\n", words[*offset])))	/* Reached IFS */	break;      /* Sort out quoting */      if (words[*offset] == '\'')	  if (quoted == 0)	    {	      quoted = 1;	      continue;	    }	  else if (quoted == 1)	    {	      quoted = 0;	      continue;	    }      else if (words[*offset] == '"')	if (quoted == 0)	  {	    quoted = 2;	    continue;	  }	else if (quoted == 2)	  {	    quoted = 0;	    continue;	  }      /* Sort out other special characters */      if (quoted != 1 && words[*offset] == '$')	{	  error = parse_dollars (word, word_length, max_length, words, offset,				 flags, pwordexp, ifs, ifs_white, quoted == 2);	  if (error)	    return error;	  continue;	}      else if (words[*offset] == '\\')	{	  if (quoted)	    error = parse_qtd_backslash (word, word_length, max_length, words,					 offset);	  else	    error = parse_backslash (word, word_length, max_length, words,				     offset);	  if (error)	    return error;	  continue;	}      *word = w_addchar (*word, word_length, max_length, words[*offset]);      if (*word == NULL)	return WRDE_NOSPACE;    }  error = glob (*word, GLOB_NOCHECK, NULL, &globbuf);  if (error != 0)    {      /* We can only run into memory problems.  */      assert (error == GLOB_NOSPACE);      return WRDE_NOSPACE;    }  if (ifs && !*ifs)    {      /* No field splitting allowed */      size_t length = strlen (globbuf.gl_pathv[0]);      *word = realloc (*word, length + 1);      if (*word == NULL)	goto no_space;      memcpy (*word, globbuf.gl_pathv[0], length + 1);      *word_length = length;      for (match = 1; match < globbuf.gl_pathc && *word != NULL; ++match)	{	  *word = w_addchar (*word, word_length, max_length, ' ');	  if (*word != NULL)	    *word = w_addstr (*word, word_length, max_length,			      globbuf.gl_pathv[match]);	}      /* Re-parse white space on return */      globfree (&globbuf);      --(*offset);      return *word ? 0 : WRDE_NOSPACE;    }  /* here ifs != "" */  free (*word);  *word = NULL;  *word_length = 0;  matching_word = __strdup (globbuf.gl_pathv[0]);  if (matching_word == NULL)    goto no_space;  if (w_addword (pwordexp, matching_word) == WRDE_NOSPACE)    goto no_space;  for (match = 1; match < globbuf.gl_pathc; ++match)    {      matching_word = __strdup (globbuf.gl_pathv[match]);      if (matching_word == NULL)	goto no_space;      if (w_addword (pwordexp, matching_word) == WRDE_NOSPACE)	goto no_space;    }  globfree (&globbuf);  /* Re-parse white space on return */  --(*offset);  return 0;no_space:  globfree (&globbuf);  return WRDE_NOSPACE;}