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; } }
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; }
String* get_word(FILE *f, char *head, String *token) { while(is_letter(*head) && !feof(f)) { str_push(token, *head); *head=fgetc(f); } return token; }
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; }
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; }
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; }
void multipolygon_add_location(const osmium::geom::Coordinates& xy) { str_push(m_data, xy.x); str_push(m_data, xy.y); ++m_points; }
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)); }
void linestring_add_location(const osmium::geom::Coordinates& xy) { str_push(m_data, xy.x); str_push(m_data, xy.y); }
/** 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 */ }