⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 htlink.c

📁 www工具包
💻 C
字号:
/***	HYPERTEXT LINK CLASS****	(c) COPYRIGHT MIT 1995.**	Please first read the full copyright statement in the file COPYRIGH.**	@(#) $Id: HTLink.c,v 2.3 1999/02/22 22:10:11 frystyk Exp $****	An anchor represents a region of a hypertext document which is**	linked to another anchor in the same or a different document.**** History**         Nov 1990  Written in Objective-C for the NeXT browser (TBL)**	24-Oct-1991 (JFG), written in C, browser-independant **	21-Nov-1991 (JFG), first complete version**	 3-May-1995 (HF), Added a lot of methods and other stuff made an object**		    HF - moved all Link stuff to HTLink*//* Library include files */#include "wwwsys.h"#include "WWWUtil.h"#include "HTFormat.h"#include "HTParse.h"#include "HTMethod.h"#include "HTAncMan.h"#include "HTLink.h"					 /* Implemented here *//* ------------------------------------------------------------------------- */PUBLIC HTLink * HTLink_new (void){    HTLink * link;    if ((link = (HTLink *) HT_CALLOC(1, sizeof (HTLink))) == NULL)        HT_OUTOFMEM("HTLink_new");    return link;}PUBLIC BOOL HTLink_delete (HTLink * me){    HT_FREE(me);    return YES;}/*	Link me Anchor to another given one**	-------------------------------------*/PUBLIC BOOL HTLink_add (HTAnchor *	source,			HTAnchor * 	destination, 			HTLinkType	type,			HTMethod	method){    if (source && destination) {	HTTRACE(ANCH_TRACE, "Link create. from anchor %p to %p with type %s, method %s\n" _ 		    (void *) source _ (void *) destination _ 		    type ? HTAtom_name(type) : "NONE" _ 		    method != METHOD_INVALID ? HTMethod_name(method) : "NONE");	if (!source->mainLink.dest) {	    source->mainLink.dest = destination;	    source->mainLink.type = type;	    source->mainLink.method = method;	} else {	    HTLink * newLink = HTLink_new();	    newLink->dest = destination;	    newLink->type = type;	    newLink->method = method;	    if (!source->links) source->links = HTList_new();	    HTList_addObject (source->links, newLink);	}	if (!destination->parent->sources)	    destination->parent->sources = HTList_new();	HTList_addObject (destination->parent->sources, source);	return YES;    } else	HTTRACE(ANCH_TRACE, "Link........ Bad argument\n");    return NO;}/***  Removes link information from one anchor to another.**  Returns YES if OK, else NO*/PUBLIC BOOL HTLink_remove (HTAnchor * source, HTAnchor * destination){    if (!source || !destination) return NO;    HTTRACE(ANCH_TRACE, "Link delete. from anchor %p to anchor %p\n" _ 		(void *) source _ (void *) destination);    /* Remove if dest is the main link */    if (source->mainLink.dest == destination) {	source->mainLink.dest = NULL;	source->mainLink.type = NULL;	source->mainLink.method = METHOD_INVALID;	source->mainLink.result = HT_LINK_INVALID;	return YES;    }    /* Remove link information for other links */    if (destination->links) {	HTList *cur = destination->links;	HTLink *pres;	while ((pres = (HTLink *) HTList_nextObject(cur))) {	    if (pres->dest == destination) {		HTList_removeObject(destination->links, pres);		HT_FREE(pres);		return YES;	    }	}    }    return NO;}/***  Removes all link information**  Returns YES if OK, else NO*/PUBLIC BOOL HTLink_removeAll (HTAnchor * me){    if (!me) return NO;    HTTRACE(ANCH_TRACE, "Link delete. from anchor %p\n" _ (void *) me);    /* Remove if dest is the main link */    me->mainLink.dest = NULL;    me->mainLink.type = NULL;    me->mainLink.method = METHOD_INVALID;    me->mainLink.result = HT_LINK_INVALID;    /* Remove link information for other links */    if (me->links) {	HTList *cur = me->links;	HTLink *pres;	while ((pres = (HTLink *) HTList_nextObject(cur)))	    HT_FREE(pres);	HTList_delete(me->links);	me->links = NULL;    }    return YES;}/***  Moves all link information from one anchor to another.**  This is used in redirection etc.**  Returns YES if OK, else NO*/PUBLIC BOOL HTLink_moveAll (HTAnchor * src, HTAnchor * dest){    if (!src || !dest) return NO;    HTTRACE(ANCH_TRACE, "Link move... all from anchor %p to anchor %p\n" _ 		(void *) src _ (void *) dest);    /* Move main link information */    dest->mainLink.dest = src->mainLink.dest;    dest->mainLink.type = src->mainLink.type;    dest->mainLink.method = src->mainLink.method;    dest->mainLink.result = src->mainLink.result;    src->mainLink.dest = NULL;    src->mainLink.type = NULL;    src->mainLink.method = METHOD_INVALID;    src->mainLink.result = HT_LINK_INVALID;    /* Move link information for other links */    if (dest->links) {	HTList *cur = dest->links;	HTLink *pres;	while ((pres = (HTLink *) HTList_nextObject(cur)))	    HT_FREE(pres);	HTList_delete(dest->links);    }    dest->links = src->links;    src->links = NULL;    return YES;}/***  Find the anchor object between a destination and a source ancher.**  Return link object if any, else NULL*/PUBLIC HTLink * HTLink_find (HTAnchor * src, HTAnchor * dest){    if (src && dest) {	if (src->mainLink.dest == dest)	    return &(src->mainLink);	if (src->links) {	    HTList *cur = src->links;	    HTLink *pres;	    while ((pres = (HTLink *) HTList_nextObject(cur)) != NULL) {		if (pres->dest == dest)		    return pres;	    }	}    }    return NULL;}/***  Returns a link with a given link type or NULL if nothing found*/PUBLIC HTLink * HTLink_findType (HTAnchor * me, HTLinkType type){    if (me) {	HTLink * link = HTAnchor_mainLink(me);	HTList * sublinks = HTAnchor_subLinks(me);	if (link && link->type==type)	    return link;	else if (sublinks) {	    while ((link = (HTLink *) HTList_nextObject (sublinks)))		if (link->type == type) return link;	}    }    return NULL;}/***	Link destinations*/PUBLIC BOOL HTLink_setDestination (HTLink * link, HTAnchor * dest){    if (link) {	link->dest = dest;	return YES;    }    return NO;}PUBLIC HTAnchor * HTLink_destination (HTLink * link){    return link ? link->dest : NULL;}PUBLIC BOOL HTLink_setType (HTLink * link, HTLinkType type){    if (link) {	link->type = type;	return YES;    }    return NO;}PUBLIC HTLinkType HTLink_type (HTLink * link){    return link ? link->type : NULL;}/* **  When a link has been used for posting an object from a source to a**  destination link, the result of the operation is stored as part of the**  link information.*/PUBLIC BOOL HTLink_setResult (HTLink * link, HTLinkResult result){    if (link) {	link->result = result;	return YES;    }    return NO;}PUBLIC HTLinkResult HTLink_result (HTLink * link){    return link ? link->result : HT_LINK_INVALID;}PUBLIC BOOL HTLink_setMethod (HTLink * link, HTMethod method){    if (link) {	link->method = method;	return YES;    }    return NO;}PUBLIC HTMethod HTLink_method (HTLink * link){    return link ? link->method : METHOD_INVALID;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -