Files
2025-12-05 08:54:02 +01:00

83 lines
1.9 KiB
Plaintext

// Copyright (C) 2010, Guy Barrand. All rights reserved.
// See the file tools.license for terms.
#ifndef tools_sprintf
#define tools_sprintf
#include <string>
#include "snpf"
namespace tools {
inline bool vsprintf(std::string& a_string,int a_length,const char* a_format,va_list a_args){
a_string.clear();
if(a_length<0) return false;
if(!a_format) return false;
char* _s = new char[a_length+1];
if(!_s) return false;
_s[a_length] = '\0';
int n = vsnpf(_s,a_length+1,a_format,a_args);
if(n>a_length) {
delete [] _s;
return false;
}
if(_s[a_length]!='\0') {
delete [] _s;
return false;
}
a_string = _s;
delete [] _s;
return true;
}
inline bool sprintf(std::string& a_string,int a_length,const char* a_format,...){
a_string.clear();
if(a_length<0) return false;
if(!a_format) return false;
char* _s = new char[a_length+1];
if(!_s) return false;
_s[a_length] = '\0';
va_list args;
va_start(args,a_format);
int n = vsnpf(_s,a_length+1,a_format,args);
va_end(args);
if(n>a_length) {
delete [] _s;
return false;
}
if(_s[a_length]!='\0') {
delete [] _s;
return false;
}
a_string = _s;
delete [] _s;
return true;
}
inline bool print2s(std::string& a_string,int a_length,const char* a_format,...){
if(a_length<0) {a_string.clear();return false;}
if(!a_format) {a_string.clear();return false;}
a_string.assign(a_length,' '); //data = a_length+1
char* _s = const_cast<char*>(a_string.c_str());
//_s[a_length] shoulg be '\0'.
va_list args;
va_start(args,a_format);
int n = vsnpf(_s,a_length+1,a_format,args);
va_end(args);
if(n>a_length) { //a_string is compromised.
a_string.clear(); //we cross fingers.
return false;
}
if(_s[a_length]!='\0') { //a_string is compromised.
a_string.clear(); //we cross fingers.
return false;
}
a_string.resize(n);
return true;
}
}
#endif