/*
* Copyright (c) 2002, 2004, 2005
* Tama Communications Corporation
*
* This file is part of GNU GLOBAL.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#ifdef HAVE_CONFIG_H
#include
#endif
#ifdef HAVE_STRING_H
#include
#else
#include
#endif
#include "die.h"
#include "locatestring.h"
#include "strbuf.h"
#include "langmap.h"
static int match_suffix_list(const char *, const char *);
static STRBUF *active_map;
/*
* construct language map.
*
* copy string langmap and convert it to language map like this:
*
* langmap (string) "c:.c.h,java:.java,cpp:.C.H"
* |
* v
* language map c\0.c.h\0java\0.java\0cpp\0.C.H\0
*/
void
setup_langmap(const char *map)
{
char *p;
int onsuffix = 0; /* not on suffix string */
active_map = strbuf_open(0);
strbuf_puts(active_map, map);
for (p = strbuf_value(active_map); *p; p++) {
/*
* "c:.c.h,java:.java,cpp:.C.H"
*/
if ((onsuffix == 0 && *p == ',') || (onsuffix == 1 && *p == ':'))
die_with_code(2, "syntax error in langmap '%s'.", map);
if (*p == ':' || *p == ',') {
onsuffix ^= 1;
*p = '\0';
}
}
if (onsuffix == 0)
die_with_code(2, "syntax error in langmap '%s'.", map);
/* strbuf_close(active_map); */
}
/*
* decide the language of the suffix.
*/
const char *
decide_lang(const char *suffix)
{
const char *lang, *list, *tail;
lang = strbuf_value(active_map);
tail = lang + strbuf_getlen(active_map);
/* check whether or not list includes suffix. */
while (lang < tail) {
list = lang + strlen(lang) + 1;
if (match_suffix_list(suffix, list))
return lang;
lang = list + strlen(list) + 1;
}
return NULL;
}
/*
* return true if suffix matches with one in suffix list.
*/
static int
match_suffix_list(const char *suffix, const char *list)
{
const char *p;
while (*list) {
if ((p = locatestring(list, suffix, MATCH_AT_FIRST
#if defined(_WIN32) || defined(__DJGPP__)
|IGNORE_CASE
#endif
)) != NULL && (*p == '\0' || *p == '.'))
return 1;
for (list++; *list && *list != '.'; list++)
;
}
return 0;
}
/*
* make the suffixes value from langmap value.
*/
void
make_suffixes(const char *langmap, STRBUF *sb)
{
const char *p;
int onsuffix = 0; /* not on suffix string */
int first_dot = 1;
for (p = langmap; *p; p++) {
/*
* "c:.c.h,java:.java,cpp:.C.H"
*/
if ((onsuffix == 0 && *p == ',') || (onsuffix == 1 && *p == ':'))
die_with_code(2, "syntax error in langmap '%s'.", langmap);
if (*p == ':')
onsuffix = 1;
else if (*p == ',')
onsuffix = 0;
else if (onsuffix) {
if (*p == '.') {
if (first_dot)
first_dot = 0;
else
strbuf_putc(sb, ',');
} else
strbuf_putc(sb, *p);
}
}
if (onsuffix == 0)
die_with_code(2, "syntax error in langmap '%s'.", langmap);
}