codeview

A light and fast web based git repository viewer

Log | Files | Refs | README | LICENSE

get_lang.c (1623B)


      1 /*
      2  * Author: Abdul Rahim(C) 2024
      3  */
      4 #include <stdio.h>
      5 #include <stdlib.h>
      6 #include <string.h>
      7 #include <ctype.h>
      8 #include "cJSON.h"
      9 
     10 char* to_lower(const char *upper)
     11 {
     12 	char* str = (char *) malloc(strlen(upper) + 1 );
     13 	if (!str)
     14 		return NULL;
     15 	
     16 	int i;
     17 	for (i = 0; upper[i] ; i++) {
     18 		str[i] = tolower(upper[i]);
     19 	}
     20 	str[i] = '\0';
     21 	return str;
     22 }
     23 
     24 char *get_file_extension(const char *filename_arg)
     25 {
     26 	char *filename = to_lower(filename_arg);
     27 	if (!filename)
     28 		strcpy(filename, filename_arg);
     29 	char *dot = strrchr(filename, '.');
     30 	if (dot && dot != filename) {
     31 		/* dot is the pointer to last occurence of '.'
     32 		 */
     33 		return dot+1;
     34 	}
     35 	else {
     36 		return NULL;
     37 	}
     38 }
     39 
     40 const char* get_language_by_extension(const char *extension, cJSON *langMap)
     41 {
     42 	cJSON *languageItem;
     43 	cJSON_ArrayForEach(languageItem, langMap) {
     44 		const char *language = languageItem->string;
     45 		cJSON *extensions = cJSON_GetObjectItemCaseSensitive(langMap, language);
     46 		cJSON *extItem;
     47 		cJSON_ArrayForEach(extItem, extensions) {
     48 			if (strcmp(extension, extItem->valuestring) == 0)
     49 				return language;
     50 		}
     51 	}
     52 	
     53 	return NULL;
     54 }
     55 
     56 cJSON* loadLangMapFromFile()
     57 {
     58 	/*
     59 	 * c string that contains JSON is in json_string
     60 	 */
     61 	cJSON *langMap = cJSON_Parse(json_string);
     62 	return langMap;
     63 }
     64 
     65 const char *get_lang(const char* filename)
     66 {	
     67 	cJSON *langMap = loadLangMapFromFile();
     68 	if (!langMap)
     69 		return NULL;
     70 	
     71 	char *extension = get_file_extension(filename);
     72 	if (!extension) {
     73 		cJSON_Delete(langMap);
     74 		return NULL;
     75 	}
     76 	
     77 	const char *language = get_language_by_extension(extension, langMap);
     78 	if (language) {
     79 		return language;
     80 	} else {
     81 		return NULL;
     82 	}
     83 }