/*
 * language.c: code for the Localization support.
 *
 * See Copyright for the status of this software.
 *
 * $Id: language.c,v 1.2 1999/01/24 12:42:14 daniel Exp $
 */

#include <config.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif

#include "rpmfind.h"
#include "rpmdata.h"

char *localizedStrings[] = {
    "",
    "No description !",
    "Unknown",
    "None",
    "unknown/group",
    "unknown.host",
    "no summary"
};

#define NB_STRINGS (sizeof(localizedStrings)/sizeof(char *))

/****************************************************************
 *								*
 *		The language file parser			*
 *								*
 ****************************************************************/

/*
 * A few macro needed to help building the parser
 */

#define IS_BLANK(ptr) \
     (((*(ptr)) == ' ') || ((*(ptr)) == '\b') || \
      ((*(ptr)) == '\n') || ((*(ptr)) == '\r'))
#define SKIP_BLANK(ptr) \
     { while (((*(ptr)) == ' ') || ((*(ptr)) == '\b') || \
              ((*(ptr)) == '\n') || ((*(ptr)) == '\r')) ptr++; }
#define GOTO_EQL(ptr) \
     { while (((*(ptr)) != '\0') && ((*(ptr)) != '=') && \
              ((*(ptr)) != '\n') && ((*(ptr)) != '\r')) ptr++; }
#define GOTO_EOL(ptr) \
     { while (((*(ptr)) != '\0') && \
              ((*(ptr)) != '\n') && ((*(ptr)) != '\r')) ptr++; }


/*
 * parse a language file
 */
int readLanguageFile(char *filename)
{
    FILE *input;
    char *str;
    char line[1000];
    char buffer[50000];
    int currentString;
    int len;

    input = fopen(filename, "r");
    if (input == NULL) {
	fprintf(stderr, "Cannot read language from %s :\n", filename);
	perror("fopen failed");
	return -1;
    }

    /*
     * all the localized strings are filled in one after the other.
     */
    buffer[0] = '\0';
    currentString = 0;

    while (1) {
	/*
	 * read one line
	 */
	if (fgets(&line[0], sizeof(line) - 1, input) == NULL)
	    break;

	str = &line[0];
	line[sizeof(line) - 1] = '\0';
	len = strlen(line);
	if ((len > 0) && (line[len - 1] == '\n'))
	    line[len - 1] = '\0';
	SKIP_BLANK(str)

	/*
	 * Comment starts with a semicolumn.
	 */
	if (*str == ';')
	continue;

	/*
	 * an empty line is a field separator.
	 */
	if (*str == '\0') {
	    if (buffer[0] != '\0') {
	        /*
		 * Check for localizedStrings overflow.
		 */
		if (currentString >= NB_STRINGS) {
		    fprintf(stderr,
	      "File %s contains too many localized messages (%d expected)\n",
		      filename, NB_STRINGS);
		    break;
		}

		/*
		 * the last paragraph correspond to the new localized
		 * string. Replace the old one and reset the buffer.
		 */
		localizedStrings[currentString] = strdup(buffer);
		currentString++;
		buffer[0] = '\0';
	    }
	    continue;
	}

	/*
	 * Aggregate the current line to the buffer.
	 */
	if (buffer[0] == '\0')
	    strcpy(buffer, line);
	else {
	    /*
	     * this is a multiline text field
	     */
	    strcat(buffer, "\n");
	    strcat(buffer, line);
	}
    }

    fclose(input);
    return (0);
}

/*
 * dump the internal set of string to an external language file.
 */
int writeLanguageFile(char *filename)
{
    FILE *output;
    int currentString;

    output = fopen(filename, "w");
    if (output == NULL) {
	fprintf(stderr, "Cannot write language to %s :\n", filename);
	perror("fopen failed");
	return -1;
    }
    fprintf(output, ";\n; Automatically generated %s %s language file\n;\n",
            RPMFIND_NAME, RPMFIND_VER);
    for (currentString = 0; currentString < NB_STRINGS; currentString++) {
	fprintf(output, "%s\n\n", localizedStrings[currentString]);
    }
    fclose(output);
    return (0);
}

