#include <stdio.h>
#include <string.h>
#include "../lint.h"
#include "../interface.h"
#include "../object.h"
/* Define variables */
extern struct object *previous_ob;

/* Define functions */

extern char *malloc(unsigned);
#ifdef _SEQUENT_
extern void *alloca(unsigned);
#endif

char lower(char c)
{
    char   ret;

    ret = c;
    if (ret < 96)
        ret += 32;
    return ret;
}

static void
global_article(struct svalue *fp)
{
    char    *tmp, *a;

    if (fp[0].type != T_STRING)
    {
        push_number(0);
	return;
    }
    tmp = alloca((strlen(fp[0].u.string) + 2));
    strcpy(tmp, (char *)(fp[0].u.string));
    strcat(tmp, " ");
    tmp[0] = (char)lower(tmp[0]);

    if (!strncmp(tmp, "the ", 4))
    {
        push_string("", STRING_CONSTANT);
        return;
    }
    if (tmp[0] == 'a' || tmp[0] == 'e' || tmp[0] == 'i' ||
	tmp[0] == 'o' || tmp[0] == 'u')
    {
        push_string("an", STRING_CONSTANT);
	return;
    }
    push_string("a", STRING_CONSTANT);
    return;
}

static func func_article = 
{
    "article",
    global_article,
};

static void
global_plural_word(struct svalue *fp)
{
    char *tmp, *str, ultimate, penultimate;
    int sl;
    
    if (fp[0].type != T_STRING)
    {
	push_number(0);
	return;
    }
    str = fp[0].u.string;

    if (strcmp(str, "tooth") == 0)
    {
	push_string("teeth", STRING_CONSTANT); return;
    }
    else if (strcmp(str, "foot") == 0)
    {
	push_string("feet", STRING_CONSTANT); return;
    }
    else if (strcmp(str, "man") == 0)
    {
	push_string("men", STRING_CONSTANT); return;
    }
    else if (strcmp(str, "woman") == 0)
    {
	push_string("women", STRING_CONSTANT); return;
    }
    else if (strcmp(str, "child") == 0)
    {
	push_string("children", STRING_CONSTANT); return;
    }
    else if (strcmp(str, "sheep") == 0)
    {
	push_string("sheep", STRING_CONSTANT); return;
    }
    else if (strcmp(str, "key") == 0)
    {
	push_string("keys", STRING_CONSTANT); return;
    }
    
    if ((sl = strlen(str)) < 3)
    {
	push_string(str, STRING_MALLOC);
	return;
    }
    tmp = alloca((strlen((char *)str) + 10));
    strncpy(tmp, str, sl);
    ultimate = str[sl - 1];
    penultimate = str[sl - 2];
    tmp[sl] = '\0';

    switch(ultimate)
    {
    case 's':
    case 'x':
    case 'h':
	strcat(tmp, "es");
	break;
    case 'y':
	if (penultimate == 'a' || penultimate == 'e' || penultimate == 'o')
	    strcat(tmp, "s");
	else
	{
	    tmp[sl - 1] = '\0';
	    strcat(tmp, "ies");
	}
	break;
    case 'e':
	if (penultimate == 'f')
	{
	    tmp[sl - 1] = '\0';
	    strcat(tmp, "ves");
	}
	break;
    default:
	strcat(tmp, "s");
	break;
    }
    push_string(tmp, STRING_MALLOC);
    return;
}

static func func_plural_word = 
{
    "plural_word",
    global_plural_word,
};


static func *(funcs[]) =
{
    &func_article,
    &func_plural_word,
    0,
};
static var *(vars[]) =
{
   0,
};

struct interface gl_language = 
{
    "sys/global/language.c",
    vars,
    funcs,
};