Files
SAPFOR/Sapfor/_src/Utils/errors.h
2025-03-12 12:37:19 +03:00

631 lines
23 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#pragma once
#include <string>
#ifdef __SPF
#include "dvm.h"
#endif
enum typeMessage { WARR, ERROR, NOTE };
//Гайд по русификации сообщений смотри ниже.
// GROUP:
// 10xx - analysis
// 20xx - transform
// 30xx - parallel
// 50xx - checkpoint
// 10xx ANALISYS GROUP
// 01 "bad directive position, it can be placed only"
// 02 "variable '%s' is not used in loop"
// 03 "variable '%s' is not changed in loop"
// 04 "dimention of array '%s' is %d, but must be 1"
// 05 "type of array '%s' but must be INTEGER"
// 06 "type of variable '%s' must be array"
// 07 "array size can't be computed"
// 08 "size of array '%s' is %d, but you enter %d"
// 09 "array '%s' is private"
// 10 "only positive numbers are supported"
// 11 "no such expression '%s' on loop"
// 12 "More information is required about sizes of array '%s'"
// 13 "Function '%s' needs to be inlined ..."
// 14 "Found recursive chain calls: %s, this function will be ignored"
// 15 "This function is not called in current project"
// 16 "Can not calculate count of iterations for this loop, information about iterations in all loops in parallel regions '%s' will be ignored"
// 17 "Can not find declaration for symbol '%s' in current scope"
// 18 "This loop does not have END DO format"
// 19 "Include '%s' has executable operators"
// 20 "Active DVM directives are not supported yet"
// 21 "array ref '%s' has more than one loop's variables"
// 22 "array ref '%s' has indirect access"
// 23 "can not calculate index expression for array ref '%s'"
// 24 "coefficient A in A*x+B is not positive for array ref '%s', inverse distribution in not supported yet"
// 25 "can not map write to array '%s' to this loop"
// 26 "write to non distributed array '%s' in this loop"
// 27 "many operator in the same line"
// 28 "Module with name '%s' must be placed in current file"
// 29 lowlevel warnings from private analyzer
// 30 lowlevel notes from private analyzer
// 31 "wrong parallel region identifier: variable '%s' was declared on line %d"
// 32 "wrong parallel region identifier: variable '%s' was declared in common block '%s'"
// 33 "parallel region '%s' is included in file '%s'"
// 34 "parallel regions '%s' and '%s' are crossed"
// 35 "parallel region '%s' has data statement(s)"
// 36 "Can not build align graph from user's DVM directives in this region"
// 37 "Array can not be distributed because of DVM's I/O constraints"
// 38 "An equivalence operator at line %d is not supported yet"
// 39 "Variabled '%s' and '%s' in one storage association (common block '%s') have different types"
// 40 "First %d dimensions of array '%s' were deprecated to distributon due to function call '%s'"
// 41 "parallel region '%s' has line included in another region"
// 42 "distributed array in common block %s must have declaration in main unit"
// 43 "bad directive expression"
// 44 "Only pure procedures were supported"
// 45 "function's argument '%s' does not have declaration statement"
// 46 "mismatch of count formal and actual parameters "
// 47 "inconsistent array use"
// 48 "the same function name in different places was found"
// 49 "reasons of non pure function"
// 50 "count of PROGRAM unit"
// 51 "Detected mpi call, turn on special regime of paralyzing"
// 52 "error in user DVM intervals"
// 53 "variable in shrink clause must be arrayy in file '%s' on line %d"
// 54 "length of mask for array '%s' must be %d, but you enter only %d dimenions in file '%s' on line %d"
// 55 "wrong mask value in %d position: it can be only 0 or 1 in file '%s' on line %d"
// 56 "array '%s' in shrink clause must be also declared in private clause in file '%s' on line %d"
// 57 "Variable '%s' in %s clause must be used in next statement in file '%s' on line %d.\n."
// 58 "Left part of PARAMETER clause must be a variable in file '%s' on line %d.\n"
// 59 "Reduction by element of array '%s' is not implemented yet"
// 60 "Format misplaced"
// 61 "Array has declaration area conflict"
// 62 "need to move common declaration to main for DECLATE"
//
// 20xx TRANSFORM GROUP
// 01 "can not convert array assign to loop"
// 02 "converted arithmetic IF to simple IF"
// 03 "can not convert to END DO loop"
// 04 "convert to END DO loop"
// 05 "loops on lines %d and %d were combined"
// 06 "substitute statement function with name '%s'"
// 07 "Internal error during unparsing process has occurred"
// 08 "Can not do PRIVATE EXPANSION for this loop - privates not found"
// 09 "Can not split this loop because of dependecy: %s"
// 10 "This loop has indirect child loops and can not be splitted"
// 11 "It is allowed to inline function only at execution code section"
// 12 "for function duplication"
// 13 "for function duplication"
// 14 inlining errors - dims mismatch
// 15 unrolling loop errors
// 16 "cannot remove private var '%s' - it doesn't match any fixed dimensions mask"
// 17 cannot remove private var '%s' - it has recursive dependency or it depends on non-invariant var '%s'
// 18 "private variable '%s' was removed" or "private variable '%s' was partially removed"
// 19 "Removing of private var '%s' was made with assumption that references '%s' and '%s' are different"
// 20 "Function inlining failed with an error"
// 21 "cannot remove private var '%s' - cannot find reaching definition for the statement"
// 22 "cannot transform ..."
// 23 "cannot transform ..."
// 24 "Cannot remove private var '%s' - its references have different alignment with the loop"
// 25 "Cannot remove private var '%s' - it is used in the call of function '%s'"
// 30xx PARALLEL GROUP
// 01 "add across dependencies by array '%s' to loop"
// 02 "add private scalar '%s' to loop on line %d"
// 03 "add reduction scalar '%s' with operation '%s' to loop on line %d"
// 04 "unknown type of reduction scalar '%s'"
// 05 "unknown scalar dependencies by '%s' (try to specify its type)"
// 06 "... prevents parallelization"
// 07 "Can not create distributed link for array '%s': dim size of this array is '%d' and it is not equal '%d'"
// 08 "internal error in analysis, parallel directives will not be generated for this file!"
// 09 "Added remote access for array ref '%s' can significantly reduce performance"
// 10 "Can not find arrays for distribution for parallel region '%s', ignored"
// 11 "Arrays have different align rules in this loop according to their write accesses"
// 12 "parallel regions %shave common function '%s' which is used inside them"
// 13 "parallel regions %shave local array '%s' which is used inside them"
// 14 "parallel region '%s' has common array '%s' which is used inside and outside region"
// 15 "parallel region '%s' does not have DVM interval for fragment"
// 16 "expected only assign operands in DVM interval"
// 17 "parallel region '%s' does not have copying of array '%s' in DVM interval"
// 18 "parallel region '%s' does not have copying of common array '%s' in DVM interval"
// 19 "Can not find execution time for this loop, try to get times statistic"
// 20 "detected distributed and non distributed array links by function's calls for array %s\n"
// 21 "empty parallel regions is forbidden"
// 22 "Can not find align rules"
// 23 "Array reference '%s' has a different size from the original array"
// 24 "Array's memory intersections prevents this loop from parallelization"
// 40xx LOW LEVEL WARNINGS
// 01
// 02 Wrong pure declaration - INTENT mismatch
// 50xx CHECKPOINT GROUP
// 01 "The first argument must be TIME or ITER and the second must be integer in INTERVAL clause."
// 02 "CHECKPOINT directive with %s clause can be only at executable code section."
// 03 "CHECKPOINT directive with FILES clause must contain integer value."
// 04 "Variable '%s' in %s clause must be declared at the same module."
// 05 "Illegal option in TYPE clause."
// 06 "%s clause can be used only once."
// 07 "Variable '%s' can't be used in FILES and EXCEPT clauses at the same time."
extern int langOfMessages;
struct Messages
{
private:
//explicit Messages(const typeMessage type, const int line, const std::string &value_) : Messages(type, line, value_, 0) { }
explicit Messages(const typeMessage type, const int line, const std::wstring &value_, const int group) : type(type), line(line), group(group)
{
value = value_;
//check for \n at the end
if (value[value.size() - 1] == '\n')
value.erase(value.begin() + value.size() - 1);
}
public:
explicit Messages(const typeMessage type, const int line, const std::wstring &rus, const std::wstring &eng, const int group) :
Messages(type, line, (langOfMessages == 1) ? rus : eng, group)
{
engMessage = eng;
if (engMessage[engMessage.size() - 1] == '\n')
engMessage.erase(engMessage.begin() + engMessage.size() - 1);
}
std::wstring toString() const
{
std::wstring retVal = L"|";
retVal += std::to_wstring((int)type) + L" ";
retVal += std::to_wstring(line) + L" ";
retVal += std::to_wstring(group);
retVal += L"|" + value;
return retVal;
}
std::string getString() const { return std::string(engMessage.begin(), engMessage.end()); }
public:
typeMessage type;
int group;
int line;
std::wstring value;
std::wstring engMessage;
};
// from Utils.cpp
#ifdef _WIN32
extern void printStackTrace();
#else
static void printStackTrace() { };
#endif
#if __SPC
#define printInternalError(file, line) do {\
char buf[512];\
sprintf(buf, "Internal error at line %d and file %s\n", line, file);\
addToGlobalBufferAndPrint(buf);\
throw(-1);\
} while (0)
#else
#define printInternalError(file, line) do {\
printStackTrace(); \
char buf[512];\
sprintf(buf, "Internal error at line %d and file %s\n", line, file);\
addToGlobalBufferAndPrint(buf);\
\
if (SgStatement::getCurrProcessFile() != "" && SgStatement::getCurrProcessLine() != -1)\
{ \
sprintf(buf, "Internal error in user code at line %d and file %s\n", SgStatement::getCurrProcessLine(), SgStatement::getCurrProcessFile().c_str());\
addToGlobalBufferAndPrint(buf);\
} \
throw(-1);\
} while (0)
#endif
#define checkNull(address, file, line) do { \
if ((address) == NULL) \
printInternalError(file, line); \
} while (0)
//TODO: count of string len of all parameters
#define allocAndPrint(buf, format, ...) do { \
const int bufLen = 32 * 1024 * 1024;\
buf = new char[bufLen];\
const int countW = sprintf(buf, format, ##__VA_ARGS__);\
if (countW + 1 > bufLen) \
{ \
delete []buf; \
printInternalError(__FILE__, __LINE__);\
} \
} while (0)
#ifdef _WIN32
#define allocAndPrintLong(buf, format, ...) do { \
const int bufLen = 32 * 1024 * 1024;\
buf = new wchar_t[bufLen];\
const int countW = swprintf(buf, format, ##__VA_ARGS__);\
if (countW + 1 > bufLen) \
{ \
delete []buf; \
printInternalError(__FILE__, __LINE__);\
} \
} while (0)
#else
#define allocAndPrintLong(buf, format, ...) do { \
const int bufLen = 32 * 1024 * 1024;\
buf = new wchar_t[bufLen];\
const int countW = swprintf(buf, bufLen, format, ##__VA_ARGS__);\
if (countW + 1 > bufLen) \
{ \
delete []buf; \
printInternalError(__FILE__, __LINE__);\
} \
} while (0)
#endif
#define __spf_printToBuf(outval, format, ...) do {\
char *buf = NULL; \
allocAndPrint(buf, format, ##__VA_ARGS__); \
outval = std::string(buf);\
delete []buf;\
} while (0)
#define __spf_printToLongBuf(outval, format, ...) do {\
wchar_t *buf = NULL; \
allocAndPrintLong(buf, fixedLongFormat(format).c_str(), ##__VA_ARGS__); \
outval = std::wstring(buf);\
delete []buf;\
} while (0)
#define __spf_print(needPrint, format, ...) do {\
if (needPrint == 1) {\
char *buf = NULL; \
allocAndPrint(buf, format, ##__VA_ARGS__); \
addToGlobalBufferAndPrint(buf);\
delete []buf;\
} \
} while (0)
// Свободный - R206
// Гайд по русификации сообщений: При добавлении нового сообщения, меняется последний сводобный идентификатор.
// В этом файле остаются только спецификаторы, для которых будет заполнен текст. Полный текст пишется в файле
// russian_errors_text.txt. Спецификаторы там тоже сохраняются, по ним в визуализаторе будет восстановлен
// закодированный текст.
//russian messages
//1001
static const wchar_t *R1 = L"R1:%ls#%ls#%ls";
static const wchar_t *RR1_1 = L"RR1_1:";
static const wchar_t *RR1_2 = L"RR1_2:";
static const wchar_t *RR1_3 = L"RR1_3:";
static const wchar_t *RR1_4 = L"RR1_4:";
static const wchar_t *RR1_5 = L"RR1_5:";
static const wchar_t *RR1_6 = L"RR1_6:";
static const wchar_t *RR1_7 = L"RR1_7:";
static const wchar_t *RR1_8 = L"RR1_8:";
static const wchar_t *R2 = L"R2:";
static const wchar_t *R3 = L"R3:";
static const wchar_t *R4 = L"R4:%s";
static const wchar_t *R5 = L"R5:%s";
static const wchar_t *R6 = L"R6:%s";
static const wchar_t *R7 = L"R7:";
static const wchar_t *R8 = L"R8:";
static const wchar_t *R9 = L"R9:";
static const wchar_t *R10 = L"R10:%s";
static const wchar_t *R11 = L"R11:%s";
static const wchar_t *R12 = L"R12:";
static const wchar_t *R13 = L"R13:";
static const wchar_t *R14 = L"R14:";
static const wchar_t *R15 = L"R15:";
static const wchar_t *R16 = L"R16:";
static const wchar_t *R17 = L"R17:";
static const wchar_t *R18 = L"R18:";
static const wchar_t *R19 = L"R19:%d#%d";
static const wchar_t *R20 = L"R20:";
//1002
static const wchar_t *R21 = L"R21:%s";
static const wchar_t *R22 = L"R22:%s";
//1003
static const wchar_t *R23 = L"R23:%s";
static const wchar_t *R24 = L"R24:%s";
//1004
static const wchar_t *R25 = L"R25:%s#%d";
//1005
static const wchar_t *R26 = L"R26:%s";
//1006
static const wchar_t *R27 = L"R27:%s";
static const wchar_t *R28 = L"R28:%s";
static const wchar_t *R29 = L"R29:%s";
//1007
static const wchar_t *R30 = L"R30:";
//1008
static const wchar_t *R31 = L"R31:%s#%d#%d";
static const wchar_t *R32 = L"R32:%s#%d#%d";
//1009
static const wchar_t *R33 = L"R33:%s";
static const wchar_t *R34 = L"R34:%s";
//1010
static const wchar_t *R35 = L"R35:";
//1011
static const wchar_t *R36 = L"R36:%s";
//1012
static const wchar_t *R37 = L"R37:%s";
static const wchar_t *R149 = L"R149:%s";
//1013
static const wchar_t *R38 = L"R38:%s";
static const wchar_t *R39 = L"R39:%s#%s#%s#%s#%d#%s";
static const wchar_t *R40 = L"R40:%s";
static const wchar_t *R41 = L"R41:%s#%s#%d#%s";
static const wchar_t *R42 = L"R42:%s#%s#%ls";
static const wchar_t *RR42_1 = L"RR42_1:";
static const wchar_t *RR42_2 = L"RR42_2:";
static const wchar_t *R43 = L"R43:%s#%s#%d#%d";
static const wchar_t *R44 = L"R44:%s#%s";
static const wchar_t *R45 = L"R45:%s#%d#%d";
//1014
static const wchar_t *R46 = L"R46:%s";
//1015
static const wchar_t *R47 = L"R47:";
//1016
static const wchar_t *R48 = L"R48:%s";
//1017
static const wchar_t *R49 = L"R49:%s";
//1018
static const wchar_t *R50 = L"R50:";
static const wchar_t *R51 = L"R51:";
//1019
static const wchar_t *R52 = L"R52:%s";
//1020
static const wchar_t *R53 = L"R53:";
//1021
static const wchar_t *R54 = L"R54:%s";
static const wchar_t *R55 = L"R55:%s#%d";
//1022
static const wchar_t *R56 = L"R56:%s";
//1023
static const wchar_t *R57 = L"R57:%s";
//1024
static const wchar_t *R58 = L"R58:%s";
//1025
static const wchar_t *R59 = L"R59:%s";
//1026
static const wchar_t *R60 = L"R60:%s";
static const wchar_t *R61 = L"R61:%s";
//1027
static const wchar_t *R179 = L"R179:";
//1028
static const wchar_t *R62 = L"R62:%s";
//1029 && 1030
static const wchar_t *R158 = L"R158:%s";
static const wchar_t *R159 = L"R159:%s";
static const wchar_t *R160 = L"R160:%s";
static const wchar_t *R161 = L"R161:%s";
static const wchar_t *R162 = L"R162:%s";
static const wchar_t *R163 = L"R163:%s";
static const wchar_t *RR158_1 = L"RR158_1:";
//1031
static const wchar_t *R63 = L"R63:%s#%d";
//1032
static const wchar_t *R64 = L"R64:%s#%s";
//1033
static const wchar_t *R65 = L"R65:%s#%s";
//1034
static const wchar_t *R66 = L"R66:%s#%s";
//1035
//--- TODO
//1036
static const wchar_t *R67 = L"R67:";
//1037
static const wchar_t *R68 = L"R68:%s";
//1038
static const wchar_t *R69 = L"R69:";
static const wchar_t *R70 = L"R70:";
//1039
static const wchar_t *R71 = L"R71:%s#%s#%s#%s#%d#%s#%d";
//1040
static const wchar_t *R72 = L"R72:%d#%s#%s";
static const wchar_t *R73 = L"R73:%s#%s";
//1041
static const wchar_t *R74 = L"R74:%s";
//1042
static const wchar_t *R75 = L"R75:%s#%s";
//1043
static const wchar_t *R76 = L"R76:";
static const wchar_t *R77 = L"R77:%d#%d#%d";
static const wchar_t *R78 = L"R78:%s#%d";
//1044
static const wchar_t *R79 = L"R79:";
static const wchar_t *R80 = L"R80:";
//1045
static const wchar_t *R81 = L"R81:%s#%s";
//1046
static const wchar_t *R82 = L"R82:%s";
static const wchar_t *R83 = L"R83:%s";
static const wchar_t *R84 = L"R84:%s";
//1047
static const wchar_t *R85 = L"R85:%d#%s";
static const wchar_t *R86 = L"R86:%s";
static const wchar_t *R87 = L"R87:%s";
static const wchar_t *R88 = L"R88:%s";
static const wchar_t *R89 = L"R89:%s";
static const wchar_t *R90 = L"R90:%s";
static const wchar_t *R91 = L"R91:%s";
static const wchar_t *R164 = L"R164:%s";
//1048
static const wchar_t *R92 = L"R92:%s#%s#%d#%s#%d";
//1049
static const wchar_t *R93 = L"R93:";
//1050
static const wchar_t *R146 = L"R146:";
static const wchar_t *R147 = L"R147:";
//1051
static const wchar_t *R148 = L"R148:";
//1052
static const wchar_t *R150 = L"R150:";
//1053
static const wchar_t *R154 = L"R154:%s";
//1054
static const wchar_t *R155 = L"R155:%s#%d#%d#%s";
//1055
static const wchar_t *R156 = L"R156:%d#%s#%s";
//1056
static const wchar_t *R157 = L"R157:%s#%s";
//1057
static const wchar_t *R175 = L"R175:%s";
//1058
static const wchar_t *R176 = L"R176:";
//1059
static const wchar_t *R182 = L"R176:%s";
//1060
static const wchar_t *R183 = L"R183:";
//1061
static const wchar_t *R184 = L"R184:%s";
//1062
static const wchar_t* R205 = L"R205:%s#%s";
//2001
static const wchar_t *R94 = L"R94:";
static const wchar_t *R95 = L"R95:";
//2002
static const wchar_t *R96 = L"R96:";
static const wchar_t *R97 = L"R97:";
//2003
static const wchar_t *R98 = L"R98:";
//2004
static const wchar_t *R99 = L"R99:";
//2005
static const wchar_t *R100 = L"R100:%d#%d";
//2006
static const wchar_t *R101 = L"R101:%s";
//2007
static const wchar_t *R102 = L"R102:";
static const wchar_t *R103 = L"R103:";
//2008
// -- TODO
//2009
static const wchar_t *R104 = L"R104:%s";
//2010
static const wchar_t *R105 = L"R105:";
static const wchar_t *R106 = L"R106:";
static const wchar_t *R107 = L"R107:";
//2011
static const wchar_t *R177 = L"R177:";
//2012
static const wchar_t *R173 = L"R173:";
//2013
static const wchar_t *R174 = L"R174:%s";
//2014
static const wchar_t *R180 = L"R180:%s#%s";
//2015
static const wchar_t *R185 = L"R185:";
static const wchar_t *R186 = L"R186:";
static const wchar_t *R187 = L"R187:";
static const wchar_t *R195 = L"R195:";
//2016
static const wchar_t *R188 = L"R188:%s";
//2017
static const wchar_t *R189 = L"R189:%s";
static const wchar_t *R190 = L"R190:%s#%s";
//2018
static const wchar_t *R191 = L"R191:%s";
static const wchar_t *R201 = L"R201:%s";
//2019
static const wchar_t *R192 = L"R192:%s#%s#%s";
//2020
static const wchar_t *R193 = L"R193:";
//2021
static const wchar_t *R194 = L"R194:%s";
//2022
static const wchar_t *R196 = L"R196:";
//2023
static const wchar_t *R197 = L"R197:";
//2024
static const wchar_t *R198 = L"R198:%s";
//2025
static const wchar_t *R203 = L"R203:%s#%s";
//3001
static const wchar_t *R108 = L"R108:%s";
//3002
static const wchar_t *R109 = L"R109:%s#%d";
static const wchar_t *R200 = L"R200:%s#%d";
//3003
static const wchar_t *R110 = L"R110:%s#%s#%d";
//3004
static const wchar_t *R111 = L"R111:%s";
//3005
static const wchar_t *R112 = L"R112:%s";
//3006
static const wchar_t *R113 = L"R113:";
static const wchar_t *R114 = L"R114:";
static const wchar_t *R115 = L"R115:";
static const wchar_t *R116 = L"R116:";
static const wchar_t *R117 = L"R117:";
static const wchar_t *R118 = L"R118:";
static const wchar_t *R119 = L"R119:";
static const wchar_t *R120 = L"R120:";
static const wchar_t *R121 = L"R121:";
static const wchar_t *R122 = L"R122:";
static const wchar_t *R123 = L"R123:";
static const wchar_t *R124 = L"R124:%s#%s#%d#%s#%d#%d";
static const wchar_t *R125 = L"R124:%s#%s#%d#%s#%d";
static const wchar_t *R144 = L"R144:";
static const wchar_t *R145 = L"R145:";
static const wchar_t *R178 = L"R178:";
static const wchar_t *R199 = L"R199:";
//3007
static const wchar_t *R126 = L"R126:%s#%d#%d";
static const wchar_t *R127 = L"R127:";
//3008
static const wchar_t *R128 = L"R128:";
//3009
static const wchar_t *R129 = L"R129:%s";
//3010
static const wchar_t *R130 = L"R130:";
static const wchar_t *R131 = L"R131:";
//3011
static const wchar_t *R132 = L"R132:%s#%s";
//3012
static const wchar_t *R133 = L"R133:%s#%s";
//3013
static const wchar_t *R134 = L"R134:%s#%s";
static const wchar_t *R152 = L"R152:%s#%s";
//3014
static const wchar_t *R135 = L"R135:%s#%s";
//3015
static const wchar_t *R136 = L"R136:%s";
//3016
static const wchar_t *R137 = L"R137:";
//3017
static const wchar_t *R138 = L"R138:%s#%s";
//3018
static const wchar_t *R139 = L"R139:%s#%s";
//3019
//--- TODO предиктор
//3020
static const wchar_t *R140 = L"R140:%s";
static const wchar_t *R141 = L"R141:%s";
static const wchar_t *R153 = L"R153:%s";
static const wchar_t *R142 = L"R142:%s";
//3021
static const wchar_t *R151 = L"R151:";
//3022
static const wchar_t *R171 = L"R171:%s";
//3023
static const wchar_t *R202 = L"R202:%s";
//3024
static const wchar_t* R204 = L"R204:";
//4001
//---TODO ошибки из SAGE
//4002
static const wchar_t *R143 = L"R143:";
//5001
static const wchar_t *R165 = L"R165:";
//5002
static const wchar_t *R166 = L"R166:%s#%s";
//5003
static const wchar_t *R167 = L"R167:";
//5004
static const wchar_t *R168 = L"R168:%s#%s";
//5005
static const wchar_t *R169 = L"R169:";
//5006
static const wchar_t *R170 = L"R170:%s";
//5007
static const wchar_t *R172 = L"R172:%s";