/* * Copyright 1995, 1996 Perforce Software. All rights reserved. * * This file is part of Perforce - the FAST SCM System. */ /* * StrOps.h - operations on strings * * StrOps - member-less object with static functions * * Methods: * * StrOps::Caps() - uppercase each character (in place) in a string * StrOps::Dump() - pretty print contents, for debugging * StrOps::Sub() - replace one character with another * StrOps::Expand() - expand a string doing %var% substitutions * StrOps::Expand2() - expand a string doing [%var%|opt] substitutions * StrOps::Indent() - fill by indenting contents of another buffer * StrOps::Replace() - replace all occurences of a string * StrOps::Lines() - break buffer into \r\n or \n separated lines * StrOps::Lower() - lowercase each character (in place) in a string * StrOps::Upper() - uppercase each character (in place) in a string * StrOps::Words() - break buffer into whitespace-separated words * StrOps::OtoX() - turn an octet stream into hex * StrOps::XtoO() - turn hex into an octet stream * StrOps::WildToStr() - turn wildcards into %x escaped string * StrOps::StrToWild() - turn %x escaped string into wildcards. * StrOps::CompatWild() - turn %%d to %d for p4 where compatability. * StrOps::ScrunchArgs() - try to display argv in a limited output buffer. * StrOps::CommonPath() - construct common filepath across multiple calls. * StrOps::StripNewline() - strip \r\n from end of buffer * * StrOps::CharCnt() - Count characters in text using the server's charset * StrOps::CharCopy() - copy counting characters (not bytes) * StrOps::SafeLen() - Length of string including only complete characters * * StrOps::UnpackInt() - extract an integer from front of buffer * StrOps::UnpackInt64() - extract a long long from front of buffer * StrOps::UnpackIntA() - extract an integer encoded in ascii * StrOps::UnpackChar() - extract a char string from front of buffer * StrOps::UnpackOctet() - extract a byte string from front of buffer * StrOps::UnpackString() - extract a char string from front of buffer * StrOps::UnpackStringA() - extract a char string with length in ascii * * StrOps::PackInt() - append a formatted int to buffer * StrOps::PackIntA() - append a formatted int to buffer in ascii * StrOps::PackChar() - append a formatted string to buffer * StrOps::PackOctet() - append byte array to buffer * StrOps::PackString() - append a formatted string to buffer * StrOps::PackStringA() - append a formatted string with len in ascii */ class StrPtr; class StrRef; class StrBuf; class StrDict; class StrOps { public: // Manipulating static void Caps( StrBuf &o ); static void Dump( const StrPtr &o ); static void Sub( StrPtr &string, char target, char replacement ); static void Expand( StrBuf &o, const StrPtr &s, StrDict &d, StrDict *u = 0 ); static void Expand2( StrBuf &o, const StrPtr &s, StrDict &d ); static void RmUniquote( StrBuf &o, const StrPtr &s ); static void Indent( StrBuf &o, const StrPtr &s ); static void Replace( StrBuf &o, const StrPtr &i, const StrPtr &s, const StrPtr &r ); static void ReplaceWild( StrBuf &o, const StrPtr &i ); static int Lines( StrBuf &o, char *vec[], int maxVec ); static void Lower( StrBuf &o ); static void Upper( StrBuf &o ); static int Words( StrBuf &tmp, const char *w, char *vec[], int maxVec ); static void OtoX( const StrPtr &octet, StrBuf &hex ); static void XtoO( const StrPtr &hex, StrBuf &octet ); static void OtoX( const unsigned char *octet, p4size_t len, StrBuf &x ); static void XtoO( char *x, unsigned char *octet, int octLen ); static char OtoX( unsigned char o ) { return o >= 10 ? o - 10 + 'A' : o + '0'; } static unsigned char XtoO( char h ) { return h - ( h > '9' ? ( h >= 'a' ? 'a' - 10 : 'A' - 10 ) : '0' ); } static void OtoXlower( const StrPtr &octet, StrBuf &hex ); static void OtoXlower( const unsigned char *, p4size_t len, StrBuf &x ); static char OtoXlower( unsigned char o ); static int IsDigest( const StrPtr &hex ); static int IsSha1( const StrPtr &hex ); static void WildToStr( const StrPtr &i, StrBuf &o ); static void WildToStr( const StrPtr &i, StrBuf &o, const char *t ); static void StrToWild( const StrPtr &i, StrBuf &o ); static void StrToWild( const StrPtr &i, StrBuf &o, const char *t ); static void WildCompat( const StrPtr &i, StrBuf &o ); static void MaskNonPrintable( const StrPtr &i, StrBuf &o ); static void EncodeNonPrintable( const StrPtr &i, StrBuf &o, int maskp = 0, int cmdSafe = 0 ); static void DecodeNonPrintable( const StrPtr &i, StrBuf &o ); static unsigned int HashStringToBucket( const StrPtr &in, int buckets ); static void ScrunchArgs( StrBuf &out, int argc, StrPtr *argv, int targetLength, int delim = ' ', const char *unsafeChars = 0); static void CommonPath( StrBuf &o, int &mdir, const StrPtr &n ); static void GetDepotFileExtension( const StrBuf &path, StrBuf &ext ); static void GetDepotName( const char *d, StrBuf &n ); static void StripNewline( StrBuf &o ); static void LFtoCRLF( const StrBuf *in, StrBuf *out ); static int StreamNameInPath( const char *df, int depth, StrBuf &n ); // i18n static int CharCnt( const StrPtr &i ); static void CharCopy( const StrPtr &s, StrBuf &t, int length ); static int SafeLen( const StrPtr &s ); // Marshalling static void PackInt( StrBuf &o, int v ); static void PackIntA( StrBuf &o, int v ); static void PackInt64( StrBuf &o, P4INT64 v ); static void PackChar( StrBuf &o, const char *c, int len ); static void PackOctet( StrBuf &o, const StrPtr &s ); static void PackString( StrBuf &o, const StrPtr &s ); static void PackStringA( StrBuf &o, const StrPtr &s ); static int UnpackInt( StrRef &o ); static int UnpackIntA( StrRef &o ); static P4INT64 UnpackInt64( StrRef &o ); static void UnpackChar( StrRef &o, char *c, int length ); static void UnpackOctet( StrRef &o, const StrPtr &s ); static void UnpackString( StrRef &o, StrBuf &s ); static void UnpackStringA( StrRef &o, StrBuf &s ); static void UnpackString( StrRef &o, StrRef &s ); static void UnpackStringA( StrRef &o, StrRef &s ); } ;