/* Use libmagic to detect file language */ const char *detect_language_magic(SourceFile *sourcefile) { char line[80]; magic_t cookie = magic_open(MAGIC_NONE); if (cookie == NULL) { fprintf(stderr, "libmagic: %s\n", magic_error(cookie)); exit(1); } if (magic_load(cookie, NULL) != 0) { fprintf(stderr, "libmagic: %s\n", magic_error(cookie)); magic_close(cookie); exit(1); } if (sourcefile->diskpath) { const char *magic = magic_file(cookie, sourcefile->diskpath); if (magic == NULL) { fprintf(stderr, "libmagic: %s\n", magic_error(cookie)); magic_close(cookie); exit(1); } strncpy(line, magic, sizeof(line)); line[sizeof(line)-1] = '\0'; } else { char *p = ohcount_sourcefile_get_contents(sourcefile); if (!p) return NULL; const char *magic = magic_buffer(cookie, p, strlen(p)); if (magic == NULL) { fprintf(stderr, "libmagic: %s\n", magic_error(cookie)); magic_close(cookie); exit(1); } strncpy(line, magic, sizeof(line)); line[sizeof(line)-1] = '\0'; } magic_close(cookie); return magic_parse(line); }
void magic_init(char *filename) { FILE *f; char buf[BUFSIZ]; if ((f = fopen(filename, "r")) == NULL) { err(1, "magic_init"); } memset(&Magic, 0, sizeof(Magic)); while (fgets(buf, sizeof(buf), f) != NULL) { if (buf[0] == '#') continue; if (strlen(buf) <= 1) continue; buf[strlen(buf) - 1] = '\0'; magic_parse(buf); } fclose(f); }