Changeset 1079 for trunk/ext/jelix

Show
Ignore:
Timestamp:
09/09/08 23:52:13 (4 months ago)
Author:
laurentj
Message:

updated the php extension: support of new interfaces
split the jUrl.class.php file into several files

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/ext/jelix/jelix_interfaces.c

    r476 r1079  
    22*  Jelix 
    33*  a php extension for Jelix Framework 
    4 * @copyright Copyright (c) 2006-2007 Laurent Jouanneau 
     4* @copyright Copyright (c) 2006-2008 Laurent Jouanneau 
    55* @author : Laurent Jouanneau 
    66* @link http://jelix.org 
     
    2121#include "jelix_interfaces.h" 
    2222 
    23  
     23PHPAPI zend_class_entry * jelix_ce_jIAcl2Driver; 
     24PHPAPI zend_class_entry * jelix_ce_jIAclDriver; 
     25PHPAPI zend_class_entry * jelix_ce_jIAuthDriver; 
     26PHPAPI zend_class_entry * jelix_ce_jIAuthDriverClass; 
    2427PHPAPI zend_class_entry * jelix_ce_jICoordPlugin; 
    25 PHPAPI zend_class_entry * jelix_ce_jIAuthDriver; 
     28PHPAPI zend_class_entry * jelix_ce_jIFilteredDatatype; 
     29PHPAPI zend_class_entry * jelix_ce_jIFormsDatasource; 
     30PHPAPI zend_class_entry * jelix_ce_jIMultiFileCompiler; 
     31PHPAPI zend_class_entry * jelix_ce_jIRestController; 
     32PHPAPI zend_class_entry * jelix_ce_jISelector; 
     33PHPAPI zend_class_entry * jelix_ce_jISimpleCompiler; 
    2634PHPAPI zend_class_entry * jelix_ce_jIUrlEngine; 
    27 PHPAPI zend_class_entry * jelix_ce_jIRestController; 
    28 PHPAPI zend_class_entry * jelix_ce_jISimpleCompiler; 
    29 PHPAPI zend_class_entry * jelix_ce_jIMultiFileCompiler; 
    30 PHPAPI zend_class_entry * jelix_ce_jISelector; 
    31  
    32  
    33  
    34 /* ------------------------------------- 
    35 interface jICoordPlugin{ 
    36     public function beforeAction($param); 
    37     public function beforeOutput(); 
    38     public function afterProcess(); 
    39 
    40 */ 
    41  
    42 static 
    43 ZEND_BEGIN_ARG_INFO_EX(arginfo_jICoordPlugin_beforeAction, 0, 0, 1) 
    44         ZEND_ARG_INFO(0, params) 
    45 ZEND_END_ARG_INFO(); 
    46  
    47  
    48 zend_function_entry zend_funcs_jICoordPlugin[] = { 
    49         ZEND_ABSTRACT_ME(jICoordPlugin, beforeAction, arginfo_jICoordPlugin_beforeAction) 
    50         ZEND_ABSTRACT_ME(jICoordPlugin, beforeOutput, NULL) 
    51         ZEND_ABSTRACT_ME(jICoordPlugin, afterProcess, NULL) 
    52         {NULL, NULL, NULL} 
    53 }; 
    54  
    55  
     35 
     36 
     37/* ------------------------------------- 
     38interface jIAcl2Driver{ 
     39    public function getRight($subject, $resource=null); 
     40    public function clearCache(); 
     41
     42*/ 
     43 
     44static 
     45ZEND_BEGIN_ARG_INFO_EX(arginfo_jIAcl2Driver_getRight, 0, 0, 1) 
     46    ZEND_ARG_INFO(0, subject) 
     47    ZEND_ARG_INFO(0, resource) 
     48ZEND_END_ARG_INFO(); 
     49 
     50 
     51zend_function_entry zend_funcs_jIAcl2Driver[] = { 
     52    ZEND_ABSTRACT_ME(jIAcl2Driver, getRight, arginfo_jIAcl2Driver_getRight) 
     53    ZEND_ABSTRACT_ME(jIAcl2Driver, clearCache, NULL) 
     54    {NULL, NULL, NULL} 
     55}; 
     56 
     57 
     58/* ------------------------------------- 
     59interface jIAclDriver{ 
     60    public function getRight($subject, $resource=null); 
     61    public function clearCache(); 
     62
     63*/ 
     64 
     65static 
     66ZEND_BEGIN_ARG_INFO_EX(arginfo_jIAclDriver_getRight, 0, 0, 1) 
     67    ZEND_ARG_INFO(0, subject) 
     68    ZEND_ARG_INFO(0, resource) 
     69ZEND_END_ARG_INFO(); 
     70 
     71 
     72zend_function_entry zend_funcs_jIAclDriver[] = { 
     73    ZEND_ABSTRACT_ME(jIAclDriver, getRight, arginfo_jIAclDriver_getRight) 
     74    ZEND_ABSTRACT_ME(jIAclDriver, clearCache, NULL) 
     75    {NULL, NULL, NULL} 
     76}; 
    5677 
    5778/* ------------------------------------- 
     
    7293 
    7394static 
    74  
    7595ZEND_BEGIN_ARG_INFO_EX(arginfo_jIAuthDriver_params, 0, 0, 1) 
    7696        ZEND_ARG_INFO(0, params) 
    7797ZEND_END_ARG_INFO(); 
    7898 
     99static 
    79100ZEND_BEGIN_ARG_INFO_EX(arginfo_jIAuthDriver_pattern, 0, 0, 1) 
    80101        ZEND_ARG_INFO(0, pattern) 
    81102ZEND_END_ARG_INFO(); 
    82103 
     104static 
    83105ZEND_BEGIN_ARG_INFO_EX(arginfo_jIAuthDriver_user, 0, 0, 1) 
    84106        ZEND_ARG_INFO(0, user) 
    85107ZEND_END_ARG_INFO(); 
    86108 
     109static 
    87110ZEND_BEGIN_ARG_INFO_EX(arginfo_jIAuthDriver_login, 0, 0, 1) 
    88111        ZEND_ARG_INFO(0, login) 
    89112ZEND_END_ARG_INFO(); 
    90113 
     114static 
    91115ZEND_BEGIN_ARG_INFO_EX(arginfo_jIAuthDriver_loginpwd, 0, 0, 2) 
    92116        ZEND_ARG_INFO(0, login) 
     
    96120zend_function_entry zend_funcs_jIAuthDriver[] = { 
    97121        ZEND_ABSTRACT_ME(jIAuthDriver, __construct, arginfo_jIAuthDriver_params ) 
    98         ZEND_ABSTRACT_ME(jIAuthDriver, createUser, arginfo_jIAuthDriver_loginpwd) 
     122        ZEND_ABSTRACT_ME(jIAuthDriver, createUserObject, arginfo_jIAuthDriver_loginpwd) 
    99123        ZEND_ABSTRACT_ME(jIAuthDriver, saveNewUser, arginfo_jIAuthDriver_user) 
    100124        ZEND_ABSTRACT_ME(jIAuthDriver, removeUser, arginfo_jIAuthDriver_login) 
     
    107131}; 
    108132 
    109 /* ------------------------------------- 
    110 interface jIUrlEngine { 
    111   public function parse($scriptNamePath, $pathinfo, $params ); 
    112   public function create($urlact); 
    113 
    114  
    115 */ 
    116 static 
    117 ZEND_BEGIN_ARG_INFO_EX(arginfo_jIUrlEngine_parse, 0, 0, 3) 
    118         ZEND_ARG_INFO(0, scriptNamePath) 
    119         ZEND_ARG_INFO(0, pathinfo) 
    120         ZEND_ARG_INFO(0, params) 
    121 ZEND_END_ARG_INFO(); 
    122  
    123 ZEND_BEGIN_ARG_INFO_EX(arginfo_jIUrlEngine_create, 0, 0, 1) 
    124         ZEND_ARG_INFO(0, urlact) 
    125 ZEND_END_ARG_INFO(); 
    126  
    127  
    128 zend_function_entry zend_funcs_jIUrlEngine[] = { 
    129         ZEND_ABSTRACT_ME(jIUrlEngine, parse, arginfo_jIUrlEngine_parse) 
    130         ZEND_ABSTRACT_ME(jIUrlEngine, create, arginfo_jIUrlEngine_create) 
    131         {NULL, NULL, NULL} 
     133 
     134/* ------------------------------------- 
     135interface jIAuthDriverClass { 
     136    public function insert($user); 
     137    public function deleteByLogin($login); 
     138    public function update($user); 
     139    public function getByLogin($login); 
     140    public function createUserObject(); 
     141    public function findAll(); 
     142    public function findByLoginPattern($pattern); 
     143    public function updatePassword($login, $cryptedpassword); 
     144    public function getByLoginPassword($login, $cryptedpassword); 
     145
     146*/ 
     147 
     148static 
     149ZEND_BEGIN_ARG_INFO_EX(arginfo_jIAuthDriverClass_pattern, 0, 0, 1) 
     150    ZEND_ARG_INFO(0, pattern) 
     151ZEND_END_ARG_INFO(); 
     152 
     153static 
     154ZEND_BEGIN_ARG_INFO_EX(arginfo_jIAuthDriverClass_user, 0, 0, 1) 
     155    ZEND_ARG_INFO(0, user) 
     156ZEND_END_ARG_INFO(); 
     157 
     158static 
     159ZEND_BEGIN_ARG_INFO_EX(arginfo_jIAuthDriverClass_login, 0, 0, 1) 
     160    ZEND_ARG_INFO(0, login) 
     161ZEND_END_ARG_INFO(); 
     162 
     163static 
     164ZEND_BEGIN_ARG_INFO_EX(arginfo_jIAuthDriverClass_loginpwd, 0, 0, 2) 
     165    ZEND_ARG_INFO(0, login) 
     166    ZEND_ARG_INFO(0, password) 
     167ZEND_END_ARG_INFO(); 
     168 
     169zend_function_entry zend_funcs_jIAuthDriverClass[] = { 
     170    ZEND_ABSTRACT_ME(jIAuthDriverClass, insert,        arginfo_jIAuthDriverClass_user) 
     171    ZEND_ABSTRACT_ME(jIAuthDriverClass, deleteByLogin, arginfo_jIAuthDriverClass_login) 
     172    ZEND_ABSTRACT_ME(jIAuthDriverClass, update,        arginfo_jIAuthDriverClass_user) 
     173    ZEND_ABSTRACT_ME(jIAuthDriverClass, getByLogin,    arginfo_jIAuthDriverClass_login) 
     174    ZEND_ABSTRACT_ME(jIAuthDriverClass, findAll,       NULL) 
     175    ZEND_ABSTRACT_ME(jIAuthDriverClass, findByLoginPattern,   arginfo_jIAuthDriverClass_pattern) 
     176    ZEND_ABSTRACT_ME(jIAuthDriverClass, updatePassword, arginfo_jIAuthDriverClass_loginpwd) 
     177    ZEND_ABSTRACT_ME(jIAuthDriverClass, getByLoginPassword, arginfo_jIAuthDriverClass_loginpwd) 
     178    {NULL, NULL, NULL} 
     179}; 
     180 
     181 
     182/* ------------------------------------- 
     183interface jICoordPlugin{ 
     184    public function __construct($config); 
     185    public function beforeAction($param); 
     186    public function beforeOutput(); 
     187    public function afterProcess(); 
     188
     189*/ 
     190 
     191static 
     192ZEND_BEGIN_ARG_INFO_EX(arginfo_jICoordPlugin_beforeAction, 0, 0, 1) 
     193    ZEND_ARG_INFO(0, params) 
     194ZEND_END_ARG_INFO(); 
     195 
     196static 
     197ZEND_BEGIN_ARG_INFO_EX(arginfo_jICoordPlugin_config, 0, 0, 1) 
     198    ZEND_ARG_INFO(0, config) 
     199ZEND_END_ARG_INFO(); 
     200 
     201zend_function_entry zend_funcs_jICoordPlugin[] = { 
     202    ZEND_ABSTRACT_ME(jICoordPlugin, __construct, arginfo_jICoordPlugin_config ) 
     203    ZEND_ABSTRACT_ME(jICoordPlugin, beforeAction, arginfo_jICoordPlugin_beforeAction) 
     204    ZEND_ABSTRACT_ME(jICoordPlugin, beforeOutput, NULL) 
     205    ZEND_ABSTRACT_ME(jICoordPlugin, afterProcess, NULL) 
     206    {NULL, NULL, NULL} 
     207}; 
     208 
     209 
     210/* ------------------------------------- 
     211interface jIFilteredDatatype { 
     212    public function getFilteredValue(); 
     213
     214*/ 
     215zend_function_entry zend_funcs_jIFilteredDatatype[] = { 
     216    ZEND_ABSTRACT_ME(jIFilteredDatatype, getFilteredValue, NULL) 
     217    {NULL, NULL, NULL} 
     218}; 
     219 
     220 
     221/* ------------------------------------- 
     222interface jIFormsDatasource { 
     223    public function getData($form); 
     224    public function getLabel($key); 
     225
     226*/ 
     227 
     228static 
     229ZEND_BEGIN_ARG_INFO_EX(arginfo_jIFormsDatasource_params, 0, 0, 1) 
     230    ZEND_ARG_INFO(0, params) 
     231ZEND_END_ARG_INFO(); 
     232 
     233static 
     234ZEND_BEGIN_ARG_INFO_EX(arginfo_jIFormsDatasource_key, 0, 0, 1) 
     235    ZEND_ARG_INFO(0, keys) 
     236ZEND_END_ARG_INFO(); 
     237 
     238zend_function_entry zend_funcs_jIFormsDatasource[] = { 
     239    ZEND_ABSTRACT_ME(jIFormsDatasource, getData, arginfo_jIFormsDatasource_params ) 
     240    ZEND_ABSTRACT_ME(jIFormsDatasource, getLabel, arginfo_jIFormsDatasource_key) 
     241    {NULL, NULL, NULL} 
     242}; 
     243 
     244 
     245/* ------------------------------------- 
     246interface jIMultiFileCompiler { 
     247    public function compileItem($sourceFile, $module); 
     248    public function endCompile($cachefile); 
     249
     250 
     251*/ 
     252static 
     253ZEND_BEGIN_ARG_INFO_EX(arginfo_jIMultiFileCompiler_compileItem, 0, 0, 2) 
     254    ZEND_ARG_INFO(0, sourceFile) 
     255    ZEND_ARG_INFO(0, module) 
     256ZEND_END_ARG_INFO(); 
     257 
     258static 
     259ZEND_BEGIN_ARG_INFO_EX(arginfo_jIMultiFileCompiler_endCompile, 0, 0, 1) 
     260    ZEND_ARG_INFO(0, cachefile) 
     261ZEND_END_ARG_INFO(); 
     262 
     263 
     264zend_function_entry zend_funcs_jIMultiFileCompiler[] = { 
     265    ZEND_ABSTRACT_ME(jIMultiFileCompiler, compileItem, arginfo_jIMultiFileCompiler_compileItem) 
     266    ZEND_ABSTRACT_ME(jIMultiFileCompiler, endCompile, arginfo_jIMultiFileCompiler_endCompile) 
     267    {NULL, NULL, NULL} 
    132268}; 
    133269 
     
    140276    public function delete(); 
    141277} 
    142  
    143278*/ 
    144279 
    145280zend_function_entry zend_funcs_jIRestController[] = { 
    146         ZEND_ABSTRACT_ME(jIRestController, get , NULL) 
    147         ZEND_ABSTRACT_ME(jIRestController, post , NULL) 
    148         ZEND_ABSTRACT_ME(jIRestController, put, NULL) 
    149         ZEND_ABSTRACT_ME(jIRestController, delete, NULL) 
    150         {NULL, NULL, NULL} 
    151 }; 
    152  
    153 /* ------------------------------------- 
    154  
    155 interface jISimpleCompiler { 
    156     public function compile($aSelector); 
    157 
    158  
    159 */ 
    160 static 
    161 ZEND_BEGIN_ARG_INFO_EX(arginfo_jISimpleCompiler_compile, 0, 0, 1) 
    162         ZEND_ARG_INFO(0, aSelector) 
    163 ZEND_END_ARG_INFO(); 
    164  
    165  
    166 zend_function_entry zend_funcs_jISimpleCompiler[] = { 
    167         ZEND_ABSTRACT_ME(jISimpleCompiler, compile, arginfo_jISimpleCompiler_compile) 
    168         {NULL, NULL, NULL} 
    169 }; 
    170  
    171 /* ------------------------------------- 
    172 interface jIMultiFileCompiler { 
    173     public function compileItem($sourceFile, $module); 
    174     public function endCompile($cachefile); 
    175 
    176  
    177 */ 
    178 static 
    179 ZEND_BEGIN_ARG_INFO_EX(arginfo_jIMultiFileCompiler_compileItem, 0, 0, 2) 
    180         ZEND_ARG_INFO(0, sourceFile) 
    181         ZEND_ARG_INFO(0, module) 
    182 ZEND_END_ARG_INFO(); 
    183  
    184 static 
    185 ZEND_BEGIN_ARG_INFO_EX(arginfo_jIMultiFileCompiler_endCompile, 0, 0, 1) 
    186         ZEND_ARG_INFO(0, cachefile) 
    187 ZEND_END_ARG_INFO(); 
    188  
    189  
    190 zend_function_entry zend_funcs_jIMultiFileCompiler[] = { 
    191         ZEND_ABSTRACT_ME(jIMultiFileCompiler, compileItem, arginfo_jIMultiFileCompiler_compileItem) 
    192         ZEND_ABSTRACT_ME(jIMultiFileCompiler, endCompile, arginfo_jIMultiFileCompiler_endCompile) 
    193         {NULL, NULL, NULL} 
    194 }; 
     281    ZEND_ABSTRACT_ME(jIRestController, get , NULL) 
     282    ZEND_ABSTRACT_ME(jIRestController, post , NULL) 
     283    ZEND_ABSTRACT_ME(jIRestController, put, NULL) 
     284    ZEND_ABSTRACT_ME(jIRestController, delete, NULL) 
     285    {NULL, NULL, NULL} 
     286}; 
     287 
    195288 
    196289/* ------------------------------------- 
     
    220313 
    221314 
     315/* ------------------------------------- 
     316 
     317interface jISimpleCompiler { 
     318    public function compile($aSelector); 
     319} 
     320 
     321*/ 
     322static 
     323ZEND_BEGIN_ARG_INFO_EX(arginfo_jISimpleCompiler_compile, 0, 0, 1) 
     324    ZEND_ARG_INFO(0, aSelector) 
     325ZEND_END_ARG_INFO(); 
     326 
     327 
     328zend_function_entry zend_funcs_jISimpleCompiler[] = { 
     329    ZEND_ABSTRACT_ME(jISimpleCompiler, compile, arginfo_jISimpleCompiler_compile) 
     330    {NULL, NULL, NULL} 
     331}; 
     332 
     333/* ------------------------------------- 
     334interface jIUrlEngine { 
     335  public function parse($scriptNamePath, $pathinfo, $params ); 
     336  public function parseFromRequest($request, $params ); 
     337  public function create($urlact); 
     338} 
     339 
     340*/ 
     341static 
     342ZEND_BEGIN_ARG_INFO_EX(arginfo_jIUrlEngine_parse, 0, 0, 3) 
     343    ZEND_ARG_INFO(0, scriptNamePath) 
     344    ZEND_ARG_INFO(0, pathinfo) 
     345    ZEND_ARG_INFO(0, params) 
     346ZEND_END_ARG_INFO(); 
     347 
     348static 
     349ZEND_BEGIN_ARG_INFO_EX(arginfo_jIUrlEngine_parseFromRequest, 0, 0, 2) 
     350    ZEND_ARG_INFO(0, request) 
     351    ZEND_ARG_INFO(0, params) 
     352ZEND_END_ARG_INFO(); 
     353 
     354static 
     355ZEND_BEGIN_ARG_INFO_EX(arginfo_jIUrlEngine_create, 0, 0, 1) 
     356    ZEND_ARG_INFO(0, urlact) 
     357ZEND_END_ARG_INFO(); 
     358 
     359 
     360zend_function_entry zend_funcs_jIUrlEngine[] = { 
     361    ZEND_ABSTRACT_ME(jIUrlEngine, parse, arginfo_jIUrlEngine_parse) 
     362    ZEND_ABSTRACT_ME(jIUrlEngine, parseFromRequest, arginfo_jIUrlEngine_parseFromRequest) 
     363    ZEND_ABSTRACT_ME(jIUrlEngine, create, arginfo_jIUrlEngine_create) 
     364    {NULL, NULL, NULL} 
     365}; 
     366 
     367 
     368 
    222369#define JELIX_DECLARE_INTERFACE(classname) \ 
    223370    INIT_CLASS_ENTRY(_ce, #classname, zend_funcs_##classname) \ 
     
    231378        zend_class_entry _ce; 
    232379 
     380    JELIX_DECLARE_INTERFACE(jIAcl2Driver) 
     381    JELIX_DECLARE_INTERFACE(jIAclDriver) 
     382    JELIX_DECLARE_INTERFACE(jIAuthDriver) 
     383    JELIX_DECLARE_INTERFACE(jIAuthDriverClass) 
    233384        JELIX_DECLARE_INTERFACE(jICoordPlugin) 
    234         JELIX_DECLARE_INTERFACE(jIAuthDriver) 
    235         JELIX_DECLARE_INTERFACE(jIUrlEngine) 
     385    JELIX_DECLARE_INTERFACE(jIFilteredDatatype) 
     386    JELIX_DECLARE_INTERFACE(jIFormsDatasource) 
     387    JELIX_DECLARE_INTERFACE(jIMultiFileCompiler) 
    236388        JELIX_DECLARE_INTERFACE(jIRestController) 
    237         JELIX_DECLARE_INTERFACE(jISimpleCompiler) 
    238         JELIX_DECLARE_INTERFACE(jIMultiFileCompiler) 
    239389        JELIX_DECLARE_INTERFACE(jISelector) 
    240 
     390    JELIX_DECLARE_INTERFACE(jISimpleCompiler) 
     391    JELIX_DECLARE_INTERFACE(jIUrlEngine) 
     392
  • trunk/ext/jelix/jelix_interfaces.h

    r476 r1079  
    22*  Jelix 
    33*  a php extension for Jelix Framework 
    4 * @copyright Copyright (c) 2006-2007 Laurent Jouanneau 
     4* @copyright Copyright (c) 2006-2008 Laurent Jouanneau 
    55* @author : Laurent Jouanneau 
    66* @link http://jelix.org 
     
    1414#include "php_jelix.h" 
    1515 
    16  
     16extern PHPAPI zend_class_entry * jelix_ce_jIAcl2Driver; 
     17extern PHPAPI zend_class_entry * jelix_ce_jIAclDriver; 
     18extern PHPAPI zend_class_entry * jelix_ce_jIAuthDriver; 
     19extern PHPAPI zend_class_entry * jelix_ce_jIAuthDriverClass; 
    1720extern PHPAPI zend_class_entry * jelix_ce_jICoordPlugin; 
    18 extern PHPAPI zend_class_entry * jelix_ce_jIAuthDriver; 
     21extern PHPAPI zend_class_entry * jelix_ce_jIFilteredDatatype; 
     22extern PHPAPI zend_class_entry * jelix_ce_jIFormsDatasource; 
     23extern PHPAPI zend_class_entry * jelix_ce_jIMultiFileCompiler; 
     24extern PHPAPI zend_class_entry * jelix_ce_jIRestController; 
     25extern PHPAPI zend_class_entry * jelix_ce_jISelector; 
     26extern PHPAPI zend_class_entry * jelix_ce_jISimpleCompiler; 
    1927extern PHPAPI zend_class_entry * jelix_ce_jIUrlEngine; 
    20 extern PHPAPI zend_class_entry * jelix_ce_jIRestController; 
    21 extern PHPAPI zend_class_entry * jelix_ce_jISimpleCompiler; 
    22 extern PHPAPI zend_class_entry * jelix_ce_jIMultiFileCompiler; 
    23 extern PHPAPI zend_class_entry * jelix_ce_jISelector; 
    2428 
    2529PHP_MINIT_FUNCTION(jelix_interfaces); 
  • trunk/ext/jelix/tests/jiurlengine_002.phpt

    r695 r1079  
    2222  } 
    2323 
    24   - Methods [2] { 
     24  - Methods [3] { 
    2525    Method [ <internal:jelix> abstract public method parse ] { 
    2626 
     
    2929        Parameter #1 [ <required> $pathinfo ] 
    3030        Parameter #2 [ <required> $params ] 
     31      } 
     32    } 
     33 
     34    Method [ <internal:jelix> abstract public method parseFromRequest ] { 
     35 
     36      - Parameters [2] { 
     37        Parameter #0 [ <required> $request ] 
     38        Parameter #1 [ <required> $params ] 
    3139      } 
    3240    } 
Download in other formats: Unified Diff Zip Archive