uIP 1.0
|
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 /** @} */