📄 llist.h
字号:
/*------------------------------------------------------------------------------*
* File Name: llist.h *
* Purpose: Link list management macros *
* Creation: 1/1/89, by Dr. C. P. Yang *
* Copyright Microcal Software Inc. 1989-1995 *
* Modification log *
* CPY v3.8 6/24/95 CPP_MENUS, convert to C++ compatible, add extern C *
* sth v4.12 7/23/96 SAFE_EACH_LIST *
* sth v4.133 9/20/96 GENERIC_LINK_LIST_SUPPORT *
* sth v4.93 2/28/97 RENAMEING_SAFE_EACH_LIST *
* ML 2/25/98 TEMPORARY_FRAME_FOR_PLOT_DETAILS_DLG *
*------------------------------------------------------------------------------*/
#ifdef __cplusplus ///CPY v3.8 6/24/95 CPP_MENUS
extern "C" { /* Assume C declarations for C++ */
#endif /* __cplusplus */
///sth v4.133 9/20/96 GENERIC_LINK_LIST_SUPPORT
#define GENERIC_LINK_LIST_SUPORT
///end GENERIC_LINK_LIST_SUPPORT
///sth v4.12 7/23/96 SAFE_EACH_LIST
///sth v4.93 2/28/97 RENAMEING_SAFE_EACH_LIST
//this macro was designed spefically for recursive labtalk commands (over all windows etc)
//it was named incorectly as safe,here it has been re named AND made safer, i.e checks p before getting p->next
//#define EACH_LIST_ELEMENT_SAFE(head,p,pp) for ( (p) = (head),(pp) = (p)->next ; (p) != NULL; (p) = (pp), (pp) = (p) != NULL ? (p)->next : NULL )
#define EACH_LIST_ELEMENT_RECURSIVE_LABTALK(head,p,pp) for ( (p) = (head),(pp) = (p) != NULL ? (p)->next : NULL ; (p) != NULL; (p) = (pp), (pp) = (p) != NULL ? (p)->next : NULL )
///end RENAMEING_SAFE_EACH_LIST
///end SAFE_EACH_LIST
///sth v4.133 9/20/96 GENERIC_LINK_LIST_SUPPORT
#ifdef GENERIC_LINK_LIST_SUPORT
#define GENERIC_EACH_LIST_ELEMENT(head,p,nextfield) for ( (p) = (head); (p) != NULL; (p) = (p)->nextfield)
/// ML 2/25/98 TEMPORARY_FRAME_FOR_PLOT_DETAILS_DLG
#define GENERIC_EACH_PAIR_LISTS_ELEMENTS(head1, p1, next1, head2, p2, next2) for ( (p1) = (head1), (p2) = (head2); (p1) != NULL && (p2) != NULL; (p1) = (p1)->next1, (p2) = (p2)->next2)
/// end TEMPORARY_FRAME_FOR_PLOT_DETAILS_DLG
#define GENERIC_REMOVE_LIST_ELEMENT(head,pi,p,nextfield) {(p) = (head); \
if( (p) == (pi) ) {(head) = (pi)->nextfield;} \
else GENERIC_EACH_LIST_ELEMENT(head,p,nextfield) \
{ if( (p)->nextfield == (pi) ) \
{(p)->nextfield = (pi)->nextfield;break;} \
}}
#define GENERIC_ADD_LIST_ELEMENT(head,pi,p,nextfield) {(pi)->nextfield = NULL;\
if( (head) == NULL ) {(head) = (pi);} \
else \
GENERIC_EACH_LIST_ELEMENT(head,p,nextfield) \
{ if( (p)->nextfield == NULL ) \
{ (p)->nextfield = pi;break; } \
}}
#define GENERIC_LIST_ELEMENT(head,i,p,nextfield) { int indx = 0; \
GENERIC_EACH_LIST_ELEMENT((head),p,nextfield) \
{ if ( indx++ == (i) ) break; } }
//sth 2/10/95
//ps=search pointer, pt=temp pointer, head = list, past = where you wish the past pointer to be placed
#define GENERIC_PREVIOS_POINTER(head,ps,pt,past,nextfield) \
{ \
if (head == ps) \
past = NULL; \
else \
GENERIC_EACH_LIST_ELEMENT(head,pt,nextfield) \
{ \
if (pt->nextfield == ps) \
{ \
past = pt; \
break; \
} \
} \
}
//
#define GENERIC_DELETE_LIST(head,p,nextfield) while ( p = head ) {GENERIC_POP_LIST(head,,nextfield);DisposPtr(p);}
#define GENERIC_POP_LIST(head,nextfield) (head) = (head)->nextfield
#define GENERIC_PUSH_LIST(head,p,nextfield) {(p)->nextfield = head;head = (p);}
#define GENERIC_COUNT_LIST(head,p,n,nextfield) { n = 0; GENERIC_EACH_LIST_ELEMENT(head,p,nextfield) n++; }
#define GENERIC_LIST_INDEX(head,pi,p,n,nextfield) {n=0;GENERIC_EACH_LIST_ELEMENT(head,p,nextfield) {if (p == pi) break;n++;}}
#define GENERIC_REVERS_LIST(head,plast,p1,p2,new,nextfield) {p1=head;new=plast; \
while((p2 = p1) != plast) {GENERIC_POP_LIST(p1,nextfield);GENERIC_PUSH_LIST(new,p2,nextfield)}; \
head=new;}
#define GENERIC_INSERT_LIST_ELEMENT(head,pi,pnext,p,nextfield) {(p) = (head); \
if( (p) == (pnext) ) {(pi)->nextfield=(p);(head) = (pi);} \
else GENERIC_EACH_LIST_ELEMENT(head,p,nextfield) \
{ if( (p)->nextfield == (pnext) ) \
{(p)->nextfield = (pi);(pi)->nextfield=(pnext);break;} \
}}
////
#define EACH_LIST_ELEMENT(head,p) GENERIC_EACH_LIST_ELEMENT(head,p,next)
/// ML 2/25/98 TEMPORARY_FRAME_FOR_PLOT_DETAILS_DLG
#define EACH_PAIR_LISTS_ELEMENTS(head1, p1, head2, p2) GENERIC_EACH_PAIR_LISTS_ELEMENTS(head1, p1, next, head2, p2, next)
/// end TEMPORARY_FRAME_FOR_PLOT_DETAILS_DLG
#define REMOVE_LIST_ELEMENT(head,pi,p) GENERIC_REMOVE_LIST_ELEMENT(head,pi,p,next)
#define ADD_LIST_ELEMENT(head,pi,p) GENERIC_ADD_LIST_ELEMENT(head,pi,p,next)
#define LIST_ELEMENT(head,i,p) GENERIC_LIST_ELEMENT(head,i,p,next)
#define PREVIOS_POINTER(head,ps,pt,past) GENERIC_PREVIOS_POINTER(head,ps,pt,past,next)
#define DELETE_LIST(head,p) GENERIC_DELETE_LIST(head,p,next)
#define POP_LIST(head) GENERIC_POP_LIST(head,next)
#define PUSH_LIST(head,p) GENERIC_PUSH_LIST(head,p,next)
#define COUNT_LIST(head,p,n) GENERIC_COUNT_LIST(head,p,n,next)
#define LIST_INDEX(head,pi,p,n) GENEIRC_LIST_INDEX(head,pi,p,n,next)
#define REVERS_LIST(head,plast,p1,p2,new) GENERIC_REVERS_LIST(head,plast,p1,p2,new,next)
#define INSERT_LIST_ELEMENT(head,pi,pnext,p) GENERIC_INSERT_LIST_ELEMENT(head,pi,pnext,p,next)
///end GENERIC_LINK_LIST_SUPPORT
#else ///GENERIC_LINK_LIST_SUPPORT
#define EACH_LIST_ELEMENT(head,p) for ( (p) = (head); (p) != NULL; (p) = (p)->next)
#define REMOVE_LIST_ELEMENT(head,pi,p) {(p) = (head); \
if( (p) == (pi) ) {(head) = (pi)->next;} \
else EACH_LIST_ELEMENT(head,p) \
{ if( (p)->next == (pi) ) \
{(p)->next = (pi)->next;break;} \
}}
#define ADD_LIST_ELEMENT(head,pi,p) {(pi)->next = NULL; \
if( (head) == NULL ) {(head) = (pi);} \
else \
EACH_LIST_ELEMENT(head,p) \
{ if( (p)->next == NULL ) \
{ (p)->next = pi;break; } \
}}
#define LIST_ELEMENT(head,i,p) { int indx = 0; \
EACH_LIST_ELEMENT((head),p) \
{ if ( indx++ == (i) ) break; } }
//sth 2/10/95
//ps=search pointer, pt=temp pointer, head = list, past = where you wish the past pointer to be placed
#define PREVIOS_POINTER(head,ps,pt,past) \
{ \
if (head == ps) \
past = NULL; \
else \
EACH_LIST_ELEMENT(head,pt) \
{ \
if (pt->next == ps) \
{ \
past = pt; \
break; \
} \
} \
}
//
#define DELETE_LIST(head,p) while ( p = head ) {POP_LIST(head);DisposPtr(p);}
#define POP_LIST(head) (head) = (head)->next
#define PUSH_LIST(head,p) {(p)->next = head;head = (p);}
#define COUNT_LIST(head,p,n) { n = 0; EACH_LIST_ELEMENT(head,p) n++; }
#define LIST_INDEX(head,pi,p,n) {n=0;EACH_LIST_ELEMENT(head,p) {if (p == pi) break;n++;}}
#define REVERS_LIST(head,plast,p1,p2,new) {p1=head;new=plast; \
while((p2 = p1) != plast) {POP_LIST(p1);PUSH_LIST(new,p2)}; \
head=new;}
#define INSERT_LIST_ELEMENT(head,pi,pnext,p) {(p) = (head); \
if( (p) == (pnext) ) {(pi)->next=(p);(head) = (pi);} \
else EACH_LIST_ELEMENT(head,p) \
{ if( (p)->next == (pnext) ) \
{(p)->next = (pi);(pi)->next=(pnext);break;} \
}}
////
#endif ///GENERIC_LINK_LIST_SUPPORT
#ifdef __cplusplus
}
#endif /* __cplusplus */
///CPY v3.8 6/24/95 CPP_MENUS
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -