/******************************************************************************/
/* */
/* X r d S u t B u c k e t . c c */
/* */
/* (c) 2004 by the Board of Trustees of the Leland Stanford, Jr., University */
/* Produced by Gerri Ganis for CERN */
/* */
/* This file is part of the XRootD software suite. */
/* */
/* XRootD is free software: you can redistribute it and/or modify it under */
/* the terms of the GNU Lesser General Public License as published by the */
/* Free Software Foundation, either version 3 of the License, or (at your */
/* option) any later version. */
/* */
/* XRootD 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 Lesser General Public */
/* License for more details. */
/* */
/* You should have received a copy of the GNU Lesser General Public License */
/* along with XRootD in a file called COPYING.LESSER (LGPL license) and file */
/* COPYING (GPL license). If not, see . */
/* */
/* The copyright holder's institutional names and contributor's names may not */
/* be used to endorse or promote products derived from this software without */
/* specific prior written permission of the institution or contributor. */
/******************************************************************************/
#include
#include
#include "XrdOuc/XrdOucString.hh"
#include "XrdSut/XrdSutBucket.hh"
#include "XrdSut/XrdSutTrace.hh"
/******************************************************************************/
/* M a s k s f o r A S C I I c h a r a c t e r s */
/******************************************************************************/
static kXR_int32 XrdSutCharMsk[4][4] =
{ {0x00000000, -1, -1, -2}, // any printable char
{0x00000000, 0x0000ffc0, 0x7fffffe0, 0x7fffffe0}, // letters/numbers (up/low case)
{0x00000000, 0x0000ffc0, 0x7e000000, 0x7e000000}, // hex characters (up/low case)
{0x00000000, 0x03ffc000, 0x07fffffe, 0x07fffffe} }; // crypt like [a-zA-Z0-9./]
/******************************************************************************/
/* */
/* Unit for information exchange */
/* */
/******************************************************************************/
//______________________________________________________________________________
XrdSutBucket::XrdSutBucket(char *bp, int sz, int ty)
{
// Default constructor
buffer = membuf = bp;
size=sz;
type=ty;
}
//______________________________________________________________________________
XrdSutBucket::XrdSutBucket(XrdOucString &s, int ty)
{
// Constructor
membuf = 0;
size = 0;
type = ty;
if (s.length()) {
membuf = new char [s.length()];
if (membuf) {
memcpy(membuf,s.c_str(),s.length());
buffer = membuf;
size = s.length();
}
}
}
//______________________________________________________________________________
XrdSutBucket::XrdSutBucket(XrdSutBucket &b)
{
// Copy constructor
membuf = new char[b.size];
if (membuf) {
memcpy(membuf,b.buffer,b.size);
buffer = membuf;
type = b.type;
size = b.size;
}
}
//______________________________________________________________________________
void XrdSutBucket::Update(char *nb, int ns, int ty)
{
// Update content
if (membuf)
delete[] membuf;
buffer = membuf = nb;
size = ns;
if (ty)
type = ty;
}
//______________________________________________________________________________
int XrdSutBucket::Update(XrdOucString &s, int ty)
{
// Update content
// Returns 0 if ok, -1 otherwise.
if (membuf)
delete[] membuf;
membuf = buffer = 0;
if (s.length()) {
membuf = new char [s.length()];
if (membuf) {
memcpy(membuf,s.c_str(),s.length());
buffer = membuf;
size = s.length();
if (ty)
type = ty;
return 0;
}
}
return -1;
}
//______________________________________________________________________________
int XrdSutBucket::SetBuf(const char *nb, int ns)
{
// Fill local buffer with ns bytes at nb.
// Memory is properly allocated / deallocated
// Returns 0 if ok, -1 otherwise.
if (membuf)
delete[] membuf;
size = 0;
membuf = buffer = 0;
if (nb && ns) {
membuf = new char [ns];
if (membuf) {
memcpy(membuf,nb,ns);
buffer = membuf;
size = ns;
return 0;
}
}
return -1;
}
//______________________________________________________________________________
void XrdSutBucket::ToString(XrdOucString &s)
{
// Convert content into a null terminated string
// (nb: the caller must be sure that the operation makes sense)
s = "";
char *b = new char[size+1];
if (b) {
memcpy(b,buffer,size);
b[size] = 0;
s = (const char *)b;
delete[] b;
}
}
//_____________________________________________________________________________
void XrdSutBucket::Dump(int opt)
{
// Dump content of bucket
// Options:
// 1 print header and tail (default)
// 0 dump only content
EPNAME("Bucket::Dump");
if (opt == 1) {
PRINT("//-----------------------------------------------------//");
PRINT("// //");
PRINT("// XrdSutBucket DUMP //");
PRINT("// //");
}
PRINT("// addr: " < 127) ? 0 : 1;
if (isascii) {
j = i / 32;
l = i - j * 32;
}
char chex[8];
sprintf(chex," 0x%02x",(int)(i & 0xFF));
bhex.append( chex );
if (isascii && ((XrdSutCharMsk[0][j] & (1 << (31-l+1))) || i == 0x20)) {
bpri[curpri] = i;
} else {
bpri[curpri] = '.';
}
curpri++;
if (curpri > 7) {
bpri[curpri] = 0;
PRINT("// " < 0) {
while (curpri++ < 8) {
bhex.append( " " );
}
}
PRINT("// " <