Mercurial > repos > dawe > srf2fastq
diff srf2fastq/io_lib-1.12.2/io_lib/array.c @ 0:d901c9f41a6a default tip
Migrated tool version 1.0.1 from old tool shed archive to new tool shed repository
author | dawe |
---|---|
date | Tue, 07 Jun 2011 17:48:05 -0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/srf2fastq/io_lib-1.12.2/io_lib/array.c Tue Jun 07 17:48:05 2011 -0400 @@ -0,0 +1,145 @@ +/* + * Copyright (c) Medical Research Council 1994. All rights reserved. + * + * Permission to use, copy, modify and distribute this software and its + * documentation for any purpose is hereby granted without fee, provided that + * this copyright and notice appears in all copies. + * + * This file was written by James Bonfield, Simon Dear, Rodger Staden, + * as part of the Staden Package at the MRC Laboratory of Molecular + * Biology, Hills Road, Cambridge, CB2 2QH, United Kingdom. + * + * MRC disclaims all warranties with regard to this software. + */ + +/* + * File: array.c + * Version: + * + * Description: + * + * Created: + * Updated: + * + */ + +#include <stdio.h> +#include <sys/types.h> + +#include "io_lib/array.h" +#include "io_lib/xalloc.h" + + +/* + * For error reporting + */ +int ArrayError = 0; + + +char *ArrayErrorString(int err) +{ + switch(err) { + case ARRAY_NO_ERROR: return "No error"; + case ARRAY_FULL: return "Array full"; + case ARRAY_INVALID_ARGUMENTS: return "Invalid arguments"; + case ARRAY_OUT_OF_MEMORY: return "Out of memory"; + default: return "Unknown error"; + } +} + + + +Array ArrayCreate(size_t size, size_t dim) +/* + * create a new array + */ +{ + Array a; + + if ( (a = (Array) xmalloc(sizeof(ArrayStruct)) ) == NULL ) { + ArrayError = ARRAY_OUT_OF_MEMORY; + } else { + a->size = size; + a->dim = dim?dim:1; + a->max = 0; + if ( (a->base = (void *)xmalloc(a->size * a->dim)) == NULL ) { + ArrayError = ARRAY_OUT_OF_MEMORY; + xfree(a); + a = NULL; + } + } + + return a; + +} + + + +int ArrayExtend(Array a, size_t dim) +/* + * extend array + */ +{ + void *newbase; + size_t old_dim; + + if (a == NULL) return ArrayError = ARRAY_INVALID_ARGUMENTS; + if (dim < a->dim) return ArrayError = ARRAY_NO_ERROR; + + old_dim = a->dim; + while (dim >= a->dim) { + a->dim = a->dim * 1.2 + 1; + } + + if ( (newbase = (void *)xrealloc(a->base, a->size * a->dim)) == NULL ) { + a->dim = old_dim; + return ArrayError = ARRAY_OUT_OF_MEMORY; + } else { + a->base = newbase; + } + + return ArrayError = ARRAY_NO_ERROR; +} + + + + +void *ArrayRef(Array a, size_t i) +{ + if (a==NULL) { + ArrayError = ARRAY_INVALID_ARGUMENTS; + return NULL; + } + + if (i >= a->max) { + if (i >= a->dim) { + if (ArrayExtend(a,i+1)) { + /* ArrayExtend sets ArrayError */ + return NULL; + } + } + a->max = i+1; + } + + return (void *) arrp(char,a,i*a->size); +} + + + +int ArrayDestroy(Array a) +/* + * destroy array + */ +{ + if (a==NULL) return ArrayError = ARRAY_INVALID_ARGUMENTS; + + if (a->base != NULL) xfree(a->base); + a->base= NULL; + xfree(a); + + return ArrayError = ARRAY_NO_ERROR; + + +} + +