const char *disambiguate_in(SourceFile *sourcefile) { char *p, *pe; int length; const char *language = NULL; p = sourcefile->filepath; pe = p + strlen(p) - 3; if (strstr(p, ".") <= pe) { // Only if the filename has an extension prior to the .in length = pe - p; char buf[length]; strncpy(buf, p, length); buf[length] = '\0'; SourceFile *undecorated = ohcount_sourcefile_new(buf); p = ohcount_sourcefile_get_contents(sourcefile); // The filepath without the '.in' extension does not exist on disk. The // sourcefile->diskpath field must be set incase the detector needs to run // 'file -b' on the file. ohcount_sourcefile_set_diskpath(undecorated, sourcefile->filepath); ohcount_sourcefile_set_contents(undecorated, p); char **filenames = ohcount_sourcefile_get_filenames(sourcefile); ohcount_sourcefile_set_filenames(undecorated, filenames); language = ohcount_sourcefile_get_language(undecorated); ohcount_sourcefile_free(undecorated); } return language; }
const char *disambiguate_in(SourceFile *sourcefile) { char *p, *pe; int length; const char *language = NULL; p = sourcefile->filepath; pe = p + strlen(p) - 3; if (strstr(p, ".") <= pe) { // Only if the filename has an extension prior to the .in length = pe - p; char buf[length]; strncpy(buf, p, length); buf[length] = '\0'; p = ohcount_sourcefile_get_contents(sourcefile); if (!p) { return NULL; } // A SourceFile's filepath and diskpath need not be the same. // Here, we'll take advantage of this to set up a new SourceFile // whose filepath does not have the *.in extension, but whose // diskpath still points back to the original file on disk (if any). SourceFile *undecorated = ohcount_sourcefile_new(buf); if (sourcefile->diskpath) { ohcount_sourcefile_set_diskpath(undecorated, sourcefile->diskpath); } ohcount_sourcefile_set_contents(undecorated, p); undecorated->filenames = sourcefile->filenames; language = ohcount_sourcefile_get_language(undecorated); ohcount_sourcefile_free(undecorated); } return language; }