/********************************************************************
* lindner
* 3.12
* 1994/10/13 05:26:38
* /home/arcwelder/GopherSrc/CVS/gopher+/object/VIews.c,v
* Exp
*
* Paul Lindner, University of Minnesota CIS.
*
* Copyright 1991, 1992, 1993 by the Regents of the University of Minnesota
* see the file "Copyright" in the distribution for conditions of use.
*********************************************************************
* MODULE: VIews.c
* Various functions to handle gopher+ views
*********************************************************************
* Revision History:
* VIews.c,v
* Revision 3.12  1994/10/13  05:26:38  lindner
* Compiler complaint fixes
*
* Revision 3.11  1994/07/21  22:33:38  lindner
* Update for Language strings
*
* Revision 3.10  1994/06/29  06:55:25  lindner
* made VIprettyLang non-case-sensitive when checking lang codes
*
* Accept views without sizes (since the Gopher+ protocol docs say
* they're acceptable)  (Coopersmith)
*
* Revision 3.9  1994/03/08  17:24:03  lindner
* View language strangeness fixes from Dave Shield
*
* Revision 3.8  1994/03/04  17:44:21  lindner
* Fix for size processing
*
* Revision 3.7  1994/01/21  04:09:29  lindner
* Fix for bad VIEWS blocks
*
* Revision 3.6  1993/12/27  16:21:58  lindner
* Fix bug where no language in gopherd.conf would crash the server
*
* Revision 3.5  1993/08/24  21:03:52  lindner
* Fix spelling typo
*
* Revision 3.4  1993/07/29  20:00:06  lindner
* none
*
* Revision 3.3  1993/07/23  04:49:06  lindner
* Added PrettyView fcn
*
* Revision 3.2  1993/03/24  17:09:01  lindner
* Fixed a memory leak
*
* Revision 3.1.1.1  1993/02/11  18:03:01  lindner
* Gopher+1.2beta release
*
* Revision 2.1  1993/02/09  22:48:50  lindner
* Changes for multilingual views
*
* Revision 1.1  1993/01/31  00:31:12  lindner
* Initial revision
*
*
*********************************************************************/

#include "VIews.h"
#include "Malloc.h"
#include "String.h"
#include "BLblock.h"


static char *ANSILangs[] = {
    "Da_DK", "Nl_BE", "Nl_NL", "En_GB", "En_US", "Fi_FI", "Fr_BE",
    "Fr_CA", "Fr_CH", "Fr_FR", "De_CH", "De_DE", "El_GR", "Is_IS",
    "It_IT", "Jp_JP", "No_NO", "Pt_PT", "Es_ES", "Sv_SE", "Tr_TR",
    NULL
    };

static char *ANSILangEn[] = {
    "Danish",
    "Dutch (Belgium)",
    "Dutch",
    "English (Great Britain)",
    "English (USA)",
    "Finnish",
    "Fran�ais (Belgium)",
    "Fran�ais (Canada)",
    "Fran�ais (Suisse)",
    "Fran�ais",
    "Deutsch (Suisse)",
    "Deutsch",
    "Greek",
    "Icelandic",
    "Italiano",
    "Japanese",
    "Norwegian",
    "Portugues",
    "Espa�ol",
    "Swedish",
    "Turkish",
    NULL
    };


char *
VIprettyLang(vi, currentlang)
 VIewobj *vi;
 char    *currentlang;
{
    int i;
    char *cp = VIgetLang(vi);

        if (VIgetLang(vi) == NULL)
                return(NULL);
    for (i=0; ;i++) {
         if (ANSILangs[i] == NULL)
              return(NULL);

         if (strcasecmp(ANSILangs[i], cp) == 0)
              return(ANSILangEn[i]);
    }
}




VIewobj *
VInew()
{
    VIewobj *temp;

    temp = (VIewobj *) malloc(sizeof(VIewobj));

    temp->Type = STRnew();
    temp->Lang = STRnew();
    temp->Size = STRnew();
    temp->comments = STRnew();

    VIinit(temp);
    return(temp);
}

/*** Initialize the VIewobj ***/

void
VIinit(vi)
 VIewobj *vi;
{
    STRinit(vi->Type);
    STRinit(vi->Lang);
    STRinit(vi->Size);
    STRinit(vi->comments);
}


/** Destroy the VIewobj ***/

void
VIdestroy(vi)
 VIewobj *vi;
{
    STRdestroy(vi->Type);
    STRdestroy(vi->Lang);
    STRdestroy(vi->Size);
    STRdestroy(vi->comments);

    free(vi);
}


/** copy a VIewobj **/

void
VIcpy(videst, viorig)
 VIewobj *videst, *viorig;
{
    STRcpy(videst->Type, viorig->Type);
    STRcpy(videst->Lang, viorig->Lang);
    STRcpy(videst->Size, viorig->Size);
    STRcpy(videst->comments, viorig->comments);
}


/** Put a VIewobj in a line according to G+ protocol **/

void
VItoLine(vi, tmpstr)
 VIewobj *vi;
 char *tmpstr;
{
    char *cp;

    tmpstr[0] = ' ';
    tmpstr[1] = '\0';

    strcat(tmpstr, VIgetType(vi));

    cp = VIgetLang(vi);
    if (cp != NULL && *cp != '\0') {
         strcat(tmpstr, " ");
         strcat(tmpstr, cp);
    }

    /** Size **/
    cp = VIgetSize(vi);
    if (cp != NULL && *cp != '\0') {
         strcat(tmpstr, ": <");
         strcat(tmpstr, VIgetSize(vi));
         strcat(tmpstr, ">");
    } else {
         strcat(tmpstr, ": ");
    }

    /** Comments **/
    cp = VIgetComments(vi);
    if (cp != NULL && *cp != '\0') {
         strcat(tmpstr, " ");
         strcat(tmpstr, cp);
    }
}


/** Siphon a G+ view line into a VIewobj **/

boolean
VIfromLine(vi, line)
 VIewobj *vi;
 char *line;
{
    char tmpstr[256], *cp;
    int i;

    /** Okay, read until the next space, put the result in tmpstr **/
    for (cp = line,i=0; (*cp != ' '&&*cp!='\0'&&*cp!=':'); cp++,i++)
         tmpstr[i] = *cp;

    tmpstr[i]='\0';
    line = cp+1;
    VIsetType(vi, tmpstr);

    if (*line == '\0')
         return(FALSE);


    /** Parse language **/
    if (*line != ':') {
         for (cp = line,i=0; (*cp != ' '&&*cp!='\0'&& *cp!=':'); cp++,i++)
              tmpstr[i] = *cp;
         tmpstr[i]='\0';
         line = cp+1;
         VIsetLang(vi, tmpstr);
    }

    if (*line == '\0')
         return(FALSE);

    /** Okay, parse off the size (if present) **/
    cp = strchr(line,'<');

    if (cp != NULL) {
         for (cp++,i=0; (*cp!='\0'&& *cp!='>'); cp++,i++)
              tmpstr[i] = *cp;
         tmpstr[i]='\0';
         line = cp+1;
         VIsetSize(vi, tmpstr);
    }

    if (*line != '\0')
         VIsetComments(vi, line);

    return(TRUE);
}

char *
VIgetViewnLang(vi, line)
 VIewobj *vi;
 char *line;
{
    char *cp;

    if (VIgetType(vi) == NULL)
         return("");
    strcpy(line, VIgetType(vi));

    cp = VIgetLang(vi);
    if (cp != NULL && *cp != '\0') {
         strcat(line, " ");
         strcat(line, VIgetLang(vi));
    }
    return(line);
}


/*
* Generates a View Array from a Block
*/

void
VIAfromBL(via,bl)
 VIewArray *via;
 Blockobj *bl;
{
    int i;
    char *cp;
    VIewobj   *vi;

    if (strcasecmp(BLgetName(bl),"VIEWS")!=0)
         return;

    vi  = VInew();

    for (i=0; i<BLgetNumLines(bl);i++) {
         cp = BLgetLine(bl, i);
         VIinit(vi);

         if (VIfromLine(vi, cp))
              VIApush(via,vi);
    }
    VIdestroy(vi);

}


char *
VIgetPrettyView(vi, line)
 VIewobj *vi;
 char *line;
{
    char *cp;

    if (VIgetType(vi) == NULL)
         return("");
    strcpy(line, VIgetType(vi));

    cp = VIprettyLang(vi, "");
    if (cp != NULL && *cp != '\0') {
         strcat(line, " ");
         strcat(line, cp);
    }

    cp = VIgetSize(vi);
    if ( (cp != NULL) && (*cp != '\0') ) {
       strcat(line, " [");
       strcat(line, cp);
       strcat(line, "]");
    }
    return(line);
}