static char * make_dir (const char *prefix, const char *start, const char *end) { char ch; unsigned i; unsigned n; char *result; i = grub_strlen (prefix); n = i + end - start; result = grub_malloc (n + 1); if (! result) return 0; grub_strcpy (result, prefix); while (start < end && (ch = *start++)) if (ch == '\\' && isregexop (*start)) result[i++] = *start++; else result[i++] = ch; result[i] = '\0'; return result; }
/* Split `str' into two parts: (1) dirname that is regexop free (2) dirname that has a regexop. */ static void split_path (const char *str, const char **noregexop, const char **regexop) { char ch = 0; int regex = 0; const char *end; const char *split; /* points till the end of dirnaname that doesn't need expansion. */ split = end = str; while ((ch = *end)) { if (ch == '\\' && end[1]) end++; else if (isregexop (ch)) regex = 1; else if (ch == '/' && ! regex) split = end + 1; /* forward to next regexop-free dirname */ else if (ch == '/' && regex) break; /* stop at the first dirname with a regexop */ end++; } *regexop = end; if (! regex) *noregexop = end; else *noregexop = split; }