Ignore:
Timestamp:
Feb 8, 2018, 3:25:00 PM (22 months ago)
Author:
matszpk
Message:

CLRadeonExtender: ROCm: Add handling of the YAML type specifiers.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • CLRadeonExtender/trunk/amdbin/ROCmBinaries.cpp

    r3738 r3758  
    113113}
    114114
     115enum class YAMLValType
     116{
     117    NONE,
     118    NIL,
     119    BOOL,
     120    INT,
     121    FLOAT,
     122    STRING,
     123    SEQ
     124};
     125
     126static YAMLValType parseYAMLType(const char*& ptr, const char* end, size_t lineNo)
     127{
     128    if (ptr+2>end || *ptr!='!' || ptr[1]!='!')
     129        return YAMLValType::NONE; // no type
     130    if (ptr+7 && ::strncmp(ptr+2, "null", 4)==0 && isSpace(ptr[6]) && ptr[6]!='\n')
     131    {
     132        ptr += 6;
     133        return YAMLValType::NIL;
     134    }
     135    else if (ptr+7 && ::strncmp(ptr+2, "bool", 4)==0 && isSpace(ptr[6]) && ptr[6]!='\n')
     136    {
     137        ptr += 6;
     138        return YAMLValType::BOOL;
     139    }
     140    else if (ptr+6 && ::strncmp(ptr+2, "int", 3)==0 && isSpace(ptr[5]) && ptr[5]!='\n')
     141    {
     142        ptr += 5;
     143        return YAMLValType::INT;
     144    }
     145    else if (ptr+8 && ::strncmp(ptr+2, "float", 5)==0 && isSpace(ptr[7]) && ptr[7]!='\n')
     146    {
     147        ptr += 7;
     148        return YAMLValType::FLOAT;
     149    }
     150    else if (ptr+6 && ::strncmp(ptr+2, "str", 3)==0 && isSpace(ptr[5]) && ptr[5]!='\n')
     151    {
     152        ptr += 5;
     153        return YAMLValType::STRING;
     154    }
     155    else if (ptr+6 && ::strncmp(ptr+2, "seq", 3)==0 && isSpace(ptr[5]) && ptr[5]!='\n')
     156    {
     157        ptr += 5;
     158        return YAMLValType::SEQ;
     159    }
     160    throw ParseException(lineNo, "Unknown YAML value type");
     161}
     162
    115163// parse YAML key (keywords - recognized keys)
    116164static size_t parseYAMLKey(const char*& ptr, const char* end, size_t lineNo,
     
    145193    if (ptr == end || *ptr=='\n')
    146194        throw ParseException(lineNo, "Expected integer value");
     195   
     196    // skip !!int
     197    YAMLValType valType = parseYAMLType(ptr, end, lineNo);
     198    if (valType == YAMLValType::INT)
     199    {   // if
     200        skipSpacesToLineEnd(ptr, end);
     201        if (ptr == end || *ptr=='\n')
     202            throw ParseException(lineNo, "Expected integer value");
     203    }
     204    else if (valType != YAMLValType::NONE)
     205        throw ParseException(lineNo, "Expected value of integer type");
     206   
    147207    T value = 0;
    148208    try
     
    163223    if (ptr == end || *ptr=='\n')
    164224        throw ParseException(lineNo, "Expected boolean value");
     225   
     226    // skip !!bool
     227    YAMLValType valType = parseYAMLType(ptr, end, lineNo);
     228    if (valType == YAMLValType::BOOL)
     229    {   // if
     230        skipSpacesToLineEnd(ptr, end);
     231        if (ptr == end || *ptr=='\n')
     232            throw ParseException(lineNo, "Expected boolean value");
     233    }
     234    else if (valType != YAMLValType::NONE)
     235        throw ParseException(lineNo, "Expected value of boolean type");
    165236   
    166237    const char* wordPtr = ptr;
     
    327398    if (ptr == end)
    328399        return "";
     400   
     401    // skip !!str
     402    YAMLValType valType = parseYAMLType(ptr, end, lineNo);
     403    if (valType == YAMLValType::STRING)
     404    {   // if
     405        skipSpacesToLineEnd(ptr, end);
     406        if (ptr == end)
     407            return "";
     408    }
     409    else if (valType != YAMLValType::NONE)
     410        throw ParseException(lineNo, "Expected value of string type");
     411   
    329412    std::string buf;
    330413    if (*ptr=='"' || *ptr== '\'')
     
    441524        return;
    442525   
     526    // skip !!int
     527    YAMLValType valType = parseYAMLType(ptr, end, lineNo);
     528    if (valType == YAMLValType::SEQ)
     529    {   // if
     530        skipSpacesToLineEnd(ptr, end);
     531        if (ptr == end)
     532            return;
     533    }
     534    else if (valType != YAMLValType::NONE)
     535        throw ParseException(lineNo, "Expected value of sequence type");
     536   
    443537    if (*ptr == '[')
    444538    {
     
    597691{
    598692    skipSpacesToLineEnd(ptr, end);
     693    if (ptr+2 >= end && ptr[0]=='!' && ptr[1]=='!')
     694    {   // skip !!xxxxx
     695        ptr+=2;
     696        while (ptr!=end && isAlpha(*ptr)) ptr++;
     697        skipSpacesToLineEnd(ptr, end);
     698    }
     699   
    599700    if (ptr==end || (*ptr!='\'' && *ptr!='"' && *ptr!='|' && *ptr!='>' && *ptr !='[' &&
    600701                *ptr!='#' && *ptr!='\n'))
Note: See TracChangeset for help on using the changeset viewer.