diff options
Diffstat (limited to 'src/htsserver.h')
-rw-r--r-- | src/htsserver.h | 237 |
1 files changed, 174 insertions, 63 deletions
diff --git a/src/htsserver.h b/src/htsserver.h index 2818b34..acac908 100644 --- a/src/htsserver.h +++ b/src/htsserver.h @@ -41,6 +41,10 @@ Please visit our Website: http://www.httrack.com #include "htsbasenet.h" +/* String */ +#include "htsstrings.h" + + // Fonctions void socinput(T_SOC soc,char* s,int max); T_SOC smallserver_init_std(int* port_prox,char* adr_prox); @@ -70,79 +74,186 @@ int smallserver(T_SOC soc,char* url,char* method,char* data, char* path); "<!-- Generated by HTTrack Website Copier -->\r\n"\ "\r\n"\ +extern int NewLangStrSz; +extern inthash NewLangStr; +extern int NewLangStrKeysSz; +extern inthash NewLangStrKeys; +extern int NewLangListSz; +extern inthash NewLangList; -/* String */ - -typedef struct { - char* buff; - int len; - int capa; -} String; - -#define STRING_EMPTY {NULL, 0, 0} -#define BLK_SIZE 8192 -#define StringBuff(blk) ((blk)->buff) -#define StringLength(blk) ((blk)->len) -#define StringCapacity(blk) ((blk)->capa) -#define StringClear(blk) do { \ - if ((blk)->capa > 0) { \ - (blk)->buff[0] = '\0'; \ - }\ - (blk)->len = 0; \ -} while(0) -#define StringFree(blk) do { if ((blk)->buff != NULL) { freet((blk)->buff); (blk)->buff = NULL; } } while(0) -#define StringMemcat(blk, str, size) do { \ - if ((blk)->len + (int)(size) + 1 > (blk)->capa) { \ - (blk)->capa = (blk)->len + (size) + BLK_SIZE; \ - (blk)->buff = (char*) realloct((blk)->buff, (blk)->capa); \ - assertf((blk)->buff != NULL); \ - } \ - if ((int)(size) > 0) { \ - memcpy((blk)->buff + (blk)->len, (str), (size)); \ - (blk)->len += (size); \ - } \ - *((blk)->buff + (blk)->len) = '\0'; \ -} while(0) -#define StringAddchar(blk, c) do { \ - char __c = (c); \ - StringMemcat(blk, &__c, 1); \ -} while(0) -static void* StringAcquire(String* blk) { - void* buff = blk->buff; - blk->buff = NULL; - blk->capa = 0; - blk->len = 0; - return buff; -} +/* Spaces: CR,LF,TAB,FF */ +#define is_space(c) ( ((c)==' ') || ((c)=='\"') || ((c)==10) || ((c)==13) || ((c)==9) || ((c)==12) || ((c)==11) || ((c)=='\'') ) +#define is_realspace(c) ( ((c)==' ') || ((c)==10) || ((c)==13) || ((c)==9) || ((c)==12) || ((c)==11) ) +#define is_taborspace(c) ( ((c)==' ') || ((c)==9) ) +#define is_quote(c) ( ((c)=='\"') || ((c)=='\'') ) +#define is_retorsep(c) ( ((c)==10) || ((c)==13) || ((c)==9) ) -static void StringStrcat(String* blk, char* str) { - StringMemcat(blk, str, strlen(str)); -} +extern int smallserver_setkey(char* key, char* value); +extern int smallserver_setkeyint(char* key, LLint value); +extern int smallserver_setkeyarr(char* key, int id, char* key2, char* value); /* Language files */ -int htslang_load(char* limit_to, char* apppath); -void conv_printf(char* from,char* to); -void LANG_DELETE(void); -void LANG_INIT(char* path); -int LANG_T(char* path, int l); -int QLANG_T(int l); -char* LANGSEL(char* name); -char* LANGINTKEY(char* name); -int LANG_SEARCH(char* path, char* iso); -int LANG_LIST(char* path, char* buffer); +static int htslang_load(char* limit_to, char* apppath); +static void conv_printf(char* from,char* to); +static void LANG_DELETE(void); +static void LANG_INIT(char* path); +static int LANG_T(char* path, int l); +static int QLANG_T(int l); +static char* LANGSEL(char* name); +static char* LANGINTKEY(char* name); +static int LANG_SEARCH(char* path, char* iso); +static int LANG_LIST(char* path, char* buffer); int htslang_init(void); int htslang_uninit(void); -int linput_cpp(FILE* fp,char* s,int max); -void unescapehttp(char* s, String* tempo); -void unescapeini(char* s, String* tempo); +/* Static definitions */ + +static char* gethomedir(void); +static int linput_cpp(FILE* fp,char* s,int max); +static int linput_trim(FILE* fp,char* s,int max); +static char* concat(const char* a,const char* b); +static int fexist(char* s); +static int linput(FILE* fp,char* s,int max); +static int linputsoc_t(T_SOC soc, char* s, int max, int timeout); + +static char* gethomedir(void) { + char* home = getenv( "HOME" ); + if (home) + return home; + else + return "."; +} +static int linput_cpp(FILE* fp,char* s,int max) { + int rlen=0; + s[0]='\0'; + do { + int ret; + if (rlen>0) + if (s[rlen-1]=='\\') + s[--rlen]='\0'; // couper \ final + // lire ligne + ret=linput_trim(fp,s+rlen,max-rlen); + if (ret>0) + rlen+=ret; + } while((s[max(rlen-1,0)]=='\\') && (rlen<max)); + return rlen; +} +// copy of concat +typedef struct concat_strc { + char buff[16][HTS_URLMAXSIZE*2*2]; + int rol; +} concat_strc; +static char* concat(const char* a,const char* b) { + static concat_strc* strc = NULL; + if (strc == NULL) { + strc = (concat_strc*) calloc(16, sizeof(concat_strc)); + } + strc->rol=((strc->rol+1)%16); // roving pointer + strcpybuff(strc->buff[strc->rol],a); + if (b) strcatbuff(strc->buff[strc->rol],b); + return strc->buff[strc->rol]; +} + +static int fexist(char* s) { + struct stat st; + memset(&st, 0, sizeof(st)); + if (stat(s, &st) == 0) { + if (S_ISREG(st.st_mode)) { + return 1; + } + } + return 0; +} +static int linput(FILE* fp,char* s,int max) { + int c; + int j=0; + do { + c=fgetc(fp); + if (c!=EOF) { + switch(c) { + case 13: break; // sauter CR + case 10: c=-1; break; + case 0: case 9: case 12: break; // sauter ces caractères + default: s[j++]=(char) c; break; + } + } + } while((c!=-1) && (c!=EOF) && (j<(max-1))); + s[j]='\0'; + return j; +} +static int linput_trim(FILE* fp,char* s,int max) { + int rlen=0; + char* ls=(char*) malloct(max+2); + s[0]='\0'; + if (ls) { + char* a; + // lire ligne + rlen=linput(fp,ls,max); + if (rlen) { + // sauter espaces et tabs en fin + while( (rlen>0) && is_realspace(ls[max(rlen-1,0)]) ) + ls[--rlen]='\0'; + // sauter espaces en début + a=ls; + while((rlen>0) && ((*a==' ') || (*a=='\t'))) { + a++; + rlen--; + } + if (rlen>0) { + memcpy(s,a,rlen); // can copy \0 chars + s[rlen]='\0'; + } + } + // + freet(ls); + } + return rlen; +} + +static void unescapeini(char* s, String* tempo) { + int i; + char lastc=0; + for (i=0;i<(int) strlen(s);i++) { + if (s[i]=='%' && s[i+1]=='%') { + i++; + StringAddchar(*tempo, lastc = '%'); + } else if (s[i]=='%') { + char hc; + i++; + hc = (char) ehex(s+i); + if (!is_retorsep(hc) || !is_retorsep(lastc)) { + StringAddchar(*tempo, lastc = (char) hc); + } + i++; // sauter 2 caractères finalement + } + else + StringAddchar(*tempo, lastc = s[i]); + } +} + +#ifndef _WIN32 +#define fconv(a) (a) +#define fconcat(a,b) concat(a,b) +#endif + +#ifdef _WIN32 +static char* __fconv(char* a) { + int i; + for(i=0;i<(int) strlen(a);i++) + if (a[i]=='/') // convertir + a[i]='\\'; + return a; +} +static char* fconcat(char* a,char* b) { + return __fconv(concat(a,b)); +} +static char* fconv(char* a) { + return __fconv(concat(a,"")); +} +#endif -int smallserver_setkey(char* key, char* value); -int smallserver_setkeyint(char* key, LLint value); -int smallserver_setkeyarr(char* key, int id, char* key2, char* value); - #endif |