summaryrefslogtreecommitdiff
path: root/app/luit/parser.c
diff options
context:
space:
mode:
Diffstat (limited to 'app/luit/parser.c')
-rw-r--r--app/luit/parser.c203
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;
}