#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFFER 65
#define PROC_STR(pstr) if((pstr[strlen((pstr)) - 1]) == '\n') (pstr[strlen((pstr)) - 1]) = '\0'
#define PROC_STR1(pstr) strcspn(pstr, "\n") = 0
typedef struct blck{
char string[ BUFFER] ;
struct blck * prev;
struct blck * next;
} Block;
typedef struct blkch{
long unsigned int len;
Block * gen;
Block * tail;
} BlockChain;
/* Create the list */
BlockChain * createBlockChain( ) {
BlockChain
* newChain
= calloc ( 1 , sizeof ( BlockChain
) ) ;
newChain-> gen = NULL;
newChain-> tail = NULL;
newChain-> len = 0 ;
return newChain;
}
/* Create a node */
Block * createBlock( char * pstring) {
Block
* newBlock
= calloc ( 1 , sizeof ( Block
) ) ;
strcpy ( newBlock
-> string
, pstring
) ;
return newBlock;
}
/* Append Block to the list*/
BlockChain * appendToChain( BlockChain * pChain, char * pstring) {
Block * newBlock = createBlock( pstring) ;
newBlock-> prev = pChain-> tail;
newBlock-> next = NULL;
if ( pChain-> tail != NULL)
pChain-> tail-> next = newBlock;
pChain-> tail = newBlock;
if ( pChain-> gen == NULL)
pChain-> gen = newBlock;
pChain-> len++;
return pChain;
}
void printBlock( Block * pblock) {
printf ( "String: %s\n " , pblock
-> string
) ; printf ( "Prev: %p\n " , ( void * ) pblock
-> prev
) ; printf ( "Cur: %p\n " , ( void * ) pblock
) ; printf ( "Next: %p\n " , ( void * ) pblock
-> next
) ; }
void printChain( Block * pgen) {
Block * tmp = pgen;
while ( tmp != NULL) {
printBlock( tmp) ;
tmp = tmp-> next;
}
}
int main( void ) {
BlockChain * myChain = createBlockChain( ) ;
appendToChain( myChain, "Hello1" ) ;
appendToChain( myChain, "Hello2" ) ;
printChain( myChain-> gen) ;
return 0 ;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKI2RlZmluZSBCVUZGRVIgNjUKI2RlZmluZSBQUk9DX1NUUihwc3RyKSBpZigocHN0cltzdHJsZW4oKHBzdHIpKSAtIDFdKSA9PSAnXG4nKSAocHN0cltzdHJsZW4oKHBzdHIpKSAtIDFdKSA9ICdcMCcKI2RlZmluZSBQUk9DX1NUUjEocHN0cikgc3RyY3Nwbihwc3RyLCAiXG4iKSA9IDAKCnR5cGVkZWYgc3RydWN0IGJsY2t7CiAgICBjaGFyIHN0cmluZ1tCVUZGRVJdOwoKICAgIHN0cnVjdCBibGNrICpwcmV2OwogICAgc3RydWN0IGJsY2sgKm5leHQ7Cn1CbG9jazsKCnR5cGVkZWYgc3RydWN0IGJsa2NoewogICAgbG9uZyB1bnNpZ25lZCBpbnQgbGVuOwoKICAgIEJsb2NrICpnZW47CiAgICBCbG9jayAqdGFpbDsKfUJsb2NrQ2hhaW47CgovKiBDcmVhdGUgdGhlIGxpc3QgKi8KQmxvY2tDaGFpbiAqY3JlYXRlQmxvY2tDaGFpbigpewogICAgQmxvY2tDaGFpbiAqbmV3Q2hhaW4gPSBjYWxsb2MoMSwgc2l6ZW9mKEJsb2NrQ2hhaW4pKTsKCiAgICBuZXdDaGFpbi0+Z2VuID0gTlVMTDsKICAgIG5ld0NoYWluLT50YWlsID0gTlVMTDsKICAgIG5ld0NoYWluLT5sZW4gPSAwOwoKICAgIHJldHVybiBuZXdDaGFpbjsKfQoKLyogQ3JlYXRlIGEgbm9kZSAqLwpCbG9jayAqY3JlYXRlQmxvY2soY2hhciAqcHN0cmluZyl7CiAgICBCbG9jayAqbmV3QmxvY2sgPSBjYWxsb2MoMSwgc2l6ZW9mKEJsb2NrKSk7CgogICAgc3RyY3B5KG5ld0Jsb2NrLT5zdHJpbmcsIHBzdHJpbmcpOwogICAgCiAgICByZXR1cm4gbmV3QmxvY2s7Cn0KCi8qIEFwcGVuZCBCbG9jayB0byB0aGUgbGlzdCovCkJsb2NrQ2hhaW4gKmFwcGVuZFRvQ2hhaW4oQmxvY2tDaGFpbiAqcENoYWluLCBjaGFyICpwc3RyaW5nKXsKICAgIEJsb2NrICpuZXdCbG9jayA9IGNyZWF0ZUJsb2NrKHBzdHJpbmcpOwoKICAgIG5ld0Jsb2NrLT5wcmV2ID0gcENoYWluLT50YWlsOwogICAgbmV3QmxvY2stPm5leHQgPSBOVUxMOwogICAgaWYocENoYWluLT50YWlsICE9IE5VTEwpCiAgICAgICAgcENoYWluLT50YWlsLT5uZXh0ID0gbmV3QmxvY2s7CiAgICBwQ2hhaW4tPnRhaWwgPSBuZXdCbG9jazsKICAgIGlmKHBDaGFpbi0+Z2VuID09IE5VTEwpCiAgICAgICAgcENoYWluLT5nZW4gPSBuZXdCbG9jazsKICAgIHBDaGFpbi0+bGVuKys7CgogICAgcmV0dXJuIHBDaGFpbjsKfQoKdm9pZCBwcmludEJsb2NrKEJsb2NrICpwYmxvY2spewogICAgcHJpbnRmKCJTdHJpbmc6ICVzXG4iLCBwYmxvY2stPnN0cmluZyk7CiAgICBwcmludGYoIlByZXY6ICVwXG4iLCAodm9pZCAqKSBwYmxvY2stPnByZXYpOwogICAgcHJpbnRmKCJDdXI6ICVwXG4iLCAodm9pZCAqKSBwYmxvY2spOwogICAgcHJpbnRmKCJOZXh0OiAlcFxuIiwgKHZvaWQgKikgcGJsb2NrLT5uZXh0KTsKfQoKdm9pZCBwcmludENoYWluKEJsb2NrICpwZ2VuKXsKICAgIEJsb2NrICp0bXAgPSBwZ2VuOwoKICAgIHdoaWxlKHRtcCAhPSBOVUxMKXsKICAgICAgICBwcmludEJsb2NrKHRtcCk7CiAgICAgICAgdG1wID0gdG1wLT5uZXh0OwogICAgfQp9CgppbnQgbWFpbih2b2lkKXsKICAgIEJsb2NrQ2hhaW4gKm15Q2hhaW4gPSBjcmVhdGVCbG9ja0NoYWluKCk7CgogICAgYXBwZW5kVG9DaGFpbihteUNoYWluLCAiSGVsbG8xIik7CiAgICBhcHBlbmRUb0NoYWluKG15Q2hhaW4sICJIZWxsbzIiKTsKICAgIHByaW50Q2hhaW4obXlDaGFpbi0+Z2VuKTsKICAgIGZyZWUobXlDaGFpbik7CiAgICByZXR1cm4gMDsKfQ==