home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 2004 March
/
CMCD0304.ISO
/
Software
/
Freeware
/
Programare
/
nullsoft
/
nsis20.exe
/
Source
/
lang.h
< prev
next >
Wrap
C/C++ Source or Header
|
2004-01-20
|
7KB
|
309 lines
#ifndef ___NLF___H_____
#define ___NLF___H_____
#include "exehead/fileform.h"
struct NLFRef {
int iRef;
int iUnRef;
};
struct langstring {
int name;
int sn;
int index;
int uindex;
int process;
};
class LangStringList : public SortedStringListND<struct langstring>
{
public:
LangStringList() {
count = 0;
}
~LangStringList() { }
int add(const char *name, int *sn=0)
{
int pos = SortedStringListND<struct langstring>::add(name);
if (pos == -1) return -1;
((struct langstring*)gr.get())[pos].sn = count;
if (sn) *sn = count;
count++;
((struct langstring*)gr.get())[pos].index = -1;
((struct langstring*)gr.get())[pos].uindex = -1;
((struct langstring*)gr.get())[pos].process = 1;
return pos;
}
int get(char *name, int *sn=0, int *index=0, int *uindex=0, int *process=0)
{
if (index) *index = -1;
if (uindex) *uindex = -1;
if (sn) *sn = -1;
int v=SortedStringListND<struct langstring>::find(name);
if (v==-1) return -1;
if (index) *index = ((struct langstring*)gr.get())[v].index;
if (uindex) *uindex = ((struct langstring*)gr.get())[v].uindex;
if (sn) *sn = ((struct langstring*)gr.get())[v].sn;
if (process) *process = ((struct langstring*)gr.get())[v].process;
return v;
}
void set(int pos, int index=-1, int uindex=-1, int process=-1)
{
if ((unsigned int)pos > (gr.getlen() / sizeof(struct langstring)))
return;
struct langstring *data=(struct langstring *)gr.get();
if (index >= 0)
data[pos].index = index;
if (uindex >= 0)
data[pos].uindex = uindex;
if (process >= 0)
data[pos].process = process;
}
void set(char *name, int index, int uindex=-1, int process=-1)
{
set(get(name), index, uindex, process);
}
const char *pos2name(int pos)
{
struct langstring *data=(struct langstring *)gr.get();
if ((unsigned int)pos > (gr.getlen() / sizeof(struct langstring)))
return 0;
return ((const char*)strings.get() + data[pos].name);
}
const char *offset2name(int name)
{
if ((unsigned int)name > (unsigned int)strings.getlen())
return 0;
return (const char*)strings.get() + name;
}
int getnum()
{
return gr.getlen() / sizeof(struct langstring);
}
static int compare_index(const void *item1, const void *item2)
{
struct langstring *ls1 = (struct langstring *)item1;
struct langstring *ls2 = (struct langstring *)item2;
return ls1->index - ls2->index;
}
struct langstring *sort_index(int *num)
{
if (!num) return 0;
sortbuf.resize(0);
sortbuf.add(gr.get(), gr.getlen());
*num = sortbuf.getlen() / sizeof(struct langstring);
qsort(sortbuf.get(), *num, sizeof(struct langstring), compare_index);
return (struct langstring*) sortbuf.get();
}
static int compare_uindex(const void *item1, const void *item2)
{
struct langstring *ls1 = (struct langstring *)item1;
struct langstring *ls2 = (struct langstring *)item2;
return ls1->uindex - ls2->uindex;
}
struct langstring *sort_uindex(int *num)
{
if (!num) return 0;
sortbuf.resize(0);
sortbuf.add(gr.get(), gr.getlen());
*num = sortbuf.getlen() / sizeof(struct langstring);
qsort(sortbuf.get(), *num, sizeof(struct langstring), compare_uindex);
return (struct langstring*) sortbuf.get();
}
private:
int count;
TinyGrowBuf sortbuf;
};
class StringsArray
{
private:
TinyGrowBuf offsets;
GrowBuf strings;
public:
StringsArray()
{
offsets.set_zeroing(1);
strings.add("", sizeof(""));
}
~StringsArray() { }
void resize(int num)
{
offsets.resize(num * sizeof(int));
}
int set(int idx, char *str)
{
if (idx < 0)
return 0;
if (idx >= (int)(offsets.getlen() / sizeof(int)))
resize(idx+1);
int old = ((int*)offsets.get())[idx];
((int*)offsets.get())[idx] = strings.add(str, strlen(str) + 1);
return old;
}
const char *get(int idx)
{
if ((unsigned int)idx >= (offsets.getlen() / sizeof(int)))
return 0;
return (const char *)strings.get() + ((int*)offsets.get())[idx];
}
};
#define NLF_VERSION 6
enum {
NLF_BRANDING,
NLF_CAPTION,
NLF_UCAPTION,
NLF_SUBCAPTION_LICENSE,
NLF_SUBCAPTION_OPTIONS,
NLF_SUBCAPTION_DIR,
NLF_SUBCAPTION_INSTFILES,
NLF_SUBCAPTION_COMPLETED,
NLF_USUBCAPTION_OPTIONS,
NLF_USUBCAPTION_DIR,
NLF_USUBCAPTION_CONFIRM,
NLF_USUBCAPTION_INSTFILES,
NLF_USUBCAPTION_COMPLETED,
NLF_BTN_BACK,
NLF_BTN_NEXT,
NLF_BTN_LICENSE,
NLF_BTN_LICENSE_AGREE,
NLF_BTN_LICENSE_DISAGREE,
NLF_BTN_INSTALL,
NLF_BTN_UNINSTALL,
NLF_BTN_CANCEL,
NLF_BTN_CLOSE,
NLF_BTN_BROWSE,
NLF_BTN_DETAILS,
NLF_CLICK_NEXT,
NLF_CLICK_INSTALL,
NLF_CLICK_UNINSTALL,
NLF_NAME,
NLF_NAME_DA, // name with doubled ampersands - virtual
NLF_COMPLETED,
NLF_LICENSE_TEXT,
NLF_LICENSE_TEXT_FSCB,
NLF_LICENSE_TEXT_FSRB,
NLF_ULICENSE_TEXT,
NLF_ULICENSE_TEXT_FSCB,
NLF_ULICENSE_TEXT_FSRB,
NLF_LICENSE_DATA, // virtual
NLF_COMP_CUSTOM,
NLF_COMP_TEXT,
NLF_COMP_SUBTEXT1,
NLF_COMP_SUBTEXT1_NO_INST_TYPES,
NLF_COMP_SUBTEXT2,
NLF_UCOMP_TEXT,
NLF_UCOMP_SUBTEXT1,
NLF_UCOMP_SUBTEXT1_NO_INST_TYPES,
NLF_UCOMP_SUBTEXT2,
NLF_DIR_TEXT,
NLF_DIR_SUBTEXT,
NLF_DIR_BROWSETEXT,
NLF_UDIR_TEXT,
NLF_UDIR_SUBTEXT,
NLF_UDIR_BROWSETEXT,
NLF_SPACE_AVAIL,
NLF_SPACE_REQ,
NLF_UNINST_TEXT,
NLF_UNINST_SUBTEXT,
NLF_FILE_ERROR,
NLF_FILE_ERROR_NOIGNORE,
NLF_CANT_WRITE,
NLF_COPY_FAILED,
NLF_COPY_TO,
NLF_REGISTERING,
NLF_UNREGISTERING,
NLF_SYMBOL_NOT_FOUND,
NLF_COULD_NOT_LOAD,
NLF_CREATE_DIR,
NLF_CREATE_SHORTCUT,
NLF_CREATED_UNINST,
NLF_DEL_FILE,
NLF_DEL_ON_REBOOT,
NLF_ERR_CREATING_SHORTCUT,
NLF_ERR_CREATING,
NLF_ERR_DECOMPRESSING,
NLF_ERR_REG_DLL,
NLF_EXEC_SHELL,
NLF_EXEC,
NLF_EXTRACT,
NLF_ERR_WRITING,
NLF_INST_CORRUPTED,
NLF_NO_OLE,
NLF_OUTPUT_DIR,
NLF_REMOVE_DIR,
NLF_RENAME_ON_REBOOT,
NLF_RENAME,
NLF_SKIPPED,
NLF_COPY_DETAILS,
NLF_LOG_INSTALL_PROCESS,
NLF_BYTE,
NLF_KILO,
NLF_MEGA,
NLF_GIGA,
NLF_FONT,
NLF_FONTSIZE,
NLF_RTL,
NLF_STRINGS
};
struct NLF {
bool m_bLoaded;
char *m_szName;
char *m_szFont;
int m_iFontSize;
unsigned int m_uCodePage;
bool m_bRTL;
char *m_szStrings[NLF_STRINGS];
};
struct LanguageTable {
LANGID lang_id;
int dlg_offset;
StringsArray *lang_strings;
NLF nlf;
};
#endif