예제 #1
0
                point_type make_point(const osmium::geom::Coordinates& xy) const {
                    std::string data;
                    header(data, wkbPoint, false);
                    str_push(data, xy.x);
                    str_push(data, xy.y);

                    if (m_out_type == out_type::hex) {
                        return convert_to_hex(data);
                    } else {
                        return data;
                    }
                }
예제 #2
0
 size_t header(std::string& str, wkbGeometryType type, bool add_length) const {
     str_push(str, wkb_byte_order_type::NDR);
     if (m_wkb_type == wkb_type::ewkb) {
         str_push(str, type | wkbSRID);
         str_push(str, srid);
     } else {
         str_push(str, type);
     }
     size_t offset = str.size();
     if (add_length) {
         str_push(str, static_cast<uint32_t>(0));
     }
     return offset;
 }
예제 #3
0
파일: extends.c 프로젝트: Alexey1994/Rocket
String* get_word(FILE *f, char *head, String *token)
{
    while(is_letter(*head) && !feof(f))
    {
        str_push(token, *head);
        *head=fgetc(f);
    }

    return token;
}
예제 #4
0
int main(void)
{
    int c;
    string str;
    if(str_new(&str, 255) == 0)
        return 1;
    while((c = getchar()) != EOF) {
        if(c == '\n'){
            sort(&str);
            printf("%s\n-----\n", str.str);
            str_clean(&str);
        } else
            str_push(&str, c);
    }
    return 0;
}
예제 #5
0
                size_t header(std::string& str, wkbGeometryType type, bool add_length) const {
#if __BYTE_ORDER == __LITTLE_ENDIAN
                    str_push(str, wkb_byte_order_type::NDR);
#else
                    str_push(str, wkb_byte_order_type::XDR);
#endif
                    if (m_wkb_type == wkb_type::ewkb) {
                        str_push(str, type | wkbSRID);
                        str_push(str, srid);
                    } else {
                        str_push(str, type);
                    }
                    size_t offset = str.size();
                    if (add_length) {
                        str_push(str, static_cast<uint32_t>(0));
                    }
                    return offset;
                }
예제 #6
0
파일: out.c 프로젝트: Alexey1994/Zubr
char* get_string_translator_parser(TranslatorParser *parser)
{
    String *string=str_init("");
    char   *returned_string;

    get_byte_translator_parser(parser);

    while(parser->head!='\'' && !parser->end_data)
    {
        if(parser->head=='\\')
        {
            get_byte_translator_parser(parser);

            switch(parser->head)
            {
                case 'n':  str_push(string, '\n'); break;
                case 'r':  str_push(string, '\r'); break;
                case 't':  str_push(string, '\t'); break;
                case '\\': str_push(string, '\\'); break;
                case '\'': str_push(string, '\''); break;
            }
        }
        else
            str_push(string, parser->head);

        get_byte_translator_parser(parser);
    }

    if(parser->head!='\'')
    {
        printf("отсутствует закрывающая '\n");
        return 0;
    }

    get_byte_translator_parser(parser);

    returned_string=string->begin;
    free(string);
    return returned_string;
}
예제 #7
0
 void multipolygon_add_location(const osmium::geom::Coordinates& xy) {
     str_push(m_data, xy.x);
     str_push(m_data, xy.y);
     ++m_points;
 }
예제 #8
0
 void multipolygon_inner_ring_start() {
     ++m_rings;
     m_points = 0;
     m_ring_size_offset = m_data.size();
     str_push(m_data, static_cast<uint32_t>(0));
 }
예제 #9
0
 void linestring_add_location(const osmium::geom::Coordinates& xy) {
     str_push(m_data, xy.x);
     str_push(m_data, xy.y);
 }
예제 #10
0
/** Lexikalni analyzator
 *
 * @param string slozi k navratu identifikatoru a cisel
 * vraci ciselnou reprezentaci tokenu
 */
static inline int get_token__(void)
{
    static int c;
    static int state = FSM_READ;

    int num = 0;

    // buffer se musi vyprazdnit
    str_clean(&str);

    for(;;) {

        switch(state) {
        // nacitani znaku
        case FSM_READ:
            c = fgetc(input);
        // nekdy byva potreba nacteni znaku preskocit
        case FSM_START:
            if(isspace(c)) {
                state = FSM_READ;
                if(c == '\n')
                    ++line;
            }
            else if(isalpha(c) || c == '_')
                state = FSM_IDENTIFIER;
            else if(isdigit(c))
                state = FSM_NUMBER;
            else if(c == '+') {
                state = FSM_READ;
                return PLUS;
            }
            else if(c == '*') {
                state = FSM_READ;
                return MUL;
            }
            else if(c == '/') {
                state = FSM_READ;
                return DIV;
            }
            else if(c == '.')
                state = FSM_DOT;
            else if(c == '<')
                state = FSM_LESS;
            else if(c == '>')
                state = FSM_GREAT;
            else if(c == '~')
                state = FSM_NOT_EQUALS;
            else if(c == '^') {
                state = FSM_READ;
                return POWER;
            }
            else if(c == '(') {
                state = FSM_READ;
                return LBRAC;
            }
            else if(c == ')') {
                state = FSM_READ;
                return RBRAC;
            }
            else if(c == ',') {
                state = FSM_READ;
                return COMMA;
            }
            else if(c == '-')
                state = FSM_DASH;
            else if(c == '=')
                state = FSM_EQUALS;
            else if(c == '"')
                state = FSM_STRING;
            else if(c == ';') {
                state = FSM_READ;
                return SEMICOLON;
            }
            else if(c == EOF)
                return NOTHING;
            else {
                state = FSM_READ;
                return ERROR_LEX_UX_CHAR;
            }
            break;

        case FSM_IDENTIFIER:
            str_push(&str, c);
            c = fgetc(input);
            if(! (isalnum(c) || c == '_')) {
                state = FSM_START;
                return check_keyword(&str); // kontrola klicovych slov
            }
            break;

        case FSM_NUMBER:
            str_push(&str, c);
            c = fgetc(input);
            if(isdigit(c))
                ;
            else if(c == '.')
                state = FSM_FLOAT0;
            else if(c == 'E' || c == 'e')
                state = FSM_EXP_E;
            else {
                state = FSM_START;
                return NUMBER;
            }
            break;

        case FSM_FLOAT0:
            str_push(&str, c);
            c = fgetc(input);
            if(isdigit(c))
                state = FSM_FLOAT;
            else {
                state = FSM_START;
                return ERROR_LEX_NUMBER;
            }
            break;

        case FSM_FLOAT:
            str_push(&str, c);
            c = fgetc(input);
            if(isdigit(c))
                ;
            else if(c == 'E' || c == 'e')
                state = FSM_EXP_E;
            else {
                state = FSM_START;
                return NUMBER;
            }
            break;

        case FSM_EXP_E:
            str_push(&str, c);
            c = fgetc(input);
            if(c == '+' || c == '-')
                state = FSM_EXP0;
            else if (isdigit(c))
                state = FSM_EXP;
            else {
                state = FSM_START;
                return ERROR_LEX_NUMBER;
            }
            break;

        case FSM_EXP0:
            str_push(&str, c);
            c = fgetc(input);
            if(isdigit(c))
                state = FSM_EXP;
            else {
                state = FSM_START;
                return ERROR_LEX_NUMBER;
            }
            break;


        case FSM_EXP:
            str_push(&str, c);
            c = fgetc(input);
            if(! isdigit(c)) {
                state = FSM_START;
                return NUMBER;
            }
            break;

// NOTE: Zminit v dokumentaci, ze jsme zakazali primo vkladat ridici znaky ASCII do retezcu

        case FSM_STRING:
            c = fgetc(input);
            if(c < ASCII_CONTROLL) {
                state = FSM_START;
                return ERROR_LEX_UX_CHAR;
            } else if(c == '\\')
                state = FSM_ESCAPE;
            else if(c == '"') {
                state = FSM_READ;
                return STRING;
            } else
                str_push(&str, c);
            break;

        case FSM_ESCAPE:
            c = fgetc(input);
            if(c == 'n') {
                state = FSM_STRING;
                str_push(&str, '\n');
            } else if(c == 't') {
                state = FSM_STRING;
                str_push(&str, '\t');
            } else if(c == '\\' || c == '"') {
                state = FSM_STRING;
                str_push(&str, c);
            } else if(isdigit(c))
                state = FSM_ESCAPE_NUM;
            else {
                state = FSM_START;
                return ERROR_LEX_ESC_SEC;
            }
            break;

        case FSM_ESCAPE_NUM:
            num = c - '0';
            c = fgetc(input);
            if(isdigit(c)) {
                num = num * 10 + c - '0';
                state = FSM_ESCAPE_NUM2;
            }
            else {
                state = FSM_START;
                return ERROR_LEX_ESC_SEC;
            }
            break;

        case FSM_ESCAPE_NUM2:
            c = fgetc(input);
            if(isdigit(c)) {
                num = num * 10 + c - '0';
                if(num > 0 && num < 256) {
                    str_push(&str, num);
                    state = FSM_STRING;
                } else {
                    state = FSM_START;
                    return ERROR_LEX_ESC_SEC;
                }
            } else {
                state = FSM_START;
                return ERROR_LEX_ESC_SEC;
            }
            break;

        case FSM_DASH:
            c = fgetc(input);
            if(c == '-')
                state = FSM_DASH2;
            else {
                state = FSM_START;
                return MINUS;
            }
            break;

        case FSM_DASH2:
            c = fgetc(input);
            if(c == '[')
                state = FSM_DASH2B;
            else if(c == '\n')
                state = FSM_READ;
            else
                state = FSM_COMMENT_LINE;
            break;

        case FSM_DASH2B:
            c = fgetc(input);
            if(c == '[')
                state = FSM_COMMENT_BLOCK;
            else
                state = FSM_COMMENT_LINE;
            break;

        case FSM_COMMENT_LINE:
            c = fgetc(input);
            if(c == '\n') {
                state = FSM_READ;
                ++line;
            } else if(c == EOF)
                return NOTHING;
            break;

        case FSM_COMMENT_BLOCK:
            c = fgetc(input);
            if(c == ']')
                state = FSM_COMMENT_BLOCK_END;
            else if(c == '\n')
                ++line;
            else if(c == EOF)
                return ERROR_LEX_X_CMNT_END;
            break;

        case FSM_COMMENT_BLOCK_END:
            c = fgetc(input);
            if(c == ']')
                state = FSM_READ;
            else {
                state = FSM_COMMENT_BLOCK;
                if(c == '\n')
                    ++line;
            }
            break;

        case FSM_EQUALS:
            c = fgetc(input);
            if(c == '=') {
                state = FSM_READ;
                return EQUAL;
            } else {
                state = FSM_START;
                return ASSIGN;
            }
            break;

        case FSM_DOT:
            c = fgetc(input);
            if(c == '.') {
                state = FSM_READ;
                return STRCONCAT;
            } else {
                state = FSM_START;
                return ERROR_LEX_UX_CHAR;
            }
            break;

        case FSM_LESS:
            c = fgetc(input);
            if(c == '=') {
                state = FSM_READ;
                return LESS_EQ;
            } else {
                state = FSM_START;
                return LESS;
            }
            break;

        case FSM_GREAT:
            c = fgetc(input);
            if(c == '=') {
                state = FSM_READ;
                return GREAT_EQ;
            } else {
                state = FSM_START;
                return GREAT;
            }
            break;

        case FSM_NOT_EQUALS:
            c = fgetc(input);
            if(c == '=') {
                state = FSM_READ;
                return NOT_EQUAL;
            } else {
                state = FSM_START;
                return ERROR_LEX_UX_CHAR;
            }
            break;

#ifdef DEBUG
        // konecny automat by nemel vypadnout do jineho stavu
        default:
            assert(0);
            break;
#endif
        } /* switch */
    } /* for */
}