diff options
Diffstat (limited to 'app/luit/parser.c')
-rw-r--r-- | app/luit/parser.c | 203 |
1 files changed, 101 insertions, 102 deletions
diff --git a/app/luit/parser.c b/app/luit/parser.c index 0c8023fcd..7e0e90b15 100644 --- a/app/luit/parser.c +++ b/app/luit/parser.c @@ -19,43 +19,48 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/* $XFree86$ */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif #include <stdlib.h> #include <stdio.h> #include <string.h> +#include "luit.h" #include "parser.h" +#include "sys.h" static char keyword[MAX_KEYWORD_LENGTH]; static void skipEndOfLine(FILE *f, int c) { - if(c == 0) - c = getc(f); - - for(;;) - if(c <= 0 || c == '\n') - return; - else - c = getc(f); + if (c == 0) + c = getc(f); + + for (;;) + if (c <= 0 || c == '\n') + return; + else + c = getc(f); } static int drainWhitespace(FILE *f, int c) { - if(c == 0) - c = getc(f); + if (c == 0) + c = getc(f); while (c == '#' || c == ' ' || c == '\t') { - if(c <= 0) - return 0; - if(c == '#') { - skipEndOfLine(f, c); - return '\n'; - } - c = getc(f); + if (c <= 0) + return 0; + if (c == '#') { + skipEndOfLine(f, c); + return '\n'; + } + c = getc(f); } return c; @@ -68,22 +73,22 @@ getString(FILE *f, int string_end, int *c_return) int c; c = getc(f); - while(c > 0) { - if(c == string_end) - break; - if(c == '\\') { - c = getc(f); - if(c == '\n') - continue; - } - keyword[i++] = c; - if(i >= MAX_KEYWORD_LENGTH) - return TOK_ERROR; - c = getc(f); + while (c > 0) { + if (c == string_end) + break; + if (c == '\\') { + c = getc(f); + if (c == '\n') + continue; + } + keyword[i++] = (char) c; + if (i >= MAX_KEYWORD_LENGTH) + return TOK_ERROR; + c = getc(f); } - if(c <= 0) - return TOK_ERROR; + if (c <= 0) + return TOK_ERROR; keyword[i] = '\0'; *c_return = c; return TOK_KEYWORD; @@ -95,42 +100,41 @@ getToken(FILE *f, int c, int parse_assignments, int *c_return) int i; c = drainWhitespace(f, c); - if(c < 0) - return TOK_EOF; - if(c == '\n') { - *c_return = 0; - return TOK_EOL; + if (c < 0) + return TOK_EOF; + if (c == '\n') { + *c_return = 0; + return TOK_EOL; } - if(parse_assignments && c == '=') { - *c_return = 0; - return TOK_EQUALS; + if (parse_assignments && c == '=') { + *c_return = 0; + return TOK_EQUALS; } - if(c == '\'' || c == '"') - return getString(f, c, c_return); + if (c == '\'' || c == '"') + return getString(f, c, c_return); i = 0; - while(c > 0 && c != ' ' && c != '\t' && c != '\n') { - if(c == '\\') { - c = getc(f); - if(c == '\n') - continue; - } - keyword[i++] = c; - if(i >= MAX_KEYWORD_LENGTH) - return TOK_ERROR; - c = getc(f); - if(parse_assignments && c == '=') - break; + while (c > 0 && c != ' ' && c != '\t' && c != '\n') { + if (c == '\\') { + c = getc(f); + if (c == '\n') + continue; + } + keyword[i++] = (char) c; + if (i >= MAX_KEYWORD_LENGTH) + return TOK_ERROR; + c = getc(f); + if (parse_assignments && c == '=') + break; } - *c_return = c<0?0:c; + *c_return = c < 0 ? 0 : c; keyword[i] = '\0'; return TOK_KEYWORD; } - /* Can parse both the old and new formats for locale.alias */ static int parseTwoTokenLine(FILE *f, char *first, char *second) @@ -139,29 +143,29 @@ parseTwoTokenLine(FILE *f, char *first, char *second) int tok; again: - + tok = getToken(f, c, 0, &c); - if(tok == TOK_EOF) - return -1; - else if(tok == TOK_EOL) - goto again; - else if(tok == TOK_KEYWORD) { - int len = strlen(keyword); - if(keyword[len - 1] == ':') - keyword[len - 1] = '\0'; - strcpy(first, keyword); + if (tok == TOK_EOF) + return -1; + else if (tok == TOK_EOL) + goto again; + else if (tok == TOK_KEYWORD) { + size_t len = strlen(keyword); + if (keyword[len - 1] == ':') + keyword[len - 1] = '\0'; + strcpy(first, keyword); } else - return -2; + return -2; tok = getToken(f, c, 0, &c); - if(tok == TOK_KEYWORD) { - strcpy(second, keyword); + if (tok == TOK_KEYWORD) { + strcpy(second, keyword); } else - return -2; + return -2; tok = getToken(f, c, 0, &c); - if(tok != TOK_EOL) - return -2; + if (tok != TOK_EOL) + return -2; return 0; } @@ -173,37 +177,32 @@ resolveLocale(const char *locale) char first[MAX_KEYWORD_LENGTH], second[MAX_KEYWORD_LENGTH]; char *resolved = NULL; int rc; - - f = fopen(LOCALE_ALIAS_FILE, "r"); - if(f == NULL) - goto bail; - - do { - rc = parseTwoTokenLine(f, first, second); - if(rc < -1) - goto bail; - if(!strcmp(first, locale)) { - resolved = strdup(second); - if(resolved == NULL) - goto bail; - break; - } - } while(rc >= 0); - - if(resolved == NULL) { - resolved = strdup(locale); - if(resolved == NULL) - goto bail; + int found = 0; + + f = fopen(locale_alias, "r"); + + if (f != NULL) { + do { + rc = parseTwoTokenLine(f, first, second); + if (rc < -1) + break; + if (!strcmp(first, locale)) { + resolved = strmalloc(second); + found = 1; + break; + } + } while (rc >= 0); + + if (!found) { + if (resolved == NULL) { + resolved = strmalloc(locale); + } + } + + fclose(f); + } else { + perror(locale_alias); } - fclose(f); - return resolved; - - bail: - if(f != NULL) - fclose(f); - if(resolved != NULL) - free(resolved); - return NULL; } |