core/CTranslator.h
author David Anderson <dvander@alliedmods.net>
Wed Jan 17 06:49:59 2007 +0000 (2007-01-17)
changeset 308 f0e65f92cb34
parent 276 065d151c41b2
child 370 d3a484f98f6d
permissions -rw-r--r--
Redesigned how server commands work. The "plugins" command will be back soon.
     1 #ifndef _INCLUDE_SOURCEMOD_TRANSLATOR_H_
     2 #define _INCLUDE_SOURCEMOD_TRANSLATOR_H_
     3 
     4 #include "sm_trie.h"
     5 #include <sh_string.h>
     6 #include <sh_vector.h>
     7 #include "sm_globals.h"
     8 #include "sm_memtable.h"
     9 #include "ITextParsers.h"
    10 
    11 #define MAX_TRANSLATE_PARAMS		32
    12 
    13 /* :TODO: write a templatized version of tries? */
    14 
    15 using namespace SourceHook;
    16 class CTranslator;
    17 
    18 enum PhraseParseState
    19 {
    20 	PPS_None = 0,
    21 	PPS_Phrases,
    22 	PPS_InPhrase,
    23 };
    24 
    25 struct Language
    26 {
    27 	char m_code2[3];
    28 	int m_FullName;
    29 };
    30 
    31 struct Translation
    32 {
    33 	const char *szPhrase;
    34 	unsigned int lang_id;
    35 	unsigned int file_id;
    36 	void **params;
    37 };
    38 
    39 class CPhraseFile : public ITextListener_SMC
    40 {
    41 public:
    42 	CPhraseFile(CTranslator *pTranslator, const char *file);
    43 	~CPhraseFile();
    44 public:
    45 	void ReparseFile();
    46 	const char *GetFilename();
    47 	const char *GetTranslation(const Translation *pTrans, int **fmt_order, unsigned int *fmt_count);
    48 public: //ITextListener_SMC
    49 	void ReadSMC_ParseStart();
    50 	void ReadSMC_ParseEnd(bool halted, bool failed);
    51 	SMCParseResult ReadSMC_NewSection(const char *name, bool opt_quotes);
    52 	SMCParseResult ReadSMC_KeyValue(const char *key, const char *value, bool key_quotes, bool value_quotes);
    53 	SMCParseResult ReadSMC_LeavingSection();
    54 	SMCParseResult ReadSMC_RawLine(const char *line, unsigned int curline);
    55 private:
    56 	void ParseError(const char *message, ...);
    57 	void ParseWarning(const char *message, ...);
    58 private:
    59 	Trie *m_pPhraseLookup;
    60 	String m_File;
    61 	CTranslator *m_pTranslator;
    62 	PhraseParseState m_ParseState;
    63 	int m_CurPhrase;
    64 	BaseMemTable *m_pMemory;
    65 	BaseStringTable *m_pStringTab;
    66 	unsigned int m_LangCount;
    67 	String m_ParseError;
    68 	String m_LastPhraseString;
    69 	unsigned int m_CurLine;
    70 	bool m_FileLogged;
    71 };
    72 
    73 class CTranslator : public ITextListener_SMC
    74 {
    75 public:
    76 	CTranslator();
    77 	~CTranslator();
    78 public: //ITextListener_SMC
    79 	void ReadSMC_ParseStart();
    80 	SMCParseResult ReadSMC_NewSection(const char *name, bool opt_quotes);
    81 	SMCParseResult ReadSMC_KeyValue(const char *key, const char *value, bool key_quotes, bool value_quotes);
    82 	SMCParseResult ReadSMC_LeavingSection();
    83 public:
    84 	void RebuildLanguageDatabase(const char *lang_header_file);
    85 	unsigned int FindOrAddPhraseFile(const char *phrase_file);
    86 	BaseStringTable *GetStringTable();
    87 	unsigned int GetLanguageCount();
    88 	bool GetLanguageByCode(const char *code, unsigned int *index);
    89 	size_t Translate(char *buffer, size_t maxlength, const Translation *pTrans);
    90 private:
    91 	CVector<Language *> m_Languages;
    92 	CVector<CPhraseFile *> m_Files;
    93 	BaseStringTable *m_pStringTab;
    94 	Trie *m_pLCodeLookup;
    95 	bool m_InLanguageSection;
    96 	String m_CustomError;
    97 };
    98 
    99 extern CTranslator g_Translator;
   100 
   101 #endif //_INCLUDE_SOURCEMOD_TRANSLATOR_H_