#ifndef SIST2_UTIL_H #define SIST2_UTIL_H #include #include #include #include #include "third-party/utf8.h/utf8.h" #include "libscan/scan.h" char *abspath(const char *path); char *expandpath(const char *path); dyn_buffer_t url_escape(char *str); extern int PrintingProgressBar; void progress_bar_print_json(size_t done, size_t count, size_t tn_size, size_t index_size, int waiting); void progress_bar_print(double percentage, size_t tn_size, size_t index_size); GHashTable *incremental_get_table(); const char *find_file_in_paths(const char **paths, const char *filename); void str_escape(char *dst, const char *str); void str_unescape(char *dst, const char *str); static int hex2buf(const char *str, int len, unsigned char *bytes) { static const uint8_t hashmap[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; for (int pos = 0; pos < len; pos += 2) { int idx0 = (uint8_t) str[pos + 0]; int idx1 = (uint8_t) str[pos + 1]; bytes[pos / 2] = (uint8_t) (hashmap[idx0] << 4) | hashmap[idx1]; } return TRUE; } __always_inline static void buf2hex(const unsigned char *buf, size_t buflen, char *hex_string) { static const char hexdig[] = "0123456789abcdef"; const unsigned char *p; size_t i; char *s = hex_string; for (i = 0, p = buf; i < buflen; i++, p++) { *s++ = hexdig[(*p >> 4) & 0x0f]; *s++ = hexdig[*p & 0x0f]; } *s = '\0'; } __always_inline static void generate_doc_id(const char *rel_path, char *doc_id) { unsigned char md[MD5_DIGEST_LENGTH]; MD5((unsigned char *) rel_path, strlen(rel_path), md); buf2hex(md, sizeof(md), doc_id); } __always_inline static void incremental_put(GHashTable *table, const char doc_id[SIST_DOC_ID_LEN], int mtime) { char *ptr = malloc(SIST_DOC_ID_LEN); strcpy(ptr, doc_id); g_hash_table_insert(table, ptr, GINT_TO_POINTER(mtime)); } __always_inline static int incremental_get(GHashTable *table, const char doc_id[SIST_DOC_ID_LEN]) { if (table != NULL) { return GPOINTER_TO_INT(g_hash_table_lookup(table, doc_id)); } else { return 0; } } /** * Marks a file by adding it to a table. * !!Not thread safe. */ __always_inline static int incremental_mark_file(GHashTable *table, const char doc_id[SIST_DOC_ID_LEN]) { char *ptr = malloc(SIST_DOC_ID_LEN); strcpy(ptr, doc_id); return g_hash_table_insert(table, ptr, GINT_TO_POINTER(1)); } #endif