uIP 1.0
C:/asm/STM32-ethernet/ENC28J60prj/uip-master/uip/lc-addrlabels.h
См. документацию.
00001 /*
00002  * Copyright (c) 2004-2005, Swedish Institute of Computer Science.
00003  * Все права зарезервированы. *
00004  * Повторное распространение, использование в исходном и двоичном виде,
00005  * с модификацией или без - разрешается, если выполняются следующие
00006  * условия:
00007  * 1. Распространение исходного кода должно сохранить вышеуказанную пометку
00008  *    копирайта, этот список условий и следующую правовую оговорку.
00009  * 2. Распространение исходного кода должно сохранить вышеуказанную пометку
00010  *    копирайта, этот список условий и следующую правовую оговорку в
00011  *    документации и/или других материалах, которые будут предоставлены
00012  *    вместе с распространяемыми материалами.
00013  * 3. Имя автора не может использоваться, чтобы подтвердить или продвинуть
00014  *    продукты, написанные с использованием этого программного обеспечения
00015  *    без специального на то разрешения.
00016  *
00017  * ЭТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ АВТОРОМ ``КАК ЕСТЬ'', БЕЗ
00018  * КАКОЙ-ЛИБО ЛЮБОЙ РАСШИРЕННОЙ ИЛИ ПОДРАЗУМЕВАЕМОЙ ГАРАНТИИ, ВКЛЮЧАЯ,
00019  * НО НЕ ОГРАНИЧИВАЯСЬ ЭТИМ, ГАРАНТИИ ВЫСОКОГО СПРОСА И ПРИГОДНОСТИ
00020  * ДЛЯ КОНКРЕТНОЙ ЦЕЛИ. АВТОР НИ ПРИ КАКИХ УСЛОВИЯХ НЕ ОТВЕТСТВЕНЕН
00021  * ЗА ЛЮБЫЕ УБЫТКИ - ПРЯМЫЕ, КОСВЕННЫЕ, СЛУЧАЙНЫЕ, СПЕЦИАЛЬНЫЕ, ОБРАЗЦОВЫЕ
00022  * ИЛИ ПОСЛЕДОВАТЕЛЬНЫЕ (ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ЭТИМ, ТРЕБОВАНИЯ
00023  * ЗАМЕНЫ ТОВАРА ИЛИ СЕРВИСА; ПОТЕРИ ИСПОЛЬЗОВАНИЯ, ДАННЫХ ИЛИ ВЫГОДЫ;
00024  * ИЛИ ПРЕКРАЩЕНИЕ БИЗНЕСА), ОДНАКО ВЫЗВАННЫЕ ПО ЛЮБОЙ ТЕОРИИ ОТВЕТСТВЕННОСТИ,
00025  * ЛИБО В КОНТРАКТЕ, ПРЯМОЙ ОТВЕТСТВЕННОСТИ, ЛИБО В НАРУШЕНИИ ЗАКОННЫХ ПРАВ
00026  * (ВКЛЮЧАЯ ТАК ИЛИ ИНАЧЕ НЕБРЕЖНОСТЬ), ВОЗНИКАЮЩИЕ ВСЕГДА ИЗ ИСПОЛЬЗОВАНИЯ
00027  * ЭТОГО ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ, ДАЖЕ ЕСЛИ БЫЛО ПРЕДУПРЕЖДЕНИЕ О ВОЗМОЖНОСТИ
00028  * ТАКОГО ПОВРЕЖДЕНИЯ.
00029  *
00030  * Этот файл является частью стека uIP TCP/IP.
00031  *
00032  * Author: Adam Dunkels <adam@sics.se>
00033  *
00034  * $Id: lc-addrlabels.h,v 1.3 2006/06/12 08:00:30 adam Exp $
00035  */
00036 
00037 /**
00038  * \addtogroup lc
00039  * @{
00040  */
00041 
00042 /**
00043  * \file
00044  * Реализация локальных продолжителей  (local continuations, LC) на основе 
00045  * фичи gcc "Метки как значение"
00046  * \author
00047  * Adam Dunkels <adam@sics.se>
00048  *
00049  * Эта реализация LC основывается на специальной возможности компилятора
00050  * GCC C, которая называется "labels as values" (метки как значения). Эта
00051  * фича позволяет назначать указателям адрес, соответствующей отдельной
00052  * метке C.
00053  *
00054  * Для дополнительной информации см. документацию GCC:
00055  * http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html
00056  *
00057  * Благодарю dividuum за найденную отличную реализацию применения
00058  * локальных меток.
00059  */
00060 
00061 #ifndef __LC_ADDRLABELS_H__
00062 #define __LC_ADDRLABELS_H__
00063 
00064 /** \hideinitializer */
00065 typedef void * lc_t;
00066 
00067 #define LC_INIT(s) s = NULL
00068 
00069 
00070 #define LC_RESUME(s)                            \
00071   do {                                          \
00072     if(s != NULL) {                             \
00073       goto *s;                                  \
00074     }                                           \
00075   } while(0)
00076 
00077 #define LC_SET(s)                               \
00078   do { ({ __label__ resume; resume: (s) = &&resume; }); }while(0)
00079 
00080 #define LC_END(s)
00081 
00082 #endif /* __LC_ADDRLABELS_H__ */
00083 
00084 /**  @} */