mirror of
https://github.com/troydhanson/tpl.git
synced 2024-12-28 00:21:03 +08:00
127 lines
2.9 KiB
C
127 lines
2.9 KiB
C
|
#include "tpl.h"
|
||
|
#include <fcntl.h>
|
||
|
#include <inttypes.h>
|
||
|
#include <stdio.h>
|
||
|
#include <string.h>
|
||
|
#include <sys/stat.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <unistd.h>
|
||
|
#include <errno.h>
|
||
|
|
||
|
#define SUM_LENGTH 16
|
||
|
#define MS_COUNT 9
|
||
|
struct sum_buf {
|
||
|
int64_t offset;
|
||
|
int len;
|
||
|
uint32_t sum1;
|
||
|
int chain;
|
||
|
uint16_t flags;
|
||
|
char sum2[SUM_LENGTH];
|
||
|
};
|
||
|
|
||
|
struct sum_struct {
|
||
|
int64_t flength;
|
||
|
struct sum_buf *sums;
|
||
|
int count;
|
||
|
int blength;
|
||
|
int remainder;
|
||
|
int s2length;
|
||
|
};
|
||
|
|
||
|
const char *filename = "/tmp/test106.tpl";
|
||
|
|
||
|
int pack(int use_fd)
|
||
|
{
|
||
|
tpl_node *tn;
|
||
|
struct sum_struct ms;
|
||
|
int fd=-1,j;
|
||
|
unsigned perms;
|
||
|
|
||
|
perms = S_IRUSR|S_IWUSR;
|
||
|
if (use_fd) {
|
||
|
if ( (fd=open( filename,O_WRONLY|O_CREAT,perms)) == -1) {
|
||
|
printf("failed to open %s: %s", filename, strerror(errno));
|
||
|
return(-1);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
ms.flength = 1000;
|
||
|
ms.count = MS_COUNT;
|
||
|
ms.blength = 23;
|
||
|
ms.remainder = 43;
|
||
|
ms.s2length = 16;
|
||
|
|
||
|
ms.sums = (struct sum_buf*) malloc((sizeof(struct sum_buf))*ms.count);
|
||
|
|
||
|
for(j=0;j<ms.count;j++)
|
||
|
{
|
||
|
ms.sums[j].offset = (uint64_t) j;
|
||
|
ms.sums[j].len = j*5;
|
||
|
ms.sums[j].sum1 = j*10;
|
||
|
ms.sums[j].chain = j*1000+5000;
|
||
|
ms.sums[j].flags = j*3 + 15;
|
||
|
memset(ms.sums[j].sum2,0,SUM_LENGTH);
|
||
|
strcpy(ms.sums[j].sum2,"Deepak");
|
||
|
}
|
||
|
|
||
|
tn = tpl_map( "IS(Iiuijc#)#iiii", &ms.flength,ms.sums,SUM_LENGTH,
|
||
|
ms.count,&ms.count,&ms.blength,&ms.remainder,&ms.s2length);
|
||
|
tpl_pack( tn, 0 );
|
||
|
|
||
|
if (use_fd) {
|
||
|
tpl_dump(tn,TPL_FD, fd);
|
||
|
close(fd);
|
||
|
} else {
|
||
|
tpl_dump(tn,TPL_FILE,filename);
|
||
|
}
|
||
|
|
||
|
tpl_free( tn );
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
int unpack(int use_fd) {
|
||
|
tpl_node *tn;
|
||
|
struct sum_struct ms;
|
||
|
unsigned perms;
|
||
|
int fd=-1,i;
|
||
|
|
||
|
perms = S_IRUSR|S_IWUSR;
|
||
|
if (use_fd) {
|
||
|
if ( (fd=open( filename,O_RDONLY,perms)) == -1) {
|
||
|
printf("failed to open %s: %s", filename, strerror(errno));
|
||
|
return(-1);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
ms.sums = (struct sum_buf*) malloc((sizeof(struct sum_buf))*MS_COUNT);
|
||
|
|
||
|
tn = tpl_map( "IS(Iiuijc#)#iiii", &ms.flength,ms.sums,SUM_LENGTH,
|
||
|
MS_COUNT,&ms.count,&ms.blength,&ms.remainder,&ms.s2length);
|
||
|
if (use_fd) tpl_load(tn, TPL_FD, fd);
|
||
|
else tpl_load(tn, TPL_FILE, filename);
|
||
|
tpl_unpack(tn, 0 );
|
||
|
tpl_free( tn );
|
||
|
if (use_fd) close(fd);
|
||
|
|
||
|
printf("%d\n", (int)(ms.flength));
|
||
|
for(i=0; i < MS_COUNT; i++) {
|
||
|
printf(" %d, %d, %u, %d, %d, %s\n", (int)(ms.sums[i].offset), ms.sums[i].len, ms.sums[i].sum1, ms.sums[i].chain, (int)(ms.sums[i].flags), ms.sums[i].sum2);
|
||
|
}
|
||
|
printf("%d,%d,%d,%d\n", ms.count, ms.blength, ms.remainder, ms.s2length);
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
int main() {
|
||
|
printf("testing with TPL_FILE:\n");
|
||
|
pack(0);
|
||
|
unpack(0);
|
||
|
|
||
|
printf("testing with TPL_FD:\n");
|
||
|
pack(1);
|
||
|
unpack(1);
|
||
|
|
||
|
return 0;
|
||
|
}
|