int check_branch(ast::Branch* branch) { assert(branch != nullptr); auto cond = branch->condition.get(); check_operation(cond); check_coercion(cond->type, ast::types::Bool, "condition", branch->id); check_body(branch->then_); check_body(branch->else_); return EXIT_SUCCESS; }
int check_while(ast::While* whil) { assert(whil != nullptr); auto cond = whil->condition.get(); check_operation(cond); check_coercion(cond->type, ast::types::Bool, "condition", whil->id); check_body(whil->body); return EXIT_SUCCESS; }
void HTTP::update_state() { if (state == 0 && text.find("\r\n") != std::string::npos) { state = FIRSTLINE; parse_first_line(); } if (state == FIRSTLINE && (body_start == 0 || body_start == std::string::npos)) { body_start = text.find("\r\n\r\n"); } if (state == FIRSTLINE && body_start != std::string::npos && body_start != 0) { state = HEADERS; body_start += 4; parse_headers(); } if (state >= HEADERS) { check_body(); } }
int check_func(ast::Func* func) { assert(func != nullptr); for (auto it = func->arguments.begin(); it != func->arguments.end(); ++it) { declare_variable(*it); } // Allocate memory on stack for local variables for (auto it = func->local_variables.begin(); it != func->local_variables.end(); ++it) { declare_variable(*it); } this->current_function = func; check_body(func->body); // TODO: check for return value? auto return_ = std::make_shared<ast::Return>(); return_->value = std::make_shared<ast::Constant>(default_value_for(func->return_value)); func->body.push_back(return_); this->current_function = nullptr; variables.clear(); return EXIT_SUCCESS; }
void belle_sip_channel_parse_stream(belle_sip_channel_t *obj, int end_of_stream){ int offset; size_t read_size=0; int num; while ((num=(obj->input_stream.write_ptr-obj->input_stream.read_ptr))>0){ if (obj->input_stream.state == WAITING_MESSAGE_START) { int i; /*first, make sure there is \r\n in the buffer, otherwise, micro parser cannot conclude, because we need a complete request or response line somewhere*/ for (i=0;i<num-1;i++) { if ((obj->input_stream.read_ptr[i]=='\r' && obj->input_stream.read_ptr[i+1]=='\n') || belle_sip_channel_input_stream_get_buff_length(&obj->input_stream) <= 1 /*1 because null terminated*/ /*if buffer full try to parse in any case*/) { /*good, now we can start searching for request/response*/ if ((offset=get_message_start_pos(obj->input_stream.read_ptr,num)) >=0 ) { /*message found !*/ if (offset>0) { belle_sip_warning("trashing [%i] bytes in front of sip message on channel [%p]",offset,obj); obj->input_stream.read_ptr+=offset; } obj->input_stream.state=MESSAGE_AQUISITION; } else { belle_sip_debug("Unexpected [%s] received on channel [%p], trashing",obj->input_stream.read_ptr,obj); obj->input_stream.read_ptr=obj->input_stream.write_ptr; belle_sip_channel_input_stream_reset(&obj->input_stream); continue; } break; } } if (i >= num-1) { belle_sip_debug("[%s] received on channel [%p], cannot determine if expected or not, waiting for new data",obj->input_stream.read_ptr,obj); break; } } if (obj->input_stream.state==MESSAGE_AQUISITION) { /*search for \r\n\r\n*/ char* end_of_message=NULL; if ((end_of_message=strstr(obj->input_stream.read_ptr,"\r\n\r\n"))){ int bytes_to_parse; char tmp; /*end of message found*/ end_of_message+=4;/*add \r\n\r\n*/ bytes_to_parse=end_of_message-obj->input_stream.read_ptr; tmp=*end_of_message; *end_of_message='\0';/*this is in order for the following log to print the message only to its end.*/ /*belle_sip_message("channel [%p] read message of [%i] bytes:\n%.40s...",obj, bytes_to_parse, obj->input_stream.read_ptr);*/ obj->input_stream.msg=belle_sip_message_parse_raw(obj->input_stream.read_ptr ,bytes_to_parse ,&read_size); *end_of_message=tmp; obj->input_stream.read_ptr+=read_size; if (obj->input_stream.msg && read_size > 0){ belle_sip_message("channel [%p] [%i] bytes parsed",obj,(int)read_size); belle_sip_object_ref(obj->input_stream.msg); if (belle_sip_message_is_request(obj->input_stream.msg)) fix_incoming_via(BELLE_SIP_REQUEST(obj->input_stream.msg),obj->current_peer); /*check for body*/ if (check_body(obj)){ obj->input_stream.state=BODY_AQUISITION; } else { /*no body*/ belle_sip_channel_message_ready(obj); continue; } }else{ belle_sip_error("Could not parse [%s], on channel [%p] skipping to [%s]",obj->input_stream.read_ptr ,obj ,end_of_message); obj->input_stream.read_ptr=end_of_message; obj->input_stream.state=WAITING_MESSAGE_START; continue; } }else break; /*The message isn't finished to be receive, we need more data*/ } if (obj->input_stream.state==BODY_AQUISITION) { if (acquire_body(obj,end_of_stream)==BELLE_SIP_STOP) break; } } }