mirror of
https://github.com/acemod/ACE3.git
synced 2024-08-30 18:23:18 +00:00
90a8e5a1d6
* Dynload - Fix buffer overflow * Fix more buffer overflows * Fix Artillery Tables compilation for GCC
73 lines
1.7 KiB
C++
73 lines
1.7 KiB
C++
/*
|
|
* ace_break_line.cpp
|
|
*
|
|
* Takes a string and insert as many line breaks as needed so it fits a given width
|
|
*
|
|
* Takes:
|
|
* Localized string as string
|
|
* Example: "Check weapon temperature"
|
|
*
|
|
* Returns:
|
|
* String with line breaks
|
|
*/
|
|
|
|
#include "shared.hpp"
|
|
|
|
#include <stdlib.h>
|
|
#include <sstream>
|
|
#include <vector>
|
|
#include <string>
|
|
|
|
#define MAXCHARACTERS 14
|
|
|
|
extern "C" {
|
|
EXPORT void __stdcall RVExtension(char *output, int outputSize, const char *function);
|
|
}
|
|
|
|
std::vector<std::string> splitString(const std::string & input) {
|
|
std::istringstream ss(input);
|
|
std::string token;
|
|
|
|
std::vector<std::string> output;
|
|
while (std::getline(ss, token, ' ')) {
|
|
output.push_back(token);
|
|
}
|
|
|
|
return output;
|
|
}
|
|
|
|
std::string addLineBreaks(const std::vector<std::string> &words) {
|
|
std::stringstream sstream;
|
|
size_t numChar = 0;
|
|
size_t i = 0;
|
|
|
|
while (i < words.size()) {
|
|
if (numChar == 0) {
|
|
sstream << words[i];
|
|
numChar += words[i].size();
|
|
i++;
|
|
} else {
|
|
if (numChar + 1 + words[i].size() > MAXCHARACTERS) {
|
|
sstream << "<br/>";
|
|
numChar = 0;
|
|
} else {
|
|
sstream << " " << words[i];
|
|
numChar += 1 + words[i].size();
|
|
i++;
|
|
}
|
|
}
|
|
}
|
|
|
|
return sstream.str();
|
|
}
|
|
|
|
void __stdcall RVExtension(char *output, int outputSize, const char *function) {
|
|
ZERO_OUTPUT();
|
|
if (!strcmp(function, "version")) {
|
|
strncpy(output, ACE_FULL_VERSION_STR, outputSize - 1);
|
|
} else {
|
|
strncpy(output, addLineBreaks(splitString(function)).c_str(), outputSize - 1);
|
|
}
|
|
EXTENSION_RETURN();
|
|
}
|