You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by bc...@apache.org on 2020/05/04 22:55:27 UTC
[trafficserver] 02/02: GCC 10: Update traffic_via to use
string_view to avoid compile errors.
This is an automated email from the ASF dual-hosted git repository.
bcall pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficserver.git
commit a1fb39e32515b779473fae9fa325b3f7f510c22b
Author: Alan M. Carroll <am...@apache.org>
AuthorDate: Fri May 1 14:28:54 2020 -0500
GCC 10: Update traffic_via to use string_view to avoid compile errors.
---
src/traffic_via/traffic_via.cc | 81 +++++++++++++++++-------------------------
1 file changed, 33 insertions(+), 48 deletions(-)
diff --git a/src/traffic_via/traffic_via.cc b/src/traffic_via/traffic_via.cc
index 197032b..65fb617 100644
--- a/src/traffic_via/traffic_via.cc
+++ b/src/traffic_via/traffic_via.cc
@@ -24,11 +24,11 @@
#include "tscore/ink_platform.h"
#include "tscore/ink_args.h"
#include "tscore/I_Version.h"
-#include "tscore/Tokenizer.h"
-#include "tscore/TextBuffer.h"
#include "mgmtapi.h"
#include <cstdio>
#include <cstring>
+#include <iostream>
+#include <string_view>
#include "tscore/Regex.h"
/// XXX Use DFA or Regex wrappers?
@@ -43,11 +43,11 @@
static AppVersionInfo appVersionInfo;
struct VIA {
- VIA(const char *t) : title(t), next(nullptr) { memset(viaData, 0, sizeof(viaData)); }
+ VIA(const char *t) : title(t) {}
~VIA() { delete next; }
const char *title;
- const char *viaData[128];
- VIA *next;
+ const char *viaData[128] = {}; // zero initialize
+ VIA *next = nullptr;
};
// Function to get via header table for every field/category in the via header
@@ -186,7 +186,7 @@ standardViaLookup(char flag)
// Function to print via header
static void
-printViaHeader(const char *header)
+printViaHeader(std::string_view header)
{
VIA *viaTable = nullptr;
VIA *viaEntry = nullptr;
@@ -195,22 +195,22 @@ printViaHeader(const char *header)
printf("Via Header Details:\n");
// Loop through input via header flags
- for (const char *c = header; *c; ++c) {
- if ((*c == ':') || (*c == ';')) {
+ for (char c : header) {
+ if ((c == ':') || (c == ';')) {
isDetail = true;
continue;
}
- if (islower(*c)) {
+ if (islower(c)) {
// Get the via header table
delete viaTable;
- viaEntry = viaTable = isDetail ? detailViaLookup(*c) : standardViaLookup(*c);
+ viaEntry = viaTable = isDetail ? detailViaLookup(c) : standardViaLookup(c);
} else {
// This is a one of the sequence of (uppercase) VIA codes.
if (viaEntry) {
+ unsigned char idx = c;
printf("%-55s:", viaEntry->title);
- printf("%s\n", viaEntry->viaData[static_cast<unsigned char>(*c)] ? viaEntry->viaData[static_cast<unsigned char>(*c)] :
- "Invalid sequence");
+ printf("%s\n", viaEntry->viaData[idx] ? viaEntry->viaData[idx] : "Invalid sequence");
viaEntry = viaEntry->next;
}
}
@@ -220,32 +220,29 @@ printViaHeader(const char *header)
// Check validity of via header and then decode it
static TSMgmtError
-decodeViaHeader(const char *str)
+decodeViaHeader(std::string_view text)
{
- size_t viaHdrLength = strlen(str);
- char tmp[viaHdrLength + 2];
- char *Via = tmp;
-
- memcpy(Via, str, viaHdrLength);
- Via[viaHdrLength] = '\0'; // null terminate
-
// Via header inside square brackets
- if (Via[0] == '[' && Via[viaHdrLength - 1] == ']') {
- viaHdrLength = viaHdrLength - 2;
- Via++;
- Via[viaHdrLength] = '\0'; // null terminate the string after trimming
+ if (!text.empty() && text.front() == '[' && text.back() == ']') {
+ text.remove_prefix(1);
+ text.remove_suffix(1);
+ }
+ if (text.empty()) {
+ return TS_ERR_FAIL;
}
- printf("Via header is [%s], Length is %zu\n", Via, viaHdrLength);
+ printf("Via header is [%.*s], Length is %zu\n", int(text.size()), text.data(), text.size());
- if (viaHdrLength == 5) {
- Via = strcat(Via, " "); // Add one space character before decoding via header
- ++viaHdrLength;
+ char extender[6];
+ if (text.size() == 5) { // add a trailing space in this case.
+ memcpy(extender, text.data(), text.size());
+ extender[5] = ' ';
+ text = std::string_view{extender, 6};
}
- if (viaHdrLength == 22 || viaHdrLength == 6) {
+ if (text.size() == 22 || text.size() == 6) {
// Decode via header
- printViaHeader(Via);
+ printViaHeader(text);
return TS_ERR_OKAY;
}
// Invalid header size, come out.
@@ -269,8 +266,7 @@ filterViaHeader()
int i;
const char *viaPattern =
R"(\[([ucsfpe]+[^\]]+)\])"; // Regex to match via header with in [] which can start with character class ucsfpe
- char *viaHeaderString;
- char viaHeader[1024];
+ std::string line;
// Compile PCRE via header pattern
compiledReg = pcre_compile(viaPattern, 0, &err, &errOffset, nullptr);
@@ -281,15 +277,9 @@ filterViaHeader()
}
// Read all lines from stdin
- while (fgets(viaHeader, sizeof(viaHeader), stdin)) {
- // Trim new line character and null terminate it
- char *newLinePtr = strchr(viaHeader, '\n');
- if (newLinePtr) {
- *newLinePtr = '\0';
- }
+ while (std::getline(std::cin, line)) {
// Match for via header pattern
- pcreExecCode = pcre_exec(compiledReg, extraReg, viaHeader, static_cast<int>(sizeof(viaHeader)), 0, 0, subStringVector,
- SUBSTRING_VECTOR_COUNT);
+ pcreExecCode = pcre_exec(compiledReg, extraReg, line.data(), line.size(), 0, 0, subStringVector, SUBSTRING_VECTOR_COUNT);
// Match failed, don't worry. Continue to next line.
if (pcreExecCode < 0) {
@@ -304,14 +294,9 @@ filterViaHeader()
// Loop based on number of matches found
for (i = 1; i < pcreExecCode; i++) {
- // Point to beginning of matched substring
- char *subStringBegin = viaHeader + subStringVector[2 * i];
- // Get length of matched substring
- int subStringLen = subStringVector[2 * i + 1] - subStringVector[2 * i];
- viaHeaderString = subStringBegin;
- sprintf(viaHeaderString, "%.*s", subStringLen, subStringBegin);
+ std::string_view match{line.data() + subStringVector[2 * i], size_t(subStringVector[2 * i + 1] - subStringVector[2 * i])};
// Decode matched substring
- decodeViaHeader(viaHeaderString);
+ decodeViaHeader(match);
}
}
return TS_ERR_OKAY;
@@ -338,7 +323,7 @@ main(int /* argc ATS_UNUSED */, const char **argv)
// Filter arguments provided from stdin
status = filterViaHeader();
} else {
- status = decodeViaHeader(file_arguments[i]);
+ status = decodeViaHeader(std::string_view{file_arguments[i], strlen(file_arguments[i])});
}
if (status != TS_ERR_OKAY) {