Add support for the globs2 file format

The priority field is ignored for the moment.
This commit is contained in:
Pierre Pronchery 2020-09-28 08:02:08 +02:00
parent b116a4fb47
commit 1a9643523f

View File

@ -89,20 +89,21 @@ static void _new_config(Mime * mime);
Mime * mime_new(GtkIconTheme * theme) Mime * mime_new(GtkIconTheme * theme)
{ {
Mime * mime; Mime * mime;
char * globs[] = char * globs2[] =
{ {
DATADIR "/mime/globs", DATADIR "/mime/globs2",
"/usr/share/mime/globs", "/usr/share/mime/globs2",
"/usr/local/share/mime/globs", "/usr/local/share/mime/globs2",
"/usr/pkg/share/mime/globs", "/usr/pkg/share/mime/globs2",
NULL NULL
}; };
char ** g = globs; char ** g = globs2;
FILE * fp = NULL; FILE * fp = NULL;
char buf[256]; char buf[256];
size_t len; size_t len;
char * p;
char * glob; char * glob;
MimeType * p; MimeType * type;
size_t i; size_t i;
char ** q; char ** q;
@ -111,7 +112,7 @@ Mime * mime_new(GtkIconTheme * theme)
if(theme == NULL) if(theme == NULL)
theme = gtk_icon_theme_get_default(); theme = gtk_icon_theme_get_default();
mime->theme = theme; mime->theme = theme;
for(g = globs; *g != NULL; g++) for(g = globs2; *g != NULL; g++)
if((fp = fopen(*g, "r")) != NULL) if((fp = fopen(*g, "r")) != NULL)
break; break;
if(fp == NULL) if(fp == NULL)
@ -132,47 +133,55 @@ Mime * mime_new(GtkIconTheme * theme)
if(buf[0] == '#') if(buf[0] == '#')
continue; continue;
buf[len] = '\0'; buf[len] = '\0';
glob = strchr(buf, ':'); /* parse the priority */
errno = 0;
strtoul(buf, &p, 0);
if(errno != 0 || *(p++) != ':')
continue;
glob = strchr(p, ':');
*(glob++) = '\0'; *(glob++) = '\0';
for(i = 0; i < mime->types_cnt; i++) for(i = 0; i < mime->types_cnt; i++)
if(strcmp(mime->types[i].type, buf) == 0) if(strcmp(mime->types[i].type, p) == 0)
break; break;
if(i < mime->types_cnt) if(i < mime->types_cnt)
p = &mime->types[i]; type = &mime->types[i];
else if((p = realloc(mime->types, sizeof(*p) * (mime->types_cnt else if((type = realloc(mime->types, sizeof(*type)
+ 1))) == NULL) * (mime->types_cnt + 1)))
== NULL)
break; break;
else else
{ {
mime->types = p; mime->types = type;
p = &p[mime->types_cnt]; type = &type[mime->types_cnt];
p->type = strdup(buf); type->type = strdup(p);
p->globs = NULL; type->globs = NULL;
p->globs_cnt = 0; type->globs_cnt = 0;
} }
if((q = realloc(p->globs, sizeof(*p->globs) if((q = realloc(type->globs, sizeof(*type->globs)
* (p->globs_cnt + 1))) != NULL) * (type->globs_cnt + 1)))
!= NULL)
{ {
p->globs = q; type->globs = q;
p->globs[p->globs_cnt] = strdup(glob); type->globs[type->globs_cnt] = strdup(glob);
} }
if(p->type == NULL || p->globs == NULL if(type->type == NULL
|| p->globs[p->globs_cnt] == NULL) || type->globs == NULL
|| type->globs[type->globs_cnt] == NULL)
{ {
free(p->type); free(type->type);
free(p->globs); free(type->globs);
break; break;
} }
if(p->globs_cnt++ == 0) if(type->globs_cnt++ == 0)
mime->types_cnt++; mime->types_cnt++;
p->icon_24 = NULL; type->icon_24 = NULL;
p->icon_48 = NULL; type->icon_48 = NULL;
p->icon_96 = NULL; type->icon_96 = NULL;
#if 0 #if 0
p->open = mime->config != NULL type->open = mime->config != NULL
? config_get(mime->config, buf, "open") : NULL; ? config_get(mime->config, p, "open") : NULL;
p->edit = mime->config != NULL type->edit = mime->config != NULL
? config_get(mime->config, buf, "edit") : NULL; ? config_get(mime->config, p, "edit") : NULL;
#endif #endif
} }
if(!feof(fp)) if(!feof(fp))