/* See LICENSE file for copyright and license details. */ #ifndef CRAWL_H #define CRAWL_H #include /* Hash table size (prime, ~64k buckets) */ #define HT_SIZE 65521 /* URL queue for BFS crawling */ typedef struct QueueNode { char *url; int depth; struct QueueNode *next; } QueueNode; typedef struct { QueueNode *head; QueueNode *tail; size_t count; } UrlQueue; /* Hash table node for visited URLs */ typedef struct HashNode { char *url; struct HashNode *next; } HashNode; /* Hash table based visited set - O(1) lookup */ typedef struct { HashNode *buckets[HT_SIZE]; size_t count; } VisitedSet; /* Queue operations */ UrlQueue *queue_new(void); void queue_free(UrlQueue *q); void queue_push(UrlQueue *q, const char *url, int depth); QueueNode *queue_pop(UrlQueue *q); int queue_empty(UrlQueue *q); size_t queue_size(UrlQueue *q); /* Visited set operations (hash table) */ VisitedSet *visited_new(void); void visited_free(VisitedSet *v); void visited_add(VisitedSet *v, const char *url); int visited_contains(VisitedSet *v, const char *url); size_t visited_count(VisitedSet *v); /* URL normalization for comparison */ char *url_normalize(const char *url); /* Get path component from URL for directory structure */ char *url_to_path(const char *url, const char *base_domain); #endif /* CRAWL_H */