svn_boolean_t svn_prop_name_is_valid(const char *prop_name) { const char *p = prop_name; /* The characters we allow use identical representations in UTF8 and ASCII, so we can just test for the appropriate ASCII codes. But we can't use standard C character notation ('A', 'B', etc) because there's no guarantee that this C environment is using ASCII. */ if (!(svn_ctype_isalpha(*p) || *p == SVN_CTYPE_ASCII_COLON || *p == SVN_CTYPE_ASCII_UNDERSCORE)) return FALSE; p++; for (; *p; p++) { if (!(svn_ctype_isalnum(*p) || *p == SVN_CTYPE_ASCII_MINUS || *p == SVN_CTYPE_ASCII_DOT || *p == SVN_CTYPE_ASCII_COLON || *p == SVN_CTYPE_ASCII_UNDERSCORE)) return FALSE; } return TRUE; }
/* Parse one revision specification. Return pointer to character after revision, or NULL if the revision is invalid. Modifies str, so make sure to pass a copy of anything precious. Uses POOL for temporary allocation. */ static char *parse_one_rev(svn_opt_revision_t *revision, char *str, apr_pool_t *pool) { char *end, save; /* Allow any number of 'r's to prefix a revision number, because that way if a script pastes svn output into another svn command (like "svn log -r${REV_COPIED_FROM_OUTPUT}"), it'll Just Work, even when compounded. As it happens, none of our special revision words begins with "r". If any ever do, then this code will have to get smarter. Incidentally, this allows "r{DATE}". We could avoid that with some trivial code rearrangement, but it's not clear what would be gained by doing so. */ while (*str == 'r') str++; if (*str == '{') { svn_boolean_t matched; apr_time_t tm; svn_error_t *err; /* Brackets denote a date. */ str++; end = strchr(str, '}'); if (!end) return NULL; *end = '\0'; err = svn_parse_date(&matched, &tm, str, apr_time_now(), pool); if (err) { svn_error_clear(err); return NULL; } if (!matched) return NULL; revision->kind = svn_opt_revision_date; revision->value.date = tm; return end + 1; } else if (svn_ctype_isdigit(*str)) { /* It's a number. */ end = str + 1; while (svn_ctype_isdigit(*end)) end++; save = *end; *end = '\0'; revision->kind = svn_opt_revision_number; revision->value.number = SVN_STR_TO_REV(str); *end = save; return end; } else if (svn_ctype_isalpha(*str)) { end = str + 1; while (svn_ctype_isalpha(*end)) end++; save = *end; *end = '\0'; if (revision_from_word(revision, str) != 0) return NULL; *end = save; return end; } else return NULL; }