/* * Read a simple symbol * - the buffer must be empty * - current_char must be simple * - read the sequence of simple chars and add it to the buffer * * If the symbol is a reserved word, return the corresponding * token id. Otherwise, return SMT2_TK_SYMBOL. */ static smt2_token_t smt2_read_symbol(lexer_t *lex) { reader_t *rd; string_buffer_t *buffer; const keyword_t *kw; int c; smt2_token_t tk; rd = &lex->reader; buffer = lex->buffer; c = reader_current_char(rd); assert(string_buffer_length(buffer) == 0 && issimple(c)); do { string_buffer_append_char(buffer, c); c = reader_next_char(rd); } while (issimple(c)); string_buffer_close(buffer); tk = SMT2_TK_SYMBOL; kw = in_smt2_tk(buffer->data, buffer->index); if (kw != NULL) { tk = kw->tk; } return tk; }
bool isSelfIntersect(const vector<DjiPoint>& pts) { if (pts.size() <= 3) return false; POINT* _pts = new POINT[pts.size()]; for (int i = 0; i < (int)pts.size(); i++) { _pts[i] = pts[i]; } bool isSim= issimple(pts.size(),_pts); delete[] _pts; return !isSim; ///////*****************my code**********////// // vector<DjiLineSeq> seqs; // for (int i = 0; i < pts.size();i++) // { // seqs.push_back(DjiLineSeq(pts[i], pts[(i + 1) % pts.size()])); // } // for (int i = 0; i < seqs.size(); i++) // { // for (int j = i+1; j < seqs.size();j++) // { // if (isIntersectLineseq(seqs[i], seqs[j])) // return true; // } // } // return false; }
/* * Read a keyword: * - the buffer must be empty * - current_char must be ':' * - add ':' + the sequence of simple_chars that follows to the buffer * * If ':' is not followed by a simple char, return SMT2_TK_INVALID_KEYWORD * Otherwise return SMT2_TK_KEYWORD. */ static smt2_token_t smt2_read_keyword(lexer_t *lex) { reader_t *rd; string_buffer_t *buffer; int c; smt2_token_t tk; rd = &lex->reader; buffer = lex->buffer; c = reader_current_char(rd); assert(string_buffer_length(buffer) == 0 && c == ':'); do { string_buffer_append_char(buffer, c); c = reader_next_char(rd); } while (issimple(c)); string_buffer_close(buffer); tk = SMT2_TK_KEYWORD; if (string_buffer_length(buffer) <= 1) { tk = SMT2_TK_INVALID_KEYWORD; } return tk; }
/* * Read the next token and return its code tk * - set lex->token to tk * - set lex->tk_pos * - if the token is not '(' or ')', then its value is in lex->buffer * as a string */ smt2_token_t next_smt2_token(lexer_t *lex) { reader_t *rd; string_buffer_t *buffer; int c; smt2_token_t tk; rd = &lex->reader; c = reader_current_char(rd); buffer = lex->buffer; string_buffer_reset(buffer); // skip spaces and comments for (;;) { while (isspace(c)) c = reader_next_char(rd); if (c != ';') break; // comments: read everything until the end of the line or EOF do { c = reader_next_char(rd); } while (c != '\n' && c != EOF); } // record start of token lex->tk_pos = rd->pos; lex->tk_line = rd->line; lex->tk_column = rd->column; switch (c) { case '(': tk = SMT2_TK_LP; goto next_then_return; case ')': tk = SMT2_TK_RP; goto next_then_return; case EOF: tk = SMT2_TK_EOS; goto done; case '"': if (two_dot_five_variant) { tk = smt2_read_string_var(lex); } else { tk = smt2_read_string(lex); } goto done; case '#': string_buffer_append_char(buffer, c); c = reader_next_char(rd); if (c == 'b') { tk = smt2_read_binary(lex); } else if (c == 'x') { tk = smt2_read_hexa(lex); } else { tk = SMT2_TK_ERROR; string_buffer_close(buffer); } goto done; case '0': tk = smt2_read_number0(lex); goto done; case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': tk = smt2_read_number(lex); goto done; case ':': tk = smt2_read_keyword(lex); goto done; case '|': tk = smt2_read_quoted_symbol(lex); goto done; default: if (issimple(c)) { tk = smt2_read_symbol(lex); goto done; } else { tk = SMT2_TK_ERROR; /* * copy the bad character in buffer for * better error reporting */ string_buffer_append_char(buffer, c); string_buffer_close(buffer); goto next_then_return; } } next_then_return: reader_next_char(rd); done: lex->token = tk; return tk; }