//  This may look like C code, but it is really -*- C++ -*-

//  ------------------------------------------------------------------
//  The Goldware Library
//  Copyright (C) 1990-1999 Odinn Sorensen
//  ------------------------------------------------------------------
//  This library is free software; you can redistribute it and/or
//  modify it under the terms of the GNU Library General Public
//  License as published by the Free Software Foundation; either
//  version 2 of the License, or (at your option) any later version.
//
//  This library is distributed in the hope that it will be useful,
//  but WITHOUT ANY WARRANTY; without even the implied warranty of
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
//  Library General Public License for more details.
//
//  You should have received a copy of the GNU Library General Public
//  License along with this program; if not, write to the Free
//  Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
//  MA 02111-1307, USA
//  ------------------------------------------------------------------
//  $Id$
//  ------------------------------------------------------------------
//  Miscellaneous memory functions
//  ------------------------------------------------------------------

#include <cstdio>
#include <gmemall.h>


//  ------------------------------------------------------------------
//  Dump 16 bytes as hex and characters

char* HexDump16(char* strbuf, const char* memptr, int limit, const char* fmt, int fmtno)
{

    int n;
    word mem[16];
    char str[17];
    word* mptr=mem;
    char* sptr=str;
    const char* fmts[] =
    {
        fmt,
        "%02X%02X %02X%02X %02X%02X %02X%02X  %02X%02X %02X%02X %02X%02X %02X%02X  %s",
        "%02X %02X %02X %02X  %02X %02X %02X %02X  %02X %02X %02X %02X  %02X %02X %02X %02X  %s"
    };

    limit = (limit > 16) ? 16 : limit;

    for(n=0; n<limit; n++, memptr++)
    {
        *mptr++ = *memptr;
        *sptr++ = *memptr >= ' ' ? *memptr : '.';
    }
    for(; n<16; n++, memptr++)
    {
        *mptr++ = 0;
        *sptr++ = '.';
    }
    *sptr = NUL;

    sprintf(strbuf, fmts[fmtno],
            mem[0], mem[1], mem[2],  mem[3],  mem[4],  mem[5],  mem[6],  mem[7],
            mem[8], mem[9], mem[10], mem[11], mem[12], mem[13], mem[14], mem[15],
            str
           );

    return strbuf;
}


//  ------------------------------------------------------------------
