在C++程序中添加逻辑流程控制
作者 佚名技术
来源 程序设计
浏览
发布时间 2012-06-30
<stdio.h> #include <string> using namespace std; class Url; void flow_read_domain(void*); void flow_read_host(void*); void flow_read_port(void*); void flow_read_host_port(void*); void flow_read_query_string(void*); void flow_read_param(void*); void flow_read_anchor(void*); class Url { public: Url() {} ~Url() {} string scheme, host, port, user, pass, uri, param, anchor; string* head_token; int last_pos, cur_pos; char* url; VFLOW_EVENT_DECLARE(cur_pos_changed); void parse_url(char* param) { VFLOW_EVENT_INITIALIZE(cur_pos_changed); url = param; int len = strlen(url); last_pos = 0; set_pos(0); head_token = NULL; analyze_url(); while (cur_pos < len) { set_pos(cur_pos+1); } if (head_token) *head_token = url + last_pos; VFLOW_TERMINATE(cur_pos_changed); uri = "/" + uri; } void set_pos(int pos) { cur_pos = pos; VFLOW_SIGNAL(cur_pos_changed); } void analyze_url() { VFLOW_START(::flow_read_domain, this); VFLOW_START(::flow_read_query_string, this); } void flow_read_domain() { read_to_tail(&scheme, "://"); VFLOW_START(::flow_read_host, this); VFLOW_START(::flow_read_port, this); VFLOW_START(::flow_read_host_port, this); } void flow_read_host() { read_to_tail(&host, "/"); } void flow_read_port() { read_from_head(&port, ":"); } void flow_read_host_port() { string tmp; read_from_head(&tmp, "@"); user = host; pass = port; host.erase(); port.erase(); read_from_head(&port, ":"); host = tmp; } void flow_read_query_string() { read_from_head(&uri, "/"); VFLOW_START(::flow_read_param, this); VFLOW_START(::flow_read_anchor, this); } void flow_read_param() { read_from_head(¶m, "?"); } void flow_read_anchor() { read_from_head(&anchor, "#"); } void read_to_tail(string* token, char* end_str) { head_token = token; while (1) { VFLOW_WAIT(cur_pos_changed); if (memcmp(url + cur_pos, end_str, strlen(end_str)) == 0) break; } head_token->assign(url + last_pos, cur_pos - last_pos); last_pos = cur_pos = cur_pos + strlen(end_str); head_token = NULL; } void read_from_head(string* token, char* start_str) { while (1) { VFLOW_WAIT(cur_pos_changed); if (memcmp(url + cur_pos, start_str, strlen(start_str)) == 0) break; } if (head_token) head_token->assign(url + last_pos, cur_pos - last_pos); head_token = token; last_pos = cur_pos + 1; } }; void flow_read_domain(void* param) { ((Url*)param)->flow_read_domain(); } void flow_read_host(void* param) { ((Url*)param)->flow_read_host(); } void flow_read_port(void* param) { ((Url*)param)->flow_read_port(); } void flow_read_host_port(void* param) { ((Url*)param)->flow_read_host_port(); } void flow_read_query_string(void* param) { ((Url*)param)->flow_read_query_string(); } void flow_read_param(void* param) { ((Url*)param)->flow_read_param(); } void flow_read_anchor(void* param) { ((Url*)param)->flow_read_anchor(); } int main(int argc, char* argv[]) { Url u |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |
你可能对下面的文章感兴趣
上一篇: 一步一步实现MFC扩展DLL中导出类和对话框下一篇: volatile关键字的说明以及测试
关于在C++程序中添加逻辑流程控制的所有评论