int check_ref_format(const char *ref) { int ch, level, bad_type, last; int ret = CHECK_REF_FORMAT_OK; const char *cp = ref; level = 0; while (1) { while ((ch = *cp++) == '/') ; /* tolerate duplicated slashes */ if (!ch) /* should not end with slashes */ return CHECK_REF_FORMAT_ERROR; /* we are at the beginning of the path component */ if (ch == '.') return CHECK_REF_FORMAT_ERROR; bad_type = bad_ref_char(ch); if (bad_type) { if (bad_type == 2 && (!*cp || *cp == '/') && ret == CHECK_REF_FORMAT_OK) ret = CHECK_REF_FORMAT_WILDCARD; else return CHECK_REF_FORMAT_ERROR; } last = ch; /* scan the rest of the path component */ while ((ch = *cp++) != 0) { bad_type = bad_ref_char(ch); if (bad_type) return CHECK_REF_FORMAT_ERROR; if (ch == '/') break; if (last == '.' && ch == '.') return CHECK_REF_FORMAT_ERROR; if (last == '@' && ch == '{') return CHECK_REF_FORMAT_ERROR; last = ch; } level++; if (!ch) { if (ref <= cp - 2 && cp[-2] == '.') return CHECK_REF_FORMAT_ERROR; if (level < 2) return CHECK_REF_FORMAT_ONELEVEL; if (has_extension(ref, ".lock")) return CHECK_REF_FORMAT_ERROR; return ret; } } }
int check_ref_format(const char *ref) { int ch, level, bad_type; const char *cp = ref; level = 0; while (1) { while ((ch = *cp++) == '/') ; /* tolerate duplicated slashes */ if (!ch) /* should not end with slashes */ return CHECK_REF_FORMAT_ERROR; /* we are at the beginning of the path component */ if (ch == '.') return CHECK_REF_FORMAT_ERROR; bad_type = bad_ref_char(ch); if (bad_type) { return (bad_type == 2 && !*cp) ? CHECK_REF_FORMAT_WILDCARD : CHECK_REF_FORMAT_ERROR; } /* scan the rest of the path component */ while ((ch = *cp++) != 0) { bad_type = bad_ref_char(ch); if (bad_type) { return (bad_type == 2 && !*cp) ? CHECK_REF_FORMAT_WILDCARD : CHECK_REF_FORMAT_ERROR; } if (ch == '/') break; if (ch == '.' && *cp == '.') return CHECK_REF_FORMAT_ERROR; } level++; if (!ch) { if (level < 2) return CHECK_REF_FORMAT_ONELEVEL; return CHECK_REF_FORMAT_OK; } } }