summaryrefslogtreecommitdiff
path: root/src/htsserver.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/htsserver.h')
-rw-r--r--src/htsserver.h237
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