File:  [ELWIX - Embedded LightWeight unIX -] / libaitsync / src / patch.c
Revision 1.1: download - view: text, annotated - select for diffs - revision graph
Wed Mar 24 16:00:15 2010 UTC (14 years, 3 months ago) by misho
Branches: MAIN
CVS tags: HEAD
Initial revision

    1: #include "global.h"
    2: #include "patch.h"
    3: 
    4: 
    5: int sync_buildPatch(void * __restrict buf, u_int buflen, struct tagPiece ** __restrict arr)
    6: {
    7: 	void *pos;
    8: 	sync_chunk_t *prefix, *suffix;
    9: 	struct tagPiece *a = *arr;
   10: 	register int i;
   11: 	u_int len = buflen;
   12: 
   13: 	if (!buf || !arr)
   14: 		return -1;
   15: 
   16: 	a = malloc(sizeof(struct tagPiece));
   17: 	if (!a) {
   18: 		SETERR;
   19: 		return -1;
   20: 	} else
   21: 		memset(a, 0, sizeof(struct tagPiece));
   22: 
   23: 	for (pos = buf, i = 0; len && pos < buf + buflen; i++) {
   24: 		a = realloc(a, sizeof(struct tagPiece) * (i + 2));
   25: 		if (!a) {
   26: 			SETERR;
   27: 			return -1;
   28: 		} else {
   29: 			memset(&a[i + 1], 0, sizeof(struct tagPiece));
   30: 			// printf("%d.prefix_pos=%p len=%d\n", i, pos, len);
   31: 
   32: 			// prefix chunk
   33: 			prefix = pos;
   34: 			if (prefix->sc_magic != DLTSYNC_MAGIC) {
   35: 				if (a) {
   36: 					free(a);
   37: 					a = NULL;
   38: 				}
   39: 				return -1;
   40: 			} else {
   41: 				a[i].pfx = prefix;
   42: 				pos += sizeof(sync_chunk_t);
   43: 				len -= sizeof(sync_chunk_t);
   44: 			}
   45: 			// printf("%d.prefix=%p pos=%p len=%d\n", i, a[i].pfx, pos, len);
   46: 
   47: 			// data
   48: 			if (!len) {
   49: 				if (a) {
   50: 					free(a);
   51: 					a = NULL;
   52: 				}
   53: 				return -1;
   54: 			} else {
   55: 				a[i].buf = pos;
   56: 				pos += prefix->sc_len;
   57: 				len -= prefix->sc_len;
   58: 			}
   59: 			// printf("%d.data=%p pos=%p len=%d\n", i, a[i].buf, pos, len);
   60: 
   61: 			// if find sync chunk
   62: 			if (len) {
   63: 				suffix = pos;
   64: 				if (SIGSYNC_MAGIC == suffix->sc_magic) {
   65: 					a[i].sfx = suffix;
   66: 					pos += sizeof(sync_chunk_t);
   67: 					len -= sizeof(sync_chunk_t);
   68: 				}
   69: 				// printf("%d.data=%p pos=%p len=%d\n", i, a[i].sfx, pos, len);
   70: 			}
   71: 		}
   72: 	}
   73: 
   74: 	*arr = a;
   75: 	return i;
   76: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>