Logo Search packages:      
Sourcecode: ksh version File versions  Download package

sum-ast4.c

/***********************************************************************
*                                                                      *
*               This software is part of the ast package               *
*          Copyright (c) 1996-2010 AT&T Intellectual Property          *
*                      and is licensed under the                       *
*                  Common Public License, Version 1.0                  *
*                    by AT&T Intellectual Property                     *
*                                                                      *
*                A copy of the License is available at                 *
*            http://www.opensource.org/licenses/cpl1.0.txt             *
*         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         *
*                                                                      *
*              Information and Software Systems Research               *
*                            AT&T Research                             *
*                           Florham Park NJ                            *
*                                                                      *
*                 Glenn Fowler <gsf@research.att.com>                  *
*                                                                      *
***********************************************************************/
#pragma prototyped

/*
 * ast4
 */

#define ast4_description \
      "The \bast\b 128 bit PRNG hash generated by catenating 4 separate 32 \
      bit PNRG hashes. The block count is not printed."
#define ast4_options    0
#define ast4_match      "ast4|32x4|tw"
#define ast4_done long_done
#define ast4_scale      0

typedef struct Ast4_sum_s
{
      uint32_t    sum0;
      uint32_t    sum1;
      uint32_t    sum2;
      uint32_t    sum3;
} Ast4_sum_t;

typedef struct Ast4_s
{
      _SUM_PUBLIC_
      _SUM_PRIVATE_
      Ast4_sum_t  cur;
      Ast4_sum_t  tot;
      unsigned char     buf[sizeof(Ast4_sum_t)];
} Ast4_t;

static int
ast4_init(Sum_t* p)
{
      register Ast4_t*  a = (Ast4_t*)p;

      a->tot.sum0 ^= a->cur.sum0;
      a->cur.sum0 = 0;
      a->tot.sum1 ^= a->cur.sum1;
      a->cur.sum1 = 0;
      a->tot.sum2 ^= a->cur.sum2;
      a->cur.sum2 = 0;
      a->tot.sum3 ^= a->cur.sum3;
      a->cur.sum3 = 0;
      return 0;
}

static Sum_t*
ast4_open(const Method_t* method, const char* name)
{
      Ast4_t*     p;

      if (p = newof(0, Ast4_t, 1, 0))
      {
            p->method = (Method_t*)method;
            p->name = name;
      }
      return (Sum_t*)p;
}

static int
ast4_block(Sum_t* p, const void* s, size_t n)
{
      register Ast4_sum_t*    a = &((Ast4_t*)p)->cur;
      register unsigned char* b = (unsigned char*)s;
      register unsigned char* e = b + n;
      register int            c;

      while (b < e)
      {
            c = *b++;
            a->sum0 = a->sum0 * 0x63c63cd9 + 0x9c39c33d + c;
            a->sum1 = a->sum1 * 0x00000011 + 0x00017cfb + c;
            a->sum2 = a->sum2 * 0x12345679 + 0x3ade68b1 + c;
            a->sum3 = a->sum3 * 0xf1eac01d + 0xcafe10af + c;
      }
      return 0;
}

static int
ast4_print(Sum_t* p, Sfio_t* sp, int flags, size_t scale)
{
      register Ast4_sum_t*    a;

      a = (flags & SUM_TOTAL) ? &((Ast4_t*)p)->tot : &((Ast4_t*)p)->cur;
      sfprintf(sp, "%06..64u%06..64u%06..64u%06..64u", a->sum0, a->sum1, a->sum2, a->sum3);
      return 0;
}

static int
ast4_data(Sum_t* p, Sumdata_t* data)
{
      data->size = sizeof(((Ast4_t*)p)->cur);
      data->num = 0;
#if _ast_intswap
      swapmem(_ast_intswap, data->buf = ((Ast4_t*)p)->buf, &((Ast4_t*)p)->cur, sizeof(((Ast4_t*)p)->cur));
#else
      data->buf = &((Ast4_t*)p)->cur;
#endif
      return 0;
}

Generated by  Doxygen 1.6.0   Back to index