Newsgroup: it.comp.os.linux.development
Titolo: ridurre un buffer dalla testa

salve a tutti quanti.
Mi ritrovo un buffer, dal quale devo "segare" N byte dalla *testa* e mi 
sto scervellando come un matto per trovare un modo "elegante" per farlo.
(realloc lavora solo dalla cosa, mannaggia).
Attualmente faccio un accroccio simile al seguente codice (riadattato 
per l'occasione):
char* new;
char* buf=(char*)malloc(sizeof(char) * N);
int sizeBuf = N;
sizeBuf = sizeBuf - daTogliere;
new = (char*)malloc(sizeof(char)*(*sizeBuf));
memcpy(new, buf+daTogliere, sizeBuf);
free(buf);
buf=new;
Spero che non sia l'unico metodo, perche' fare tutte le volte memcpy e' 
alquanto bruttino; puo' andar bene se si devono spostare pochi byte e 
poche volte, altrimenti e' un po' troppo onerosa.
Qualche suggerimento ?
(escludendo tutte le possibilita' che prendino in "ballo" una lista)
Grazie infinite
Ciao
	MaX

 (realloc lavora solo dalla cosa, mannaggia).
Scusa ma non saprei aiutarti, anche se penso che non sia possibile fare
quello che vuoi.
Pero` volevo chiederti come mai non usi un buffer circolare con due
puntatori, invece di togliere dall'inizio del buffer, o perche` non usi
una coda FIFO.
Bye.
-- 
Alessandro Pellizzari

 o perche` non usi una coda FIFO.
come dicevo prima, le soluzioni con le liste le vorrei escludere dal 
discorso perche' son soluzioni a cui ho gia' pensato e le quali ho gia' 
implementato; mi interessava sapere specificatamente un soluzione 
diversa cosi' da poter accedere direttamente al buffer di memoria, per 
quello che devo fare io sarebbe il top, se poi non ci sara' modo 
adottero' le liste (FIFO).
grazie
Ciao
	MaX


N = bytes_da_togliere;
buf += N;
???
-- 
Roberto -MadBob- Guido
mail bob4mail***@***
gmail.com
web 
http://madbob.homelinux.com
BrainTop Project maintainer - 
http://braintop.sf.net

 poche volte, altrimenti e' un po' troppo onerosa.
Peccato che memcpy sia sbagliato, perché (dalla manpage) "The memory areas
may not overlap" :)
Usa memmove(3) che è fatto apposta.
Sull'efficienza, invece, dipende... se lo spazio non è un problema, tieni un
puntatore alla testa e sposta quello, senza riallocare.
Ciao,
-- 
Daniele Orlandi

 sizeBuf = sizeBuf - daTogliere;
Se buf contiene una stringa, allora new=strdup(buf+daTogliere) dovrebbe
fare al caso tuo (piu` free(buf)). Occhio che questo implica un memcpy
da qualche parte...
Altrimenti malloc/memcpy se N e` molto grande e si giustifica la copia.
P.S. Puoi tranquillamente usare memcpy visto che i due buffer non possono
essere sovraimposti.
Altrimenti due puntatori: bufPerFree=buf=malloc() seguito da 
buf=bufPerFree+daTogliere. Usi buf e fai il free con bufPerFree. Avrai dello
spazio allocato per niente, ma - di solito - questo non e` un problema.
Ciao,
-- 
       Roberto Divia`              Love at first sight is one of the greatest
Dep:PH Bat:53 Mailbox:C02110      labour-saving devices the world has ever seen
Route de Meyrin 385               ---------------------------------------------
Case Postale                                Phone:  
+41-22-767-4994
CH-1211 Geneve 23 CERN                      Fax:    
+41-22-767-9585
Switzerland                                 E-Mail: 
Robert...@cern.ch

 sapere a priori quando verranno tolti), li devo prendere dall'inizio.
Ma allora se capisco bene, potresti davvero usare un buffer circolare. Lo
allochi all'inizio e tieni due puntatori alla testa e alla coda. Lo
deallochi quando non ti serve più.
-- 
  Giuseppe "Cowo" Corbelli \/\ My software: 
http://cowo.yoda2000.net
    **ANTI-SPAM** -- **Substitute IHATESPAM with cowo to reply by mail**
    -<! And the will shall return And again hearts shall burn
         All the horns now will sing Leading you back to the metal winds !>-
                  Lost Horizon - Sworn In The Metal Wind