📄 url.y
字号:
strcpy($$, "//"); strcat($$, $3); strcat($$, "@"); strcat($$, $5); } } ;service_id: _RESNAME { $$ = strdup($1); } ;ipx_site: _IPX { $$ = $1; } ;at_site: _AT _ZONE ':' _ZONE ':' _ZONE { if(NULL != ($$ = (char *)calloc(strlen($1) + strlen($2) + strlen($4) + strlen($6) + 3, sizeof(char)))) { strcpy($$, $1); strcat($$, $2); strcat($$, ":"); strcat($$, $4); strcat($$, ":"); strcat($$, $6); } } ;hostport: host { $$ = $1; } | host ':' _HEXDIG { if ($1 != NULL) { if(NULL != ($$ = (char *)calloc(strlen($1) + strlen($3) + 2, sizeof(char)))) { strcpy($$, $1); strcat($$, ":"); strcat($$, $3); } } else $$ = NULL; } ;host: _RESNAME { $$ = $1; } | _IPADDR { $$ = $1; } ;url_part: path_list { ; } | attr_list { ; } | path_list attr_list { ; } ;path_list: path_el { $$ = &pathHead; if ($1 != NULL) { _LSLP_INSERT_BEFORE($1, $$); } } | path_list path_el { $$ = &pathHead; if ($2 != NULL) { _LSLP_INSERT_BEFORE($2, $$); } } ;path_el: '/' { /* dangling path slash - do nothing */ $$ = NULL; } | '/' _ELEMENT { if(NULL != ($$ = (lslpAtomList *)calloc(1, sizeof(lslpAtomList)))) { $$->prev = $$->next = $$; if(NULL != ($$->str = (char *)calloc(1 + strlen($2), sizeof(char)))) { strcpy($$->str, $2); $$->hash = lslpCheckSum($$->str, (int16)strlen($$->str)); } else { free($$); $$ = NULL; } } } | '/' _RESNAME { if(NULL != ($$ = (lslpAtomList *)calloc(1, sizeof(lslpAtomList)))) { $$->prev = $$->next = $$; if(NULL != ($$->str = (char *)calloc(1 + strlen($2), sizeof(char)))) { strcpy($$->str, $2); $$->hash = lslpCheckSum($$->str, (int16)strlen($$->str)); } else { free($$); $$ = NULL; } } } | '/' _HEXDIG { if(NULL != ($$ = (lslpAtomList *)calloc(1, sizeof(lslpAtomList)))) { $$->prev = $$->next = $$; if(NULL != ($$->str = (char *)calloc(1 + strlen($2), sizeof(char)))) { strcpy($$->str, $2); $$->hash = lslpCheckSum($$->str, (int16)strlen($$->str)); } else { free($$); $$ = NULL; } } } ;attr_list: attr_el { $$ = &attrHead; if ($1 != NULL) { _LSLP_INSERT_BEFORE($1, $$); } } | attr_list attr_el { $$ = &attrHead; if ($2 != NULL) { _LSLP_INSERT_BEFORE($2, $$); } } ;attr_el: ';' _ELEMENT { if(NULL != ($$ = (lslpAtomList *)calloc(1, sizeof(lslpAtomList)))) { $$->prev = $$->next = $$; if(NULL != ($$->str = (char *)calloc(1 + strlen($2), sizeof(char)))) { strcpy($$->str, $2); $$->hash = lslpCheckSum($$->str, (int16)strlen($$->str)); } else { free($$); $$ = NULL; } } } | ';' _ELEMENT '=' _ELEMENT { if(NULL != ($$ = (lslpAtomList *)calloc(1, sizeof(lslpAtomList)))) { $$->prev = $$->next = $$; if(NULL != ($$->str = (char *)calloc(2 + strlen($2) + strlen($4), sizeof(char)))) { strcpy($$->str, $2); strcat($$->str, "="); strcat($$->str, $4); $$->hash = lslpCheckSum($$->str, (int16)strlen($$->str)); } else { free($$); $$ = NULL; } } } ;%% lslpAtomList *lslpAllocAtom(void){ lslpAtomList *temp = (lslpAtomList *)calloc(1, sizeof(lslpAtomList)); if (temp != NULL) { temp->next = temp->prev = temp; } return(temp);} lslpAtomList *lslpAllocAtomList(void){ lslpAtomList *temp =lslpAllocAtom(); if (temp != NULL) temp->isHead = TRUE; return(temp);} void lslpFreeAtom(lslpAtomList *a ){ assert(a != NULL); if (a->str != NULL) free(a->str); free(a); return;} void lslpFreeAtomList(lslpAtomList *l, int32 flag){ lslpAtomList *temp; assert(l != NULL); assert(_LSLP_IS_HEAD(l)); while (! _LSLP_IS_EMPTY(l)) { temp = l->next; temp->prev->next = temp->next; temp->next->prev = temp->prev; lslpFreeAtom(temp); } if (flag) lslpFreeAtom(l); return;} lslpAtomizedURL *lslpAllocAtomizedURL(void){ lslpAtomizedURL *temp = (lslpAtomizedURL *)calloc(1, sizeof(lslpAtomizedURL)); if (temp != NULL) { temp->prev = temp->next = temp; } return(temp);} lslpAtomizedURL *lslpAllocAtomizedURLList(void){ lslpAtomizedURL *temp = lslpAllocAtomizedURL(); if (temp != NULL) { temp->isHead = TRUE; } return(temp);} void lslpFreeAtomizedURL(lslpAtomizedURL *u){ assert(u != NULL); if (u->url != NULL) free(u->url); if (! _LSLP_IS_EMPTY(&(u->srvcs))) lslpFreeAtomList(&(u->srvcs), 0); if (! _LSLP_IS_EMPTY(&(u->site))) lslpFreeAtomList(&(u->site), 0); if (! _LSLP_IS_EMPTY(&(u->path))) lslpFreeAtomList(&(u->path), 0); if (! _LSLP_IS_EMPTY(&(u->attrs))) lslpFreeAtomList(&(u->attrs), 0); free(u); return;} void lslpFreeAtomizedURLList(lslpAtomizedURL *l, int32 flag){ lslpAtomizedURL *temp; assert(l != NULL); assert(_LSLP_IS_HEAD(l)); while (! (_LSLP_IS_HEAD(l->next))) { temp = l->next; temp->prev->next = temp->next; temp->next->prev = temp->prev; lslpFreeAtomizedURL(temp); } if (flag) free(l); return;} void lslpInitAtomLists(void){ srvcHead.next = srvcHead.prev = &srvcHead; siteHead.next = siteHead.prev = &siteHead; pathHead.next = pathHead.prev = &pathHead; attrHead.next = attrHead.prev = &attrHead; return;} void lslpInitURLList(void){ urlHead.next = urlHead.prev = &urlHead; return;} void lslpCleanUpURLLists(void){ lslpFreeAtomList(&srvcHead, 0); lslpFreeAtomList(&siteHead, 0); lslpFreeAtomList(&pathHead, 0); lslpFreeAtomList(&attrHead, 0); lslpFreeAtomizedURLList(&urlHead, 0);}lslpAtomizedURL *_lslpDecodeURLs(char *u[], int32 count){ int32 i; uint32 lexer = 0; lslpAtomizedURL *temp = NULL; assert(u != NULL && u[count - 1] != NULL); lslpInitURLList(); lslpInitAtomLists(); for (i = 0; i < count; i++) { if (NULL == u[i]) break; if((0 != (lexer = url_init_lexer(u[i])))) { if(urlparse()) lslpCleanUpURLLists(); url_close_lexer(lexer); } } if (! _LSLP_IS_EMPTY(&urlHead)) { if(NULL != (temp = lslpAllocAtomizedURLList())) { _LSLP_LINK_HEAD(temp, &urlHead); } } return(temp); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -