+
+int tag_exists(const char *tag) {
+ int taglen = strlen(tag);
+ char filename[512];
+
+ if (taglen < 2) {
+ fprintf(stderr, "Tag too short\n");
+ return 0;
+ } else if (taglen > 33) {
+ fprintf(stderr, "Tag too long\n");
+ return 0;
+ }
+ if (!(tag[0] == '@' || tag[0] == '#')) {
+ fprintf(stderr, "Invalid tag: %s\n", tag);
+ return 0;
+ }
+
+ switch(tag[0]) {
+ case '#':
+ snprintf(filename, 512, "%s/%s", HASH_TAGS_PATH, tag + 1);
+ break;
+ case '@':
+ snprintf(filename, 512, "%s/%s", REF_TAGS_PATH, tag + 1);
+ break;
+ default:
+ fprintf(stderr, "Invalid tag type: %s\n", tag);
+ return 0;
+ }
+ if (access(filename, F_OK) == -1)
+ return 0;
+ else
+ return 1;
+}