diff options
author | Xavier Roche <xroche@users.noreply.github.com> | 2014-05-26 19:27:46 +0000 |
---|---|---|
committer | Xavier Roche <xroche@users.noreply.github.com> | 2014-05-26 19:27:46 +0000 |
commit | 5364514f340287bcce591955fce500ed57d2da79 (patch) | |
tree | ca2097bd351fe9d4d137a2d7fe687dd0b815d56b /src/htscore.c | |
parent | f078a39677953cf8d3cdaedcb1b3c4db65473308 (diff) |
Big links heap handling cleanup, and removed very old and legacy macros
Diffstat (limited to 'src/htscore.c')
-rw-r--r-- | src/htscore.c | 676 |
1 files changed, 385 insertions, 291 deletions
diff --git a/src/htscore.c b/src/htscore.c index 6fe302a..61e8a89 100644 --- a/src/htscore.c +++ b/src/htscore.c @@ -107,12 +107,6 @@ int longest_hash[3] = { 0, 0, 0 }, hashnumber = 0; // Début de httpmirror, routines annexes -// pour alléger la syntaxe, des raccourcis sont créés -#define urladr (liens[ptr]->adr) -#define urlfil (liens[ptr]->fil) -#define savename (liens[ptr]->sav) -//#define level (liens[ptr]->depth) - // au cas où nous devons quitter rapidement xhttpmirror (plus de mémoire, etc) // note: partir de liens_max.. vers 0.. sinon erreur de violation de mémoire: les liens suivants // ne sont plus à nous.. agh! [dur celui-là] @@ -122,20 +116,8 @@ RUN_CALLBACK0(opt, end); \ } #define XH_extuninit do { \ - int i; \ HTMLCHECK_UNINIT \ - if (liens!=NULL) { \ - for(i=lien_max-1;i>=0;i--) { \ - if (liens[i]) { \ - if (liens[i]->firstblock==1) { \ - freet(liens[i]); \ - liens[i]=NULL; \ - } \ - } \ - } \ - freet(liens); \ - liens=NULL; \ - } \ + hts_record_free(opt); \ if (filters && filters[0]) { \ freet(filters[0]); filters[0]=NULL; \ } \ @@ -175,59 +157,224 @@ RUN_CALLBACK0(opt, end); \ } while(0) #define XH_uninit do { XH_extuninit; if (r.adr) { freet(r.adr); r.adr=NULL; } } while(0) -// Enregistrement d'un lien: -// on calcule la taille nécessaire: taille des 3 chaînes à stocker (taille forcée paire, plus 2 octets de sécurité) -// puis on vérifie qu'on a assez de marge dans le buffer - sinon on en réalloue un autre -// enfin on écrit à l'adresse courante du buffer, qu'on incrémente. on décrémente la taille dispo d'autant ensuite -// codebase: si non nul et si .class stockee on le note pour chemin primaire pour classes -// FA,FS: former_adr et former_fil, lien original -#define liens_record_sav_len(A) - -#define liens_record(A,F,S,FA,FF,NORM) { \ -int notecode=0; \ -size_t lienurl_len=((sizeof(lien_url)+HTS_ALIGN-1)/HTS_ALIGN)*HTS_ALIGN,\ - adr_len=strlen(A),\ - fil_len=strlen(F),\ - sav_len=strlen(S),\ - cod_len=0,\ - former_adr_len=strlen(FA),\ - former_fil_len=strlen(FF); \ -if (former_adr_len>0) {\ - former_adr_len=(former_adr_len/HTS_ALIGN)*HTS_ALIGN+HTS_ALIGN*2; \ - former_fil_len=(former_fil_len/HTS_ALIGN)*HTS_ALIGN+HTS_ALIGN*2; \ -} else former_adr_len=former_fil_len=0;\ -if (strlen(F)>6) if (strnotempty(codebase)) if (strfield(F+strlen(F)-6,".class")) { notecode=1; \ -cod_len=strlen(codebase); cod_len=(cod_len/HTS_ALIGN)*HTS_ALIGN+HTS_ALIGN*2; } \ -adr_len=(adr_len/HTS_ALIGN)*HTS_ALIGN+HTS_ALIGN*2; fil_len=(fil_len/HTS_ALIGN)*HTS_ALIGN+HTS_ALIGN*2; sav_len=(sav_len/HTS_ALIGN)*HTS_ALIGN+HTS_ALIGN*2; \ -if ((int) lien_size < (int) (adr_len+fil_len+sav_len+cod_len+former_adr_len+former_fil_len+lienurl_len)) { \ -lien_buffer=(char*) ((void*) calloct(add_tab_alloc,1)); \ -lien_size=add_tab_alloc; \ -if (lien_buffer!=NULL) { \ -liens[lien_tot]=(lien_url*) (void*) lien_buffer; lien_buffer+=lienurl_len; lien_size-=lienurl_len; \ -liens[lien_tot]->firstblock=1; \ -} \ -} else { \ -liens[lien_tot]=(lien_url*) (void*) lien_buffer; lien_buffer+=lienurl_len; lien_size-=lienurl_len; \ -liens[lien_tot]->firstblock=0; \ -} \ -if (liens[lien_tot]!=NULL) { \ -liens[lien_tot]->adr=lien_buffer; lien_buffer+=adr_len; lien_size-=adr_len; \ -liens[lien_tot]->fil=lien_buffer; lien_buffer+=fil_len; lien_size-=fil_len; \ -liens[lien_tot]->sav=lien_buffer; lien_buffer+=sav_len; lien_size-=sav_len; \ -liens[lien_tot]->cod=NULL; \ -if (notecode) { liens[lien_tot]->cod=lien_buffer; lien_buffer+=cod_len; lien_size-=cod_len; strcpybuff(liens[lien_tot]->cod,codebase); } \ -if (former_adr_len>0) {\ -liens[lien_tot]->former_adr=lien_buffer; lien_buffer+=former_adr_len; lien_size-=former_adr_len; \ -liens[lien_tot]->former_fil=lien_buffer; lien_buffer+=former_fil_len; lien_size-=former_fil_len; \ -strcpybuff(liens[lien_tot]->former_adr,FA); \ -strcpybuff(liens[lien_tot]->former_fil,FF); \ -}\ -strcpybuff(liens[lien_tot]->adr,A); \ -strcpybuff(liens[lien_tot]->fil,F); \ -strcpybuff(liens[lien_tot]->sav,S); \ -liens_record_sav_len(liens[lien_tot]); \ -hash_write(hashptr,lien_tot); \ -} \ +// Typed array +#define TypedArray(T) \
+ struct { \
+ T* elts; \
+ size_t size; \
+ size_t capa; \
+ } +#define EMPTY_TYPED_ARRAY { NULL, 0, 0 } + +#define TypedArrayAdd(A, E) do { \ + if ((A).capa == (A).size) { \ + (A).capa = (A).capa < 16 ? 16 : (A).capa * 2; \ + (A).elts = realloct((A).elts, (A).capa*sizeof(*(A).elts)); \ + } \ + assertf((A).size < (A).capa); \ + (A).elts[(A).size++] = (E); \ +} while(0) + +#define TypedArrayFree(A) do { \ + if ((A).elts != NULL) { \ + freet((A).elts); \ + (A).elts = NULL; \ + (A).capa = (A).size = 0; \ + } \ +} while(0) + +struct lien_buffers { + /* Main array of pointers. + This is the real "lien_url **liens" pointer base. */ + TypedArray(lien_url*) ptr; + /* String pool, chunked. */ + char *string_buffer; + size_t string_buffer_size; + size_t string_buffer_capa; + TypedArray(char*) string_buffers; + /* Structure list, chunked. */ + lien_url *lien_buffer; + size_t lien_buffer_size; + size_t lien_buffer_capa; + TypedArray(lien_url*) lien_buffers; +}; + +// duplicate a string, or return NULL upon error (out-of-memory) +static char* hts_record_link_strdup_(httrackp *opt, const char *s) { + static const size_t block_capa = 256000; + lien_buffers *const liensbuf = opt->liensbuf; + const size_t len = strlen(s) + 1; /* including terminating \0 */ + char *s_dup; + + assertf(liensbuf != NULL); + + // not enough capacity ? then create a new chunk + if (len + liensbuf->string_buffer_size > liensbuf->string_buffer_capa) { + // backup current block pointer for later free + if (liensbuf->string_buffer != NULL) { + TypedArrayAdd(liensbuf->string_buffers, liensbuf->string_buffer); + liensbuf->string_buffer = NULL; + liensbuf->string_buffer_size = 0; + liensbuf->string_buffer_capa = 0; + } + + liensbuf->string_buffer = malloct(block_capa); + if (liensbuf->string_buffer == NULL) { + return NULL; + } + liensbuf->string_buffer_capa = block_capa; + liensbuf->string_buffer_size = 0; + } + + assertf(len + liensbuf->string_buffer_size < liensbuf->string_buffer_capa); + s_dup = &liensbuf->string_buffer[liensbuf->string_buffer_size]; + memcpy(s_dup, s, len); + liensbuf->string_buffer_size += len; + + return s_dup; +} + +static char* hts_record_link_strdup(httrackp *opt, const char *s) { + assertf(opt != NULL); + assertf(s != NULL); + return hts_record_link_strdup_(opt, s); +} + +size_t hts_record_link_latest(httrackp *opt) { + lien_buffers *const liensbuf = opt->liensbuf; + + assertf(liensbuf->ptr.size != 0); + return liensbuf->ptr.size - 1; +} + +// returns a new zeroed lien_url entry, +// or (size_t) -1 upon error (out-of-memory) +// the returned index is the osset within opt->liens[] +static size_t hts_record_link_alloc(httrackp *opt) { + static const size_t block_capa = 10000; + lien_buffers *const liensbuf = opt->liensbuf; + lien_url *link; + + assertf(opt != NULL); + assertf(liensbuf != NULL); + + // Create a new chunk of lien_url[] + // There are references to item pointers, so we can not just realloc() + if (liensbuf->lien_buffer_size == liensbuf->lien_buffer_capa) { + TypedArrayAdd(liensbuf->lien_buffers, liensbuf->lien_buffer); + liensbuf->lien_buffer_size = 0; + liensbuf->lien_buffer_capa = 0; + + liensbuf->lien_buffer = (lien_url*) malloct(block_capa*sizeof(*liensbuf->lien_buffer)); + if (liensbuf->lien_buffer == NULL) { + return (size_t) -1; + } + liensbuf->lien_buffer_capa = block_capa; + liensbuf->lien_buffer_size = 0; + } + + // Take next lien_url item + assertf(liensbuf->lien_buffer_size < liensbuf->lien_buffer_capa); + link = &liensbuf->lien_buffer[liensbuf->lien_buffer_size++]; + memset(link, 0, sizeof(*link)); + + // Add new lien_url pointer to the array of links + TypedArrayAdd(liensbuf->ptr, link); + + // Update pointer as it may have changed, + // and update heap top index + opt->liens = liensbuf->ptr.elts; + assertf(liensbuf->ptr.size != 0); + assertf(liensbuf->ptr.size < ( (unsigned int) -1 ) / 2); + opt->lien_tot = (int) liensbuf->ptr.size; + + // return tail + return hts_record_link_latest(opt); +} + +void hts_record_init(httrackp *opt) { + if (opt->liensbuf == NULL) { + opt->liensbuf = calloct(sizeof(*opt->liensbuf), 1); + } +} + +// wipe records +void hts_record_free(httrackp *opt) { + lien_buffers *const liensbuf = opt->liensbuf; + + if (liensbuf != NULL) { + size_t i; + + TypedArrayFree(liensbuf->ptr); + + if (liensbuf->string_buffer != NULL) { + freet(liensbuf->string_buffer); + liensbuf->string_buffer = NULL; + liensbuf->string_buffer_size = 0; + liensbuf->string_buffer_capa = 0; + } + + for(i = 0 ; i < liensbuf->string_buffers.size ; i++) { + freet(liensbuf->string_buffers.elts[i]); + liensbuf->string_buffers.elts[i] = NULL; + } + TypedArrayFree(liensbuf->string_buffers); + + if (liensbuf->lien_buffer != NULL) { + freet(liensbuf->lien_buffer); + liensbuf->lien_buffer = NULL; + } + + for(i = 0 ; i < liensbuf->lien_buffers.size ; i++) { + freet(liensbuf->lien_buffers.elts[i]); + liensbuf->lien_buffers.elts[i] = NULL; + } + TypedArrayFree(liensbuf->lien_buffers); + + freet(opt->liensbuf); + opt->liensbuf = NULL; + } + + opt->liens = NULL; // no longer defined +} + +// adds a new link and returns a non-zero value upon success +int hts_record_link(httrackp * opt, + const char *address, const char *file, const char *save, + const char *ref_address, const char *ref_file, + const char *codebase) { + // create a new entry + const size_t lien_tot = hts_record_link_alloc(opt); + lien_url*const link = lien_tot != (size_t) -1 ? opt->liens[lien_tot] : NULL; + if (link == NULL) { + return 0; + } + + // record string fields + if ( (link->adr = hts_record_link_strdup(opt, address)) == NULL + || (link->fil = hts_record_link_strdup(opt, file)) == NULL + || (link->sav = hts_record_link_strdup(opt, save)) == NULL + || (link->former_adr = hts_record_link_strdup(opt, ref_address)) == NULL + || (link->former_fil = hts_record_link_strdup(opt, ref_file)) == NULL + ) { + return 0; + } + + // record codebase for java classes + if (codebase != NULL) { + const size_t len = strlen(file); + if (len > 6 && strncmp(&file[len - 6], ".class", 6) == 0) { + if ((link->cod = hts_record_link_strdup(opt, codebase)) == NULL) { + return 0; + } + } + } + + // add entry in the hashtables + hash_write(opt->hash, lien_tot); + + // success + return 1; } #define HT_INDEX_END do { \ @@ -257,15 +404,9 @@ makeindex_done=1; /* ok c'est fait */ \ // url1 peut être multiple int httpmirror(char *url1, httrackp * opt) { char *primary = NULL; // première page, contenant les liens à scanner - int lien_tot = 0; // nombre de liens pour le moment - lien_url **liens = NULL; // les pointeurs sur les liens hash_struct hash; // système de hachage, accélère la recherche dans les liens hash_struct *const hashptr = &hash; t_cookie BIGSTK cookie; // gestion des cookies - int lien_max = 0; - size_t lien_size = 0; // octets restants dans buffer liens dispo - char *lien_buffer = NULL; // buffer liens actuel - int add_tab_alloc = 256000; // +256K de liens à chaque fois //char* tab_alloc=NULL; int ptr; // pointeur actuel sur les liens @@ -430,31 +571,16 @@ int httpmirror(char *url1, httrackp * opt) { // hash table opt->hash = &hash; - // tableau de pointeurs sur les liens - lien_max = maximum(opt->maxlink, 32); - liens = (lien_url **) malloct(lien_max * sizeof(lien_url *)); // tableau de pointeurs sur les liens - if (liens == NULL) { - printf("PANIC! : Not enough memory [%d]\n", __LINE__); - //XH_uninit; - return 0; - } else { - int i; + // initialize link heap + hts_record_init(opt); - for(i = 0; i < lien_max; i++) { - liens[i] = NULL; - } - } // initialiser ptr et lien_tot ptr = 0; - lien_tot = 0; // initialiser hachage hash_init(opt, &hash, opt->urlhack); // note: we need a cast because of the const - hash.liens = (const lien_url **) liens; - - // we need it - opt->liens = liens; + hash.liens = (const lien_url ***) &opt->liens; // copier adresse(s) dans liste des adresses { @@ -630,32 +756,28 @@ int httpmirror(char *url1, httrackp * opt) { } // lien primaire - liens_record("primary", "/primary", - fslash(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), + if (!hts_record_link(opt, "primary", "/primary", + fslash(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), fconcat(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), - StringBuff(opt->path_html_utf8), "index.html")), - "", "", opt->urlhack); - if (liens[lien_tot] == NULL) { // erreur, pas de place réservée + StringBuff(opt->path_html_utf8), "index.html")), + "", "", NULL)) { printf("PANIC! : Not enough memory [%d]\n", __LINE__); - hts_log_print(opt, LOG_PANIC, - "Not enough memory, can not re-allocate %d bytes", - (int) ((add_tab_alloc + 1) * sizeof(lien_url))); + hts_log_print(opt, LOG_PANIC, "Not enough memory"); XH_extuninit; // désallocation mémoire & buffers return 0; } - liens[lien_tot]->testmode = 0; // pas mode test - liens[lien_tot]->link_import = 0; // pas mode import - liens[lien_tot]->depth = opt->depth + 1; // lien de priorité maximale - liens[lien_tot]->pass2 = 0; // 1ère passe - liens[lien_tot]->retry = opt->retry; // lien de priorité maximale - liens[lien_tot]->premier = lien_tot; // premier lien, objet-père=objet - liens[lien_tot]->precedent = lien_tot; // lien précédent - lien_tot++; + heap_top()->testmode = 0; // pas mode test + heap_top()->link_import = 0; // pas mode import + heap_top()->depth = opt->depth + 1; // lien de priorité maximale + heap_top()->pass2 = 0; // 1ère passe + heap_top()->retry = opt->retry; // lien de priorité maximale + heap_top()->premier = heap_top_index(); // premier lien, objet-père=objet + heap_top()->precedent = heap_top_index(); // lien précédent // Initialiser cache { opt->state._hts_in_html_parsing = 4; - if (!RUN_CALLBACK7(opt, loop, NULL, 0, 0, 0, lien_tot, 0, NULL)) { + if (!RUN_CALLBACK7(opt, loop, NULL, 0, 0, 0, opt->lien_tot, 0, NULL)) { opt->state.exit_xh = 1; // exit requested } cache_init(&cache, opt); @@ -669,7 +791,7 @@ int httpmirror(char *url1, httrackp * opt) { int i; for(i = 0; i < lien_tot; i++) { - printf("%d>%s%s as %s\n", i, liens[i]->adr, liens[i]->fil, liens[i]->sav); + printf("%d>%s%s as %s\n", i, heap(i)->adr, heap(i)->fil, heap(i)->sav); } for(i = 0; i < filptr; i++) { printf("%d>filters=%s\n", i, filters[i]); @@ -718,7 +840,7 @@ int httpmirror(char *url1, httrackp * opt) { } } // on n'a pas de liens!! (exemple: httrack www.* impossible sans départ..) - if (lien_tot <= 0) { + if (opt->lien_tot <= 0) { hts_log_print(opt, LOG_ERROR, "You MUST specify at least one complete URL, and not only wildcards!"); } @@ -771,11 +893,11 @@ int httpmirror(char *url1, httrackp * opt) { if (rollover) r = - RUN_CALLBACK7(opt, loop, sback->lnk, sback->count, 0, 0, lien_tot, + RUN_CALLBACK7(opt, loop, sback->lnk, sback->count, 0, 0, opt->lien_tot, (int) (opt->waittime - tl + 24 * 3600), NULL); else r = - RUN_CALLBACK7(opt, loop, sback->lnk, sback->count, 0, 0, lien_tot, + RUN_CALLBACK7(opt, loop, sback->lnk, sback->count, 0, 0, opt->lien_tot, (int) (opt->waittime - tl), NULL); if (!r) { opt->state.exit_xh = 1; // exit requested @@ -843,35 +965,35 @@ int httpmirror(char *url1, httrackp * opt) { if (!error) { // Skip empty/invalid/done in background - if (liens[ptr]) { - while((liens[ptr]) - && ((((urladr != NULL) ? (urladr) : (" "))[0] == '!') - || (((urlfil != NULL) ? (urlfil) : (" "))[0] == '\0') - || ((liens[ptr]->pass2 == -1)) + if (heap(ptr)) { + while((heap(ptr)) + && ((((urladr() != NULL) ? (urladr()) : (" "))[0] == '!') + || (((urlfil() != NULL) ? (urlfil()) : (" "))[0] == '\0') + || ((heap(ptr)->pass2 == -1)) ) ) { // sauter si lien annulé (ou fil vide) - if (liens[ptr] != NULL && liens[ptr]->pass2 == -1) { + if (heap(ptr) != NULL && heap(ptr)->pass2 == -1) { hts_log_print(opt, LOG_DEBUG, "link #%d is ready, skipping: %s%s..", - ptr, ((urladr != NULL) ? (urladr) : (" ")), - ((urlfil != NULL) ? (urlfil) : (" "))); + ptr, ((urladr() != NULL) ? (urladr()) : (" ")), + ((urlfil() != NULL) ? (urlfil()) : (" "))); } else { hts_log_print(opt, LOG_DEBUG, "link #%d seems ready, skipping: %s%s..", ptr, - ((urladr != NULL) ? (urladr) : (" ")), - ((urlfil != NULL) ? (urlfil) : (" "))); + ((urladr() != NULL) ? (urladr()) : (" ")), + ((urlfil() != NULL) ? (urlfil()) : (" "))); } // remove from stats - if (liens[ptr]->pass2 == -1) { + if (heap(ptr)->pass2 == -1) { HTS_STAT.stat_background--; } ptr++; } } - if (liens[ptr] != NULL) { // on a qq chose à récupérer? + if (heap(ptr) != NULL) { // on a qq chose à récupérer? - hts_log_print(opt, LOG_DEBUG, "Wait get: %s%s", urladr, urlfil); + hts_log_print(opt, LOG_DEBUG, "Wait get: %s%s", urladr(), urlfil()); #if DEBUG_ROBOTS - if (strcmp(urlfil, "/robots.txt") == 0) { + if (strcmp(urlfil(), "/robots.txt") == 0) { printf("robots.txt detected\n"); } #endif @@ -886,7 +1008,7 @@ int httpmirror(char *url1, httrackp * opt) { strcpybuff(r.contenttype, "text/html"); /*} else if (opt->maxsoc<=0) { // fichiers 1 à 1 en attente (pas de backing) // charger le fichier en mémoire tout bêtement - r=xhttpget(urladr,urlfil); + r=xhttpget(urladr(),urlfil()); // */ } else { // backing, multiples sockets @@ -904,26 +1026,21 @@ int httpmirror(char *url1, httrackp * opt) { memset(&stre, 0, sizeof(stre)); /* */ str.err_msg = buff_err_msg; - str.filename = savename; + str.filename = savename(); str.mime = r.contenttype; - str.url_host = urladr; - str.url_file = urlfil; + str.url_host = urladr(); + str.url_file = urlfil(); str.size = (const int) r.size; /* */ str.addLink = htsAddLink; /* */ - str.liens = liens; str.opt = opt; str.sback = sback; str.cache = &cache; str.hashptr = hashptr; str.numero_passe = numero_passe; - str.add_tab_alloc = add_tab_alloc; /* */ - str.lien_tot_ = &lien_tot; str.ptr_ = &ptr; - str.lien_size_ = &lien_size; - str.lien_buffer_ = &lien_buffer; /* */ str.page_charset_ = NULL; /* */ @@ -941,7 +1058,6 @@ int httpmirror(char *url1, httrackp * opt) { stre.filptr_ = &filptr; stre.robots_ = &robots; stre.hash_ = &hash; - stre.lien_max_ = &lien_max; /* */ stre.makeindex_done_ = &makeindex_done; stre.makeindex_fp_ = &makeindex_fp; @@ -1014,7 +1130,7 @@ int httpmirror(char *url1, httrackp * opt) { error = 0; hts_log_print(opt, LOG_WARNING, "Big file cancelled according to user's preferences: %s%s", - urladr, urlfil); + urladr(), urlfil()); } // // // error=1; // ne pas traiter la suite -- euhh si finalement.. } @@ -1032,15 +1148,15 @@ int httpmirror(char *url1, httrackp * opt) { if (!error) { if (r.statuscode == HTTP_OK) { // OK (ou 304 en backing) if (r.adr) { // Written file - if ((is_hypertext_mime(opt, r.contenttype, urlfil)) + if ((is_hypertext_mime(opt, r.contenttype, urlfil())) /* Is HTML or Js, .. */ /* NO - real media is real media, not HTML */ - /*|| (may_be_hypertext_mime(r.contenttype, urlfil) && (r.adr) ) */ + /*|| (may_be_hypertext_mime(r.contenttype, urlfil()) && (r.adr) ) */ /* Is real media, .. */ ) { if (strnotempty(r.cdispo)) { // Content-disposition set! - if (ishtml(opt, savename) == 0) { // Non HTML!! + if (ishtml(opt, savename()) == 0) { // Non HTML!! // patch it! strcpybuff(r.contenttype, "application/octet-stream"); } @@ -1052,19 +1168,19 @@ int httpmirror(char *url1, httrackp * opt) { /* Load file if necessary and decode. */ #define LOAD_IN_MEMORY_IF_NECESSARY() do { \ if ( \ - may_be_hypertext_mime(opt,r.contenttype, urlfil) /* Is HTML or Js, .. */ \ - && (liens[ptr]->depth>0) /* Depth > 0 (recurse depth) */ \ + may_be_hypertext_mime(opt,r.contenttype, urlfil()) /* Is HTML or Js, .. */ \ + && (heap(ptr)->depth>0) /* Depth > 0 (recurse depth) */ \ && (r.adr==NULL) /* HTML Data exists */ \ && (!store_errpage) /* Not an html error page */ \ - && (savename[0]!='\0') /* Output filename exists */ \ + && (savename()[0]!='\0') /* Output filename exists */ \ ) \ { \ is_loaded_from_file = 1; \ - r.adr = readfile2(savename, &r.size); \ + r.adr = readfile2(savename(), &r.size); \ if (r.adr != NULL) { \ - hts_log_print(opt, LOG_INFO, "File successfully loaded for parsing: %s%s (%d bytes)",urladr,urlfil,(int)r.size); \ + hts_log_print(opt, LOG_INFO, "File successfully loaded for parsing: %s%s (%d bytes)",urladr(),urlfil(),(int)r.size); \ } else { \ - hts_log_print(opt, LOG_ERROR, "File could not be loaded for parsing: %s%s",urladr,urlfil); \ + hts_log_print(opt, LOG_ERROR, "File could not be loaded for parsing: %s%s",urladr(),urlfil()); \ } \ } \ } while(0) @@ -1074,8 +1190,8 @@ int httpmirror(char *url1, httrackp * opt) { // ------------------------------------ // BOGUS MIME TYPE HACK II (the revenge) // Check if we have a bogus MIME type - if (HTTP_IS_OK(r.statuscode) && (is_hypertext_mime(opt, r.contenttype, urlfil) /* Is HTML or Js, .. */ - ||may_be_hypertext_mime(opt, r.contenttype, urlfil)) /* Is real media, .. */ + if (HTTP_IS_OK(r.statuscode) && (is_hypertext_mime(opt, r.contenttype, urlfil()) /* Is HTML or Js, .. */ + ||may_be_hypertext_mime(opt, r.contenttype, urlfil())) /* Is real media, .. */ ) { /* Convert charset to UTF-8 - NOT! (what about links ? remote server side will have troubles with converted names) */ @@ -1212,7 +1328,7 @@ int httpmirror(char *url1, httrackp * opt) { } hts_log_print(opt, LOG_WARNING, "File %s%s converted from UCS2 to UTF-8 (old size: %d bytes, new size: %d bytes)", - urladr, urlfil, (int) r.size, new_offs); + urladr(), urlfil(), (int) r.size, new_offs); freet(r.adr); r.adr = NULL; r.size = new_offs; @@ -1226,8 +1342,8 @@ int httpmirror(char *url1, httrackp * opt) { is_binary = 1; strcpybuff(r.contenttype, "application/octet-stream"); hts_log_print(opt, LOG_WARNING, - "File not parsed, looks like binary: %s%s", urladr, - urlfil); + "File not parsed, looks like binary: %s%s", urladr(), + urlfil()); } /* This hack allows you to avoid problems with parsing '\0' characters */ @@ -1251,12 +1367,12 @@ int httpmirror(char *url1, httrackp * opt) { //if (!error) { // if (r.statuscode == HTTP_OK) { // OK (ou 304 en backing) // if (r.adr==NULL) { // Written file - // if (may_be_hypertext_mime(r.contenttype, urlfil)) { // to parse! + // if (may_be_hypertext_mime(r.contenttype, urlfil())) { // to parse! // LLint sz; - // sz=fsize_utf8(savename); + // sz=fsize_utf8(savename()); // if (sz>0) { // ok, exists! // if (sz < 8192) { // ok, small file --> to parse! - // FILE* fp=FOPEN(savename,"rb"); + // FILE* fp=FOPEN(savename(),"rb"); // if (fp) { // r.adr=malloct((int)sz + 2); // if (r.adr) { @@ -1274,7 +1390,7 @@ int httpmirror(char *url1, httrackp * opt) { // fclose(fp); // fp=NULL; // // remove (temporary) file! - // remove(savename); + // remove(savename()); // } // if (fp) // fclose(fp); @@ -1292,8 +1408,8 @@ int httpmirror(char *url1, httrackp * opt) { /* if (!error) { if (ptr>0) { - if (liens[ptr]) { - xxcache_mayadd(opt,&cache,&r,urladr,urlfil,savename); + if (heap(ptr)) { + xxcache_mayadd(opt,&cache,&r,urladr(),urlfil(),savename()); } else error=1; } @@ -1316,26 +1432,21 @@ int httpmirror(char *url1, httrackp * opt) { memset(&stre, 0, sizeof(stre)); /* */ str.err_msg = buff_err_msg; - str.filename = savename; + str.filename = savename(); str.mime = r.contenttype; - str.url_host = urladr; - str.url_file = urlfil; + str.url_host = urladr(); + str.url_file = urlfil(); str.size = (int) r.size; /* */ str.addLink = htsAddLink; /* */ - str.liens = liens; str.opt = opt; str.sback = sback; str.cache = &cache; str.hashptr = hashptr; str.numero_passe = numero_passe; - str.add_tab_alloc = add_tab_alloc; /* */ - str.lien_tot_ = &lien_tot; str.ptr_ = &ptr; - str.lien_size_ = &lien_size; - str.lien_buffer_ = &lien_buffer; /* */ str.page_charset_ = NULL; /* */ @@ -1353,7 +1464,6 @@ int httpmirror(char *url1, httrackp * opt) { stre.filptr_ = &filptr; stre.robots_ = &robots; stre.hash_ = &hash; - stre.lien_max_ = &lien_max; /* */ stre.makeindex_done_ = &makeindex_done; stre.makeindex_fp_ = &makeindex_fp; @@ -1417,14 +1527,14 @@ int httpmirror(char *url1, httrackp * opt) { if (ptr>0) { // "mis à jour" if ((!r.notmodified) && (opt->is_update) && (!store_errpage)) { // page modifiée - if (strnotempty(savename)) { + if (strnotempty(savename())) { HTS_STAT.stat_updated_files++; //if ((opt->debug>0) && (opt->log!=NULL)) { - hts_log_print(opt, LOG_INFO, "File updated: %s%s",urladr,urlfil); + hts_log_print(opt, LOG_INFO, "File updated: %s%s",urladr(),urlfil()); } } else { if (!store_errpage) { - hts_log_print(opt, LOG_INFO, "File recorded: %s%s",urladr,urlfil); + hts_log_print(opt, LOG_INFO, "File recorded: %s%s",urladr(),urlfil()); } } } @@ -1435,14 +1545,14 @@ int httpmirror(char *url1, httrackp * opt) { // ------------------------------------------------------ // traiter - if (!is_binary && ((is_hypertext_mime(opt, r.contenttype, urlfil)) /* Is HTML or Js, .. */ - ||(may_be_hypertext_mime(opt, r.contenttype, urlfil) && r.adr != NULL) /* Is real media, .. */ + if (!is_binary && ((is_hypertext_mime(opt, r.contenttype, urlfil())) /* Is HTML or Js, .. */ + ||(may_be_hypertext_mime(opt, r.contenttype, urlfil()) && r.adr != NULL) /* Is real media, .. */ ) - && (liens[ptr]->depth > 0) /* Depth > 0 (recurse depth) */ + && (heap(ptr)->depth > 0) /* Depth > 0 (recurse depth) */ &&(r.adr != NULL) /* HTML Data exists */ &&(r.size > 0) /* And not empty */ &&(!store_errpage) /* Not an html error page */ - &&(savename[0] != '\0') /* Output filename exists */ + &&(savename()[0] != '\0') /* Output filename exists */ ) { // ne traiter que le html si autorisé // -- -- -- -- // Parsing HTML @@ -1451,7 +1561,7 @@ int httpmirror(char *url1, httrackp * opt) { /* Remove file if being processed */ if (is_loaded_from_file) { - (void) unlink(fconv(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), savename)); + (void) unlink(fconv(OPT_GET_BUFF(opt), OPT_GET_BUFF_SIZE(opt), savename())); is_loaded_from_file = 0; } @@ -1486,15 +1596,15 @@ int httpmirror(char *url1, httrackp * opt) { if (page_charset[0] == '\0') { hts_log_print(opt, LOG_INFO, "Warning: could not detect encoding for: %s%s", - urladr, urlfil); + urladr(), urlfil()); /* Fallback to ISO-8859-1 (~== identity) ; accents will look weird */ strcpy(page_charset, "iso-8859-1"); } } /* Info for wrappers */ - hts_log_print(opt, LOG_INFO, "engine: check-html: %s%s", urladr, - urlfil); + hts_log_print(opt, LOG_INFO, "engine: check-html: %s%s", urladr(), + urlfil()); { char BIGSTK buff_err_msg[1024]; htsmoduleStruct BIGSTK str; @@ -1505,26 +1615,21 @@ int httpmirror(char *url1, httrackp * opt) { memset(&stre, 0, sizeof(stre)); /* */ str.err_msg = buff_err_msg; - str.filename = savename; + str.filename = savename(); str.mime = r.contenttype; - str.url_host = urladr; - str.url_file = urlfil; + str.url_host = urladr(); + str.url_file = urlfil(); str.size = (int) r.size; /* */ str.addLink = htsAddLink; /* */ - str.liens = liens; str.opt = opt; str.sback = sback; str.cache = &cache; str.hashptr = hashptr; str.numero_passe = numero_passe; - str.add_tab_alloc = add_tab_alloc; /* */ - str.lien_tot_ = &lien_tot; str.ptr_ = &ptr; - str.lien_size_ = &lien_size; - str.lien_buffer_ = &lien_buffer; /* */ str.page_charset_ = page_charset[0] != '\0' ? page_charset : NULL; /* */ @@ -1542,7 +1647,6 @@ int httpmirror(char *url1, httrackp * opt) { stre.filptr_ = &filptr; stre.robots_ = &robots; stre.hash_ = &hash; - stre.lien_max_ = &lien_max; /* */ stre.makeindex_done_ = &makeindex_done; stre.makeindex_fp_ = &makeindex_fp; @@ -1581,18 +1685,18 @@ int httpmirror(char *url1, httrackp * opt) { // sauver fichier /* En cas d'erreur, vérifier que fichier d'erreur existe */ - if (strnotempty(savename) == 0) { // chemin de sauvegarde existant - if (strcmp(urlfil, "/robots.txt") == 0) { // pas robots.txt + if (strnotempty(savename()) == 0) { // chemin de sauvegarde existant + if (strcmp(urlfil(), "/robots.txt") == 0) { // pas robots.txt if (store_errpage) { // c'est une page d'erreur int create_html_warning = 0; int create_gif_warning = 0; - switch (ishtml(opt, urlfil)) { /* pas fichier html */ + switch (ishtml(opt, urlfil())) { /* pas fichier html */ case 0: /* non html */ { char buff[256]; - guess_httptype(opt, buff, urlfil); + guess_httptype(opt, buff, urlfil()); if (strcmp(buff, "image/gif") == 0) create_gif_warning = 1; } @@ -1634,8 +1738,8 @@ int httpmirror(char *url1, httrackp * opt) { } } - if (strnotempty(savename) == 0) { // pas de chemin de sauvegarde - if (strcmp(urlfil, "/robots.txt") == 0) { // robots.txt + if (strnotempty(savename()) == 0) { // pas de chemin de sauvegarde + if (strcmp(urlfil(), "/robots.txt") == 0) { // robots.txt if (r.adr) { int bptr = 0; char BIGSTK line[1024]; @@ -1711,7 +1815,7 @@ int httpmirror(char *url1, httrackp * opt) { else { hts_log_print(opt, LOG_NOTICE, "Note: %s robots.txt rules are too restrictive, ignoring /", - urladr); + urladr()); } #endif } @@ -1719,13 +1823,13 @@ int httpmirror(char *url1, httrackp * opt) { } } while((bptr < r.size) && (strlen(buff) < (sizeof(buff) - 32))); if (strnotempty(buff)) { - checkrobots_set(&robots, urladr, buff); + checkrobots_set(&robots, urladr(), buff); hts_log_print(opt, LOG_INFO, "Note: robots.txt forbidden links for %s are: %s", - urladr, infobuff); + urladr(), infobuff); hts_log_print(opt, LOG_NOTICE, "Note: due to %s remote robots.txt rules, links beginning with these path will be forbidden: %s (see in the options to disable this)", - urladr, infobuff); + urladr(), infobuff); } } } @@ -1743,12 +1847,12 @@ int httpmirror(char *url1, httrackp * opt) { // Si par la suite on doit retraiter ce fichier avec un niveau de récursion plus // fort, on supprimera le readme, et on scannera le fichier html! // note: sauté si store_errpage (càd si page d'erreur, non à scanner!) - if ((is_hypertext_mime(opt, r.contenttype, urlfil)) && (!store_errpage) && (r.size > 0)) { // c'est du html!! + if ((is_hypertext_mime(opt, r.contenttype, urlfil())) && (!store_errpage) && (r.size > 0)) { // c'est du html!! char BIGSTK tempo[HTS_URLMAXSIZE * 2]; FILE *fp; tempo[0] = '\0'; - strcpybuff(tempo, savename); + strcpybuff(tempo, savename()); strcatbuff(tempo, ".readme"); #if HTS_DOSNAME @@ -1771,7 +1875,7 @@ int httpmirror(char *url1, httrackp * opt) { HTTRACK_VERSION "%s" CRLF "" CRLF, hts_get_version_info(opt)); fprintf(fp, "The file %s has not been scanned by HTS" CRLF, - savename); + savename()); fprintf(fp, "Some links contained in it may be unreachable locally." CRLF); @@ -1788,15 +1892,15 @@ int httpmirror(char *url1, httrackp * opt) { hts_log_print(opt, LOG_WARNING, "Warning: store %s without scan: %s", r.contenttype, - savename); + savename()); } else { if ((opt->getmode & 2) != 0) { // ok autorisé hts_log_print(opt, LOG_DEBUG, "Store %s: %s", r.contenttype, - savename); + savename()); } else { // lien non autorisé! (ex: cgi-bin en html) hts_log_print(opt, LOG_DEBUG, "non-html file ignored after upload at %s : %s", - urladr, urlfil); + urladr(), urlfil()); if (r.adr) { freet(r.adr); r.adr = NULL; @@ -1808,8 +1912,8 @@ int httpmirror(char *url1, httrackp * opt) { // ATTENTION C'EST ICI QU'ON SAUVE LE FICHIER!! if (r.adr != NULL || r.size == 0) { - file_notify(opt, urladr, urlfil, savename, 1, 1, r.notmodified); - if (filesave(opt, r.adr, (int) r.size, savename, urladr, urlfil) != + file_notify(opt, urladr(), urlfil(), savename(), 1, 1, r.notmodified); + if (filesave(opt, r.adr, (int) r.size, savename(), urladr(), urlfil()) != 0) { int fcheck; @@ -1819,7 +1923,7 @@ int httpmirror(char *url1, httrackp * opt) { opt->state.exit_xh = -1; /* fatal error */ } hts_log_print(opt, LOG_ERROR | LOG_ERRNO, - "Unable to save file %s", savename); + "Unable to save file %s", savename()); } else { /* if (!ishttperror(r.statuscode)) @@ -1834,9 +1938,9 @@ int httpmirror(char *url1, httrackp * opt) { /* Parsing of other media types (java, ram..) */ /* if (strfield2(r.contenttype,"audio/x-pn-realaudio")) { - hts_log_print(opt, LOG_DEBUG, "(Real Media): parsing %s",savename); - if (fexist(savename)) { // ok, existe bien! - FILE* fp=FOPEN(savename,"r+b"); + hts_log_print(opt, LOG_DEBUG, "(Real Media): parsing %s",savename()); + if (fexist(savename())) { // ok, existe bien! + FILE* fp=FOPEN(savename(),"r+b"); if (fp) { if (!fseek(fp,0,SEEK_SET)) { char BIGSTK line[HTS_URLMAXSIZE*2]; @@ -1852,7 +1956,7 @@ int httpmirror(char *url1, httrackp * opt) { /* External modules */ if (opt->parsejava && (opt->parsejava & HTSPARSE_NO_CLASS) == 0 - && fexist(savename)) { + && fexist(savename())) { char BIGSTK buff_err_msg[1024]; htsmoduleStruct BIGSTK str; @@ -1860,37 +1964,32 @@ int httpmirror(char *url1, httrackp * opt) { memset(&str, 0, sizeof(str)); /* */ str.err_msg = buff_err_msg; - str.filename = savename; + str.filename = savename(); str.mime = r.contenttype; - str.url_host = urladr; - str.url_file = urlfil; + str.url_host = urladr(); + str.url_file = urlfil(); str.size = (int) r.size; /* */ str.addLink = htsAddLink; /* */ - str.liens = liens; str.opt = opt; str.sback = sback; str.cache = &cache; str.hashptr = hashptr; str.numero_passe = numero_passe; - str.add_tab_alloc = add_tab_alloc; - /* */ - str.lien_tot_ = &lien_tot; str.ptr_ = &ptr; - str.lien_size_ = &lien_size; - str.lien_buffer_ = &lien_buffer; + /* Parse if recognized */ switch (hts_parse_externals(&str)) { case 1: hts_log_print(opt, LOG_DEBUG, "(External module): parsed successfully %s", - savename); + savename()); break; case 0: hts_log_print(opt, LOG_DEBUG, "(External module): couldn't parse successfully %s : %s", - savename, str.err_msg); + savename(), str.err_msg); break; } } @@ -1898,8 +1997,8 @@ int httpmirror(char *url1, httrackp * opt) { } // text/html ou autre /* Post-processing */ - if (fexist(savename)) { - usercommand(opt, 0, NULL, savename, urladr, urlfil); + if (fexist(savename())) { + usercommand(opt, 0, NULL, savename(), urladr(), urlfil()); } } // if !error @@ -1918,19 +2017,19 @@ int httpmirror(char *url1, httrackp * opt) { if (opt->getmode & 4) { // sauver les non html après // sauter les fichiers selon la passe if (!numero_passe) { - while((ptr < lien_tot) ? (liens[ptr]->pass2) : 0) + while((ptr < opt->lien_tot) ? (heap(ptr)->pass2) : 0) ptr++; } else { - while((ptr < lien_tot) ? (!liens[ptr]->pass2) : 0) + while((ptr < opt->lien_tot) ? (!heap(ptr)->pass2) : 0) ptr++; } - if (ptr >= lien_tot) { // fin de boucle + if (ptr >= opt->lien_tot) { // fin de boucle if (!numero_passe) { // première boucle hts_log_print(opt, LOG_DEBUG, "Now getting non-html files..."); numero_passe = 1; // seconde boucle ptr = 0; // prochain pass2 - while((ptr < lien_tot) ? (!liens[ptr]->pass2) : 0) + while((ptr < opt->lien_tot) ? (!heap(ptr)->pass2) : 0) ptr++; //printf("first link==%d\n"); @@ -1944,16 +2043,16 @@ int httpmirror(char *url1, httrackp * opt) { //} // a-t-on dépassé le quota? if (!back_checkmirror(opt)) { - ptr = lien_tot; + ptr = opt->lien_tot; } else if (opt->state.exit_xh) { // sortir if (opt->state.exit_xh == 1) { hts_log_print(opt, LOG_ERROR, "Exit requested by shell or user"); } else { hts_log_print(opt, LOG_ERROR, "Exit requested by engine"); } - ptr = lien_tot; + ptr = opt->lien_tot; } - } while(ptr < lien_tot); + } while(ptr < opt->lien_tot); // // // @@ -2155,7 +2254,7 @@ int httpmirror(char *url1, httrackp * opt) { "HTTrack Website Copier/" HTTRACK_VERSION " mirror complete in %s : " "%d links scanned, %d files written (" LLintP " bytes overall)%s " "[" LLintP " bytes received at " LLintP - " bytes/sec]", htstime, (int) lien_tot - 1, + " bytes/sec]", htstime, (int) opt->lien_tot - 1, (int) HTS_STAT.stat_files, (LLint) HTS_STAT.stat_bytes, infoupdated, (LLint) HTS_STAT.HTS_TOTAL_RECV, (LLint) n); @@ -2343,18 +2442,18 @@ void host_ban(httrackp * opt, lien_url ** liens, int ptr, int lien_tot, // effacer liens //l=strlen(host); for(i = 0; i < lien_tot; i++) { - //if (liens[i]->adr_len==l) { // même taille de chaîne + //if (heap(i)->adr_len==l) { // même taille de chaîne // Calcul de taille sécurisée - if (liens[i]) { - if (liens[i]->adr) { + if (heap(i)) { + if (heap(i)->adr) { int l = 0; - while((liens[i]->adr[l]) && (l < 1020)) + while((heap(i)->adr[l]) && (l < 1020)) l++; if ((l > 0) && (l < 1020)) { // sécurité - if (strfield2(jump_identification(liens[i]->adr), host)) { // host - hts_log_print(opt, LOG_DEBUG, "Cancel: %s%s", liens[i]->adr, - liens[i]->fil); + if (strfield2(jump_identification(heap(i)->adr), host)) { // host + hts_log_print(opt, LOG_DEBUG, "Cancel: %s%s", heap(i)->adr, + heap(i)->fil); hash_invalidate_entry(opt->hash, i); // invalidate hashtable entry // on efface pas le hash, because si on rencontre le lien, reverif sav.. } @@ -2363,13 +2462,13 @@ void host_ban(httrackp * opt, lien_url ** liens, int ptr, int lien_tot, char dmp[1040]; dmp[0] = '\0'; - strncatbuff(dmp, liens[i]->adr, 1024); + strncatbuff(dmp, heap(i)->adr, 1024); hts_log_print(opt, LOG_WARNING, "WARNING! HostCancel detected memory leaks [len %d at %d]", l, i); hts_log_print(opt, LOG_WARNING, "dump 1024 bytes (address %p): " LF "%s", - liens[i]->adr, dmp); + heap(i)->adr, dmp); } } } else { @@ -3129,8 +3228,8 @@ int backlinks_done(struct_back * sback, lien_url ** liens, int lien_tot, //Links done and stored in cache for(i = ptr + 1; i < lien_tot; i++) { - if (liens[i]) { - if (liens[i]->pass2 == -1) { + if (heap(i)) { + if (heap(i)->pass2 == -1) { n++; } } @@ -3217,7 +3316,7 @@ int back_fill(struct_back * sback, httrackp * opt, cache_back * cache, int ok = 1; // on ne met pas le fichier en backing si il doit être traité après ou s'il a déja été traité - if (liens[p]->pass2) { // 2è passe + if (heap(p)->pass2) { // 2è passe if (numero_passe != 1) ok = 0; } else { @@ -3226,24 +3325,24 @@ int back_fill(struct_back * sback, httrackp * opt, cache_back * cache, } // Why in hell did I do that ? - //if (ok && liens[p]->sav != NULL && liens[p]->sav[0] != '\0' - // && hash_read(opt->hash,liens[p]->sav,NULL,HASH_STRUCT_FILENAME ) >= 0) // lookup in liens_record + //if (ok && heap(p)->sav != NULL && heap(p)->sav[0] != '\0' + // && hash_read(opt->hash,heap(p)->sav,NULL,HASH_STRUCT_FILENAME ) >= 0) // lookup in liens_record //{ // ok = 0; //} - if (liens[p]->sav == NULL || liens[p]->sav[0] == '\0' - || hash_read(opt->hash, liens[p]->sav, NULL, HASH_STRUCT_FILENAME ) < 0) { + if (heap(p)->sav == NULL || heap(p)->sav[0] == '\0' + || hash_read(opt->hash, heap(p)->sav, NULL, HASH_STRUCT_FILENAME ) < 0) { ok = 0; } // note: si un backing est fini, il reste en mémoire jusqu'à ce que // le ptr l'atteigne if (ok) { if (!back_exist - (sback, opt, liens[p]->adr, liens[p]->fil, liens[p]->sav)) { + (sback, opt, heap(p)->adr, heap(p)->fil, heap(p)->sav)) { if (back_add - (sback, opt, cache, liens[p]->adr, liens[p]->fil, liens[p]->sav, - liens[liens[p]->precedent]->adr, liens[liens[p]->precedent]->fil, - liens[p]->testmode) == -1) { + (sback, opt, cache, heap(p)->adr, heap(p)->fil, heap(p)->sav, + heap(heap(p)->precedent)->adr, heap(heap(p)->precedent)->fil, + heap(p)->testmode) == -1) { hts_log_print(opt, LOG_DEBUG, "error: unable to add more links through back_add for back_fill"); #if BDEBUG==1 @@ -3253,7 +3352,7 @@ int back_fill(struct_back * sback, httrackp * opt, cache_back * cache, } else { n--; #if BDEBUG==1 - printf("backing: %s%s\n", liens[p]->adr, liens[p]->fil); + printf("backing: %s%s\n", heap(p)->adr, heap(p)->fil); #endif } } @@ -3634,17 +3733,17 @@ int htsAddLink(htsmoduleStruct * str, char *link) { } // adr = c'est la même // fil et save: save2 et fil2 - prio_fix = maximum(liens[ptr]->depth - 1, 0); - pass_fix = max(liens[ptr]->pass2, numero_passe); - if (liens[ptr]->cod) - strcpybuff(codebase, liens[ptr]->cod); // codebase valable pour tt les classes descendantes + prio_fix = maximum(heap(ptr)->depth - 1, 0); + pass_fix = max(heap(ptr)->pass2, numero_passe); + if (heap(ptr)->cod) + strcpybuff(codebase, heap(ptr)->cod); // codebase valable pour tt les classes descendantes if (strnotempty(codebase) == 0) { // pas de codebase, construire char *a; if (str->relativeToHtmlLink == 0) - strcpybuff(codebase, liens[ptr]->fil); + strcpybuff(codebase, heap(ptr)->fil); else - strcpybuff(codebase, liens[liens[ptr]->precedent]->fil); + strcpybuff(codebase, heap(heap(ptr)->precedent)->fil); a = codebase + strlen(codebase) - 1; while((*a) && (*a != '/') && (a > codebase)) a--; @@ -3678,13 +3777,13 @@ int htsAddLink(htsmoduleStruct * str, char *link) { if (strnotempty(lien) && strlen(lien) < HTS_URLMAXSIZE) { // calculer les chemins et noms de sauvegarde - if (ident_url_relatif(lien, urladr, codebase, adr, fil) >= 0) { // reformage selon chemin + if (ident_url_relatif(lien, urladr(), codebase, adr, fil) >= 0) { // reformage selon chemin int r; int set_prio_to = 0; int just_test_it = 0; forbidden_url = - hts_acceptlink(opt, ptr, lien_tot, liens, adr, fil, NULL, NULL, + hts_acceptlink(opt, ptr, opt->lien_tot, opt->liens, adr, fil, NULL, NULL, &set_prio_to, &just_test_it); hts_log_print(opt, LOG_DEBUG, "result for wizard external module link: %d", @@ -3702,8 +3801,8 @@ int htsAddLink(htsmoduleStruct * str, char *link) { opt->savename_83 = 0; // note: adr,fil peuvent être patchés r = - url_savename(adr, fil, save, NULL, NULL, NULL, NULL, opt, liens, - lien_tot, sback, cache, hashptr, ptr, numero_passe, + url_savename(adr, fil, save, NULL, NULL, NULL, NULL, opt, opt->liens, + opt->lien_tot, sback, cache, hashptr, ptr, numero_passe, NULL); // resolve unresolved type if (r != -1 && forbidden_url == 0 && IS_DELAYED_EXT(save) @@ -3720,11 +3819,11 @@ int htsAddLink(htsmoduleStruct * str, char *link) { opt->savename_type = a; opt->savename_83 = b; if (r != -1 && !forbidden_url) { - if (savename) { - if (lienrelatif(tempo, save, savename) == 0) { + if (savename()) { + if (lienrelatif(tempo, save, savename()) == 0) { hts_log_print(opt, LOG_DEBUG, "(module): relative link at %s build with %s and %s: %s", - adr, save, savename, tempo); + adr, save, savename(), tempo); if (str->localLink && str->localLinkSize > (int) strlen(tempo) + 1) { strcpybuff(str->localLink, tempo); @@ -3763,7 +3862,7 @@ int htsAddLink(htsmoduleStruct * str, char *link) { int i = hash_read(hashptr, save, NULL, HASH_STRUCT_FILENAME ); // lecture type 0 (sav) if (i >= 0) { - liens[i]->depth = maximum(liens[i]->depth, prio_fix); + heap(i)->depth = maximum(heap(i)->depth, prio_fix); dejafait = 1; } } @@ -3773,43 +3872,38 @@ int htsAddLink(htsmoduleStruct * str, char *link) { // >>>> CREER LE LIEN JAVA <<<< // enregistrer fichier (MACRO) - liens_record(adr, fil, save, "", "", opt->urlhack); - if (liens[lien_tot] == NULL) { // erreur, pas de place réservée + if (!hts_record_link(opt, adr, fil, save, "", "", "")) { // erreur, pas de place réservée printf("PANIC! : Not enough memory [%d]\n", __LINE__); - hts_log_print(opt, LOG_PANIC, - "Not enough memory, can not re-allocate %d bytes", - (int) ((add_tab_alloc + 1) * sizeof(lien_url))); + hts_log_print(opt, LOG_PANIC, "Not enough memory"); opt->state.exit_xh = -1; /* fatal error -> exit */ return 0; } // mode test? - liens[lien_tot]->testmode = 0; // pas mode test - - liens[lien_tot]->link_import = 0; // pas mode import + heap_top()->testmode = 0; // pas mode test + heap_top()->link_import = 0; // pas mode import // écrire autres paramètres de la structure-lien //if (meme_adresse) - liens[lien_tot]->premier = liens[ptr]->premier; + heap_top()->premier = heap(ptr)->premier; //else // sinon l'objet père est le précédent lui même - // liens[lien_tot]->premier=ptr; + // heap_top()->premier=ptr; - liens[lien_tot]->precedent = ptr; + heap_top()->precedent = ptr; // noter la priorité if (!set_prio_to) - liens[lien_tot]->depth = prio_fix; + heap_top()->depth = prio_fix; else - liens[lien_tot]->depth = max(0, min(liens[ptr]->depth - 1, set_prio_to - 1)); // PRIORITE NULLE (catch page) - liens[lien_tot]->pass2 = max(pass_fix, numero_passe); - liens[lien_tot]->retry = opt->retry; + heap_top()->depth = max(0, min(heap(ptr)->depth - 1, set_prio_to - 1)); // PRIORITE NULLE (catch page) + heap_top()->pass2 = max(pass_fix, numero_passe); + heap_top()->retry = opt->retry; - //strcpybuff(liens[lien_tot]->adr,adr); - //strcpybuff(liens[lien_tot]->fil,fil); - //strcpybuff(liens[lien_tot]->sav,save); + //strcpybuff(heap_top()->adr,adr); + //strcpybuff(heap_top()->fil,fil); + //strcpybuff(heap_top()->sav,save); hts_log_print(opt, LOG_DEBUG, "(module): OK, NOTE: %s%s -> %s", - liens[lien_tot]->adr, liens[lien_tot]->fil, - liens[lien_tot]->sav); + heap_top()->adr, heap_top()->fil, + heap_top()->sav); - lien_tot++; // UN LIEN DE PLUS } } } |