/***************************************************************************
 *             __________               __   ___.
 *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
 *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
 *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
 *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
 *                     \/            \/     \/    \/            \/
 *
 * Copyright (C) 2010 Robert Bieber
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 * KIND, either express or implied.
 *
 ****************************************************************************/

#include "tag_table.h"

#include <string.h>

/* The tag definition table */
struct tag_info legal_tags[] = 
{
    { "ac", "" },
    { "al", "" },
    { "aL", "" },
    { "ar", "" },
    { "aR", "" },
    { "ax", "" },
    
    { "bl" , "*fIIII" },
    { "bv", "" },
    { "bt", "" },
    { "bs", "" },
    { "bc", "" },
    { "bp", "" },
    { "bu", "" },
    
    
    { "cc", "" },
    { "cd", "" },
    { "ce", "" },
    { "cf", "" },
    { "cH", "" },
    { "ck", "" },
    { "cI", "" },
    { "cl", "" },
    { "cm", "" },
    { "cM", "" },
    { "cS", "" },
    { "cy", "" },
    { "cY", "" },
    { "cP", "" },
    { "cp", "" },
    { "ca", "" },
    { "cb", "" },
    { "cu", "" },
    { "cw", "" },
        
    { "fb", "" },
    { "fc", "" },
    { "ff", "" },
    { "fk", "" },
    { "fm", "" },
    { "fn", "" },
    { "fp", "" },
    { "fs", "" },
    { "ft", "" },
    { "fv", "" },
    { "d"  , "I" },
    
    { "Fb", "" },
    { "Fc", "" },
    { "Ff", "" },
    { "Fk", "" },
    { "Fm", "" },
    { "Fn", "" },
    { "Fp", "" },
    { "Fs", "" },
    { "Fv", "" },
    { "D"  , "I" },
    
    
    { "ia", "" },
    { "ic", "" },
    { "id", "" },
    { "iA", "" },
    { "iG", "" },
    { "ig", "" },
    { "ik", "" },
    { "in", "" },
    { "it", "" },
    { "iv", "" },
    { "iy", "" },
    { "iC", "" },
    
    { "Ia", "" },
    { "Ic", "" },
    { "Id", "" },
    { "IA", "" },
    { "IG", "" },
    { "Ig", "" },
    { "Ik", "" },
    { "In", "" },
    { "It", "" },
    { "Iv", "" },
    { "Iy", "" },
    { "IC", "" },
    
    { "Sp", "" },
    { "Ss", "" },
    
    { "lh", "" },
    
    { "mh", "" },
    { "mr", "" },
    { "mm", "" },
    { "mp", "" },
    { "mv", "|I" },
    
    { "pm", "" },
    { "pf", "" },
    { "pb" , "*fIIII" },
    { "pv" , "*fIIII" },
    
    { "px", "" },
    { "pc", "" },
    { "pr", "" },
    { "pt", "" },
    { "Pt", "" },
    { "pS" , "|I"},
    { "pE" , "|I"},
    { "pp", "" },
    { "pe", "" },
    { "pn", "" },
    { "ps", "" },
    
    { "rp", "" },
    { "rr", "" },
    { "ra", "" },
    
    { "rg", "" },
    { "xf", "" },
    
    { "tp", "" },
    { "tt", "" },
    { "tm", "" },
    { "ts", "" },
    { "ta", "" },
    { "tb", "" },
    { "tf", "" },
    { "Ti", "" },
    { "Tn", "" },
    { "Tf", "" },
    { "Tc", "" },
    { "tx", "" },
    { "ty", "" },
    { "tz", "" },
    
    { "s", "" },
    { "t"  , "I" },
    
    { "we", "" },
    { "wd", "" },
    { "wi", "" },
    
    { "xl", "SFIIi" },
    { "xd", "S" },
    { "x", "SFII" },
    
    { "Fl" , "IF"},
    { "Cl" , "IISS"},
    { "C" , "important"},
    
    { "Vd" , "S"},
    { "VI" , "S"},
    
    { "Vp" , "ICC"},
    { "Lt" , ""},
    { "Li" , ""},
    
    { "Vl" , "SIIiii|ii"},
    { "Vi" , "sIIiii|ii"},
    { "V"  , "IIiii|ii"},
    
    { "X"  , "f"},
    
    { "St" , "S"},
    { "Sx" , "S"},
    { "Sr" , ""},
    
    { "Tl" , "|I"},
    { "cs", "" },
    { "T"  , "IIiiI"},
    
    { "Rp"   , ""},
    { "Rr"   , ""},
    { "Rf"   , ""},
    { "Re"   , ""},
    { "Rb"   , ""},
    { "Rm"   , ""},
    { "Rs"   , ""},
    { "Rn"   , ""},
    { "Rh"   , ""},
    { "s",""},
    
    { ""   , ""} /* Keep this here to mark the end of the table */
};

/* A table of legal escapable characters */
char legal_escape_characters[] = "%(,);#<|>";

/*
 * Just does a straight search through the tag table to find one by
 * the given name
 */
char* find_tag(char* name)
{
    
    struct tag_info* current = legal_tags;
    
    /* 
     * Continue searching so long as we have a non-empty name string
     * and the name of the current element doesn't match the name
     * we're searching for
     */
    
    while(strcmp(current->name, name) && current->name[0] != '\0')
        current++;

    if(current->name[0] == '\0')
        return NULL;
    else
        return current->params;

}

/* Searches through the legal escape characters string */
int find_escape_character(char lookup)
{
    char* current = legal_escape_characters;
    while(*current != lookup && *current != '\0')
        current++;

    if(*current == lookup)
        return 1;
    else
        return 0;
}
