crtk.h

来自「伟大的Contiki工程, 短小精悍 的操作系统, 学习编程不可不看」· C头文件 代码 · 共 151 行

H
151
字号
/* * Copyright (c) 2006, Swedish Institute of Computer Science * All rights reserved.  * * Redistribution and use in source and binary forms, with or without  * modification, are permitted provided that the following conditions  * are met:  * 1. Redistributions of source code must retain the above copyright  *    notice, this list of conditions and the following disclaimer.  * 2. Redistributions in binary form must reproduce the above copyright  *    notice, this list of conditions and the following disclaimer in the  *    documentation and/or other materials provided with the distribution.  * 3. Neither the name of the Institute nor the names of its contributors  *    may be used to endorse or promote products derived from this software  *    without specific prior written permission.  * * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF  * SUCH DAMAGE.  * * @(#)$Id: crtk.h,v 1.1 2007/05/23 23:23:23 oliverschmidt Exp $ *//* * RUNES CRTK header, version 0.3 * * Stefanos Zachariadis, UCL, s.zachariadis@cs.ucl.ac.uk */#ifndef CRTK_H#define CRTK_H/* For now this file is intimately dependent on sys/service.h. Really * mysterious error messages are generated if one forgets to include * sys/service.h, for this reason it is included here! */#include "sys/service.h"#define COMPONENT 0#define INTERFACE 1#define RECEPTACLE 2typedef const char *Receptacle;typedef const void *Interface;#if 0typedef struct INTERFACES {  Interface *i;  struct INTERFACES *next;} Interfaces;#endif#if 0typedef struct RECEPTACLES {  Receptacle *r;  struct RECEPTACLES *next;} Receptacles;#endiftypedef struct ATTRIBUTE {  char *key;  void *value;  struct ATTRIBUTE *next;} Attribute;typedef struct ENTITY {   int id;   int type;   char *name;  Attribute *attributes;  struct ENTITY *next;} Entity; #define INVOKE(receptacle, iface, function)			\  {								\    struct service *service_s; \    service_s = service_find(receptacle);	\    if(service_s != NULL) {					\      ((struct iface *)service_s->interface)->function;		\    }								\ }#define DECLARE_COMPONENT(compname,interface) \extern struct process compname##_process; \struct compname interface;#define DECLARE_INTERFACE(intname,interface)\  struct intname interface;#define IMPLEMENT_COMPONENT(compname, ...)\  static const struct compname compname##_implementation_interface = __VA_ARGS__;\  static struct service compname##_implementation = { NULL, NULL, #compname, & compname##_implementation_interface }; \  static Entity compname##_entity;\  static void construct(void);\  static void destroy(void);\  PROCESS(compname##_process, #compname"_process");	\  PROCESS_THREAD(compname##_process, ev, data) {\   static Attribute name = { "template", #compname, NULL };\  PROCESS_EXITHANDLER(goto exit);\  PROCESS_BEGIN();\  compname##_entity.type = COMPONENT;\  compname##_entity.name = #compname;\  construct();\  SERVICE_REGISTER(compname##_implementation);\  INVOKE("crtk", crtk, instantiate(&compname##_entity,&name));\  PROCESS_YIELD_UNTIL(ev == PROCESS_EVENT_SERVICE_REMOVED);\  exit:\  destroy();\  SERVICE_REMOVE(compname##_implementation);\  INVOKE("crtk", crtk, delent(&compname##_entity));\  PROCESS_END();  \  }/* Registry crtk is built upon. */DECLARE_COMPONENT(crtk,{  /* prints the contents of the registry. */  void (* printregistry)(void);    /* delete the given entity. */  void (* delent)(Entity *e);  /* adds a new attribute for the given entity. */  void (* putattr)(Entity *e, Attribute *a);  /* searches for an attribute with the given key, for the given entity. */  void (* getattr)(Entity e, char *key, Attribute **a);  /* connects an interface and a receptacle. */  void (* connect) (Interface i, Receptacle *r);   /* instantiates a new component. */  void (* instantiate) (Entity *e, Attribute *init);  /* returns on e all the entities (and their attributes) available. */  void (* getentities) (Entity **e);});#endif /* CRTK_H */

⌨️ 快捷键说明

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