Annotation of rpl/src/instructions_v2.c, revision 1.1
1.1 ! bertrand 1: /*
! 2: ================================================================================
! 3: RPL/2 (R) version 4.0.9
! 4: Copyright (C) 1989-2010 Dr. BERTRAND Joël
! 5:
! 6: This file is part of RPL/2.
! 7:
! 8: RPL/2 is free software; you can redistribute it and/or modify it
! 9: under the terms of the CeCILL V2 License as published by the french
! 10: CEA, CNRS and INRIA.
! 11:
! 12: RPL/2 is distributed in the hope that it will be useful, but WITHOUT
! 13: ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
! 14: FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL V2 License
! 15: for more details.
! 16:
! 17: You should have received a copy of the CeCILL License
! 18: along with RPL/2. If not, write to info@cecill.info.
! 19: ================================================================================
! 20: */
! 21:
! 22:
! 23: #include "rpl.conv.h"
! 24:
! 25:
! 26: /*
! 27: ================================================================================
! 28: Fonction 'volatile'
! 29: ================================================================================
! 30: Entrées :
! 31: --------------------------------------------------------------------------------
! 32: Sorties :
! 33: --------------------------------------------------------------------------------
! 34: Effets de bord : néant
! 35: ================================================================================
! 36: */
! 37:
! 38: void
! 39: instruction_volatile(struct_processus *s_etat_processus)
! 40: {
! 41: struct_liste_chainee *l_element_courant;
! 42:
! 43: struct_objet *s_objet;
! 44:
! 45: (*s_etat_processus).erreur_execution = d_ex;
! 46:
! 47: if ((*s_etat_processus).affichage_arguments == 'Y')
! 48: {
! 49: printf("\n VOLATILE ");
! 50:
! 51: if ((*s_etat_processus).langue == 'F')
! 52: {
! 53: printf("(rend volatile une variable statique)\n\n");
! 54: }
! 55: else
! 56: {
! 57: printf("(make volatile a static variable)\n\n");
! 58: }
! 59:
! 60: printf(" 1: %s, %s\n", d_NOM, d_LST);
! 61:
! 62: return;
! 63: }
! 64: else if ((*s_etat_processus).test_instruction == 'Y')
! 65: {
! 66: (*s_etat_processus).nombre_arguments = -1;
! 67: return;
! 68: }
! 69:
! 70: if (test_cfsf(s_etat_processus, 31) == d_vrai)
! 71: {
! 72: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
! 73: {
! 74: return;
! 75: }
! 76: }
! 77:
! 78: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 79: &s_objet) == d_erreur)
! 80: {
! 81: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 82: return;
! 83: }
! 84:
! 85: if ((*s_objet).type == NOM)
! 86: {
! 87: if (recherche_variable(s_etat_processus, ((*((struct_nom *)
! 88: (*s_objet).objet)).nom)) == d_faux)
! 89: {
! 90: liberation(s_etat_processus, s_objet);
! 91:
! 92: (*s_etat_processus).erreur_systeme = d_es;
! 93: (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
! 94: return;
! 95: }
! 96:
! 97: if (((*s_etat_processus).s_liste_variables[(*s_etat_processus)
! 98: .position_variable_courante].origine == 'P')
! 99: ? ((*s_etat_processus).s_liste_variables[(*s_etat_processus)
! 100: .position_variable_courante].variable_statique.adresse == 0)
! 101: : ((*s_etat_processus).s_liste_variables[(*s_etat_processus)
! 102: .position_variable_courante].variable_statique.pointeur
! 103: == NULL))
! 104: {
! 105: liberation(s_etat_processus, s_objet);
! 106:
! 107: (*s_etat_processus).erreur_execution = d_ex_variable_volatile;
! 108: return;
! 109: }
! 110: else
! 111: {
! 112: if (retrait_variable_statique(s_etat_processus,
! 113: (*((struct_nom *) (*s_objet).objet)).nom,
! 114: (*s_etat_processus).s_liste_variables[(*s_etat_processus)
! 115: .position_variable_courante].variable_statique)
! 116: == d_erreur)
! 117: {
! 118: liberation(s_etat_processus, s_objet);
! 119: return;
! 120: }
! 121:
! 122: if ((*s_etat_processus).s_liste_variables[(*s_etat_processus)
! 123: .position_variable_courante].origine == 'P')
! 124: {
! 125: (*s_etat_processus).s_liste_variables[(*s_etat_processus)
! 126: .position_variable_courante].variable_statique.adresse
! 127: = 0;
! 128: }
! 129: else
! 130: {
! 131: (*s_etat_processus).s_liste_variables[(*s_etat_processus)
! 132: .position_variable_courante].variable_statique.pointeur
! 133: = NULL;
! 134: }
! 135: }
! 136: }
! 137: else if ((*s_objet).type == LST)
! 138: {
! 139: l_element_courant = (struct_liste_chainee *) (*s_objet).objet;
! 140:
! 141: while(l_element_courant != NULL)
! 142: {
! 143: if ((*(*l_element_courant).donnee).type != NOM)
! 144: {
! 145: liberation(s_etat_processus, s_objet);
! 146:
! 147: (*s_etat_processus).erreur_execution = d_ex_nom_invalide;
! 148: return;
! 149: }
! 150:
! 151: if (recherche_variable(s_etat_processus, (*((struct_nom *)
! 152: (*(*l_element_courant).donnee).objet)).nom) == d_faux)
! 153: {
! 154: liberation(s_etat_processus, s_objet);
! 155:
! 156: (*s_etat_processus).erreur_systeme = d_es;
! 157: (*s_etat_processus).erreur_execution =
! 158: d_ex_variable_non_definie;
! 159: return;
! 160: }
! 161:
! 162: if (((*s_etat_processus).s_liste_variables[(*s_etat_processus)
! 163: .position_variable_courante].origine == 'P')
! 164: ? ((*s_etat_processus).s_liste_variables[(*s_etat_processus)
! 165: .position_variable_courante].variable_statique.adresse == 0)
! 166: : ((*s_etat_processus).s_liste_variables[(*s_etat_processus)
! 167: .position_variable_courante].variable_statique.pointeur
! 168: == NULL))
! 169: {
! 170: liberation(s_etat_processus, s_objet);
! 171:
! 172: (*s_etat_processus).erreur_execution = d_ex_variable_volatile;
! 173: return;
! 174: }
! 175: else
! 176: {
! 177: if (retrait_variable_statique(s_etat_processus,
! 178: (*((struct_nom *) (*s_objet).objet)).nom,
! 179: (*s_etat_processus).s_liste_variables
! 180: [(*s_etat_processus).position_variable_courante]
! 181: .variable_statique) == d_erreur)
! 182: {
! 183: liberation(s_etat_processus, s_objet);
! 184: return;
! 185: }
! 186:
! 187: if ((*s_etat_processus).s_liste_variables[(*s_etat_processus)
! 188: .position_variable_courante].origine == 'P')
! 189: {
! 190: (*s_etat_processus).s_liste_variables[(*s_etat_processus)
! 191: .position_variable_courante].variable_statique
! 192: .adresse = 0;
! 193: }
! 194: else
! 195: {
! 196: (*s_etat_processus).s_liste_variables[(*s_etat_processus)
! 197: .position_variable_courante].variable_statique
! 198: .pointeur = NULL;
! 199: }
! 200: }
! 201:
! 202: l_element_courant = (*l_element_courant).suivant;
! 203: }
! 204: }
! 205: else
! 206: {
! 207: liberation(s_etat_processus, s_objet);
! 208:
! 209: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
! 210: return;
! 211: }
! 212:
! 213: liberation(s_etat_processus, s_objet);
! 214:
! 215: return;
! 216: }
! 217:
! 218:
! 219: /*
! 220: ================================================================================
! 221: Fonction 'verify'
! 222: ================================================================================
! 223: Entrées :
! 224: --------------------------------------------------------------------------------
! 225: Sorties :
! 226: --------------------------------------------------------------------------------
! 227: Effets de bord : néant
! 228: ================================================================================
! 229: */
! 230:
! 231: void
! 232: instruction_verify(struct_processus *s_etat_processus)
! 233: {
! 234: int position;
! 235:
! 236: integer8 i1;
! 237: integer8 i2;
! 238: integer8 i3;
! 239: integer8 i4;
! 240: integer8 j1;
! 241: integer8 j2;
! 242: integer8 j3;
! 243: integer8 j4;
! 244:
! 245: logical1 drapeau;
! 246: logical1 drapeau_final;
! 247: logical1 drapeau_final_courant;
! 248: logical1 drapeau_prerelease;
! 249: logical1 drapeau_prerelease_courant;
! 250: logical1 last_valide;
! 251:
! 252: struct_liste_chainee *l_element_caracteristiques;
! 253: struct_liste_chainee *l_element_courant;
! 254: struct_liste_chainee *l_element_version;
! 255:
! 256: struct_objet *s_objet_argument;
! 257: struct_objet *s_objet_caracteristiques;
! 258: struct_objet *s_objet_resultat;
! 259:
! 260: unsigned char *chaine_majuscule;
! 261:
! 262: (*s_etat_processus).erreur_execution = d_ex;
! 263:
! 264: if ((*s_etat_processus).affichage_arguments == 'Y')
! 265: {
! 266: printf("\n VERIFY ");
! 267:
! 268: if ((*s_etat_processus).langue == 'F')
! 269: {
! 270: printf("(vérification des caractéristiques du langage)\n\n");
! 271: }
! 272: else
! 273: {
! 274: printf("(checks of the language characteristics)\n\n");
! 275: }
! 276:
! 277: printf(" 1: %s\n", d_LST);
! 278: printf("-> 1: %s (0 or -1)\n\n", d_INT);
! 279:
! 280: if ((*s_etat_processus).langue == 'F')
! 281: {
! 282: printf(" Utilisation :\n\n");
! 283: }
! 284: else
! 285: {
! 286: printf(" Usage:\n\n");
! 287: }
! 288:
! 289: printf(" { { 4 0 0 \"PRERELEASE\" 4 } \"POSTGRESQL\" } VERIFY\n");
! 290: printf(" { { 4 0 0 } } VERIFY\n");
! 291:
! 292: return;
! 293: }
! 294: else if ((*s_etat_processus).test_instruction == 'Y')
! 295: {
! 296: (*s_etat_processus).nombre_arguments = -1;
! 297: return;
! 298: }
! 299:
! 300: if ((last_valide = test_cfsf(s_etat_processus, 31)) == d_vrai)
! 301: {
! 302: if (empilement_pile_last(s_etat_processus, 3) == d_erreur)
! 303: {
! 304: return;
! 305: }
! 306: }
! 307:
! 308: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 309: &s_objet_argument) == d_erreur)
! 310: {
! 311: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 312: return;
! 313: }
! 314:
! 315: if ((*s_objet_argument).type == LST)
! 316: {
! 317: if (last_valide == d_vrai)
! 318: {
! 319: cf(s_etat_processus, 31);
! 320: }
! 321:
! 322: instruction_version(s_etat_processus);
! 323:
! 324: if (last_valide == d_vrai)
! 325: {
! 326: sf(s_etat_processus, 31);
! 327: }
! 328:
! 329: if ((*s_etat_processus).erreur_systeme != d_es)
! 330: {
! 331: return;
! 332: }
! 333:
! 334: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 335: &s_objet_caracteristiques) == d_erreur)
! 336: {
! 337: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 338: return;
! 339: }
! 340:
! 341: /*
! 342: * L'objet renvoyé est obligatoirement une liste.
! 343: */
! 344:
! 345: BUG((*s_objet_caracteristiques).type != LST,
! 346: printf("(*s_objet_caracteristiques).type='%d'\n",
! 347: (*s_objet_caracteristiques).type));
! 348:
! 349: drapeau = d_vrai;
! 350: l_element_courant = (*s_objet_argument).objet;
! 351:
! 352: while((l_element_courant != NULL) && (drapeau == d_vrai))
! 353: {
! 354: if ((*(*l_element_courant).donnee).type == CHN)
! 355: {
! 356: if ((chaine_majuscule = conversion_majuscule((unsigned char *)
! 357: (*(*l_element_courant).donnee).objet)) == NULL)
! 358: {
! 359: (*s_etat_processus).erreur_systeme =
! 360: d_es_allocation_memoire;
! 361: return;
! 362: }
! 363:
! 364: l_element_caracteristiques = (*s_objet_caracteristiques).objet;
! 365:
! 366: while(l_element_caracteristiques != NULL)
! 367: {
! 368: if ((*(*l_element_caracteristiques).donnee).type == CHN)
! 369: {
! 370: if (strcmp((unsigned char *)
! 371: (*(*l_element_caracteristiques).donnee).objet,
! 372: chaine_majuscule) == 0)
! 373: {
! 374: break;
! 375: }
! 376: }
! 377:
! 378: l_element_caracteristiques = (*l_element_caracteristiques)
! 379: .suivant;
! 380: }
! 381:
! 382: free(chaine_majuscule);
! 383:
! 384: if (l_element_caracteristiques == NULL)
! 385: { // La chaîne n'a pas été trouvée...
! 386: drapeau = d_faux;
! 387: break;
! 388: }
! 389: }
! 390: else if ((*(*l_element_courant).donnee).type == LST)
! 391: {
! 392: drapeau_final = d_vrai;
! 393: drapeau_prerelease = d_faux;
! 394: drapeau_final_courant = d_vrai;
! 395: drapeau_prerelease_courant = d_faux;
! 396: i1 = 0;
! 397: i2 = 0;
! 398: i3 = 0;
! 399: i4 = 0;
! 400: j1 = 0;
! 401: j2 = 0;
! 402: j3 = 0;
! 403: j4 = 0;
! 404:
! 405: l_element_version = (*(*l_element_courant).donnee).objet;
! 406: position = 1;
! 407:
! 408: while(l_element_version != NULL)
! 409: {
! 410: switch(position)
! 411: {
! 412: case 1 :
! 413: {
! 414: if ((*(*l_element_version).donnee).type == INT)
! 415: {
! 416: i1 = (*((integer8 *) (*(*l_element_version)
! 417: .donnee).objet));
! 418: }
! 419: else
! 420: {
! 421: liberation(s_etat_processus, s_objet_argument);
! 422: liberation(s_etat_processus,
! 423: s_objet_caracteristiques);
! 424:
! 425: (*s_etat_processus).erreur_execution =
! 426: d_ex_erreur_type_argument;
! 427: return;
! 428: }
! 429:
! 430: break;
! 431: }
! 432:
! 433: case 2 :
! 434: {
! 435: if ((*(*l_element_version).donnee).type == INT)
! 436: {
! 437: i2 = (*((integer8 *) (*(*l_element_version)
! 438: .donnee).objet));
! 439: }
! 440: else
! 441: {
! 442: liberation(s_etat_processus, s_objet_argument);
! 443: liberation(s_etat_processus,
! 444: s_objet_caracteristiques);
! 445:
! 446: (*s_etat_processus).erreur_execution =
! 447: d_ex_erreur_type_argument;
! 448: return;
! 449: }
! 450:
! 451: break;
! 452: }
! 453:
! 454: case 3 :
! 455: {
! 456: if ((*(*l_element_version).donnee).type == INT)
! 457: {
! 458: i3 = (*((integer8 *) (*(*l_element_version)
! 459: .donnee).objet));
! 460: }
! 461: else
! 462: {
! 463: liberation(s_etat_processus, s_objet_argument);
! 464: liberation(s_etat_processus,
! 465: s_objet_caracteristiques);
! 466:
! 467: (*s_etat_processus).erreur_execution =
! 468: d_ex_erreur_type_argument;
! 469: return;
! 470: }
! 471:
! 472: break;
! 473: }
! 474:
! 475: case 4 :
! 476: {
! 477: if ((*(*l_element_version).donnee).type == CHN)
! 478: {
! 479: if ((chaine_majuscule = conversion_majuscule(
! 480: (unsigned char *) (*(*l_element_version)
! 481: .donnee).objet)) == NULL)
! 482: {
! 483: (*s_etat_processus).erreur_systeme =
! 484: d_es_allocation_memoire;
! 485: return;
! 486: }
! 487:
! 488: if (strcmp(chaine_majuscule, "RELEASE") == 0)
! 489: {
! 490: drapeau_final = d_vrai;
! 491: }
! 492: else if (strcmp(chaine_majuscule, "PRERELEASE")
! 493: == 0)
! 494: {
! 495: drapeau_final = d_faux;
! 496: }
! 497: else
! 498: {
! 499: liberation(s_etat_processus,
! 500: s_objet_argument);
! 501: liberation(s_etat_processus,
! 502: s_objet_caracteristiques);
! 503:
! 504: (*s_etat_processus).erreur_execution =
! 505: d_ex_argument_invalide;
! 506: return;
! 507: }
! 508:
! 509: free(chaine_majuscule);
! 510: }
! 511: else
! 512: {
! 513: liberation(s_etat_processus, s_objet_argument);
! 514: liberation(s_etat_processus,
! 515: s_objet_caracteristiques);
! 516:
! 517: (*s_etat_processus).erreur_execution =
! 518: d_ex_erreur_type_argument;
! 519: return;
! 520: }
! 521:
! 522: break;
! 523: }
! 524:
! 525: case 5 :
! 526: {
! 527: if ((*(*l_element_version).donnee).type == INT)
! 528: {
! 529: i4 = (*((integer8 *) (*(*l_element_version)
! 530: .donnee).objet));
! 531: }
! 532: else
! 533: {
! 534: liberation(s_etat_processus, s_objet_argument);
! 535: liberation(s_etat_processus,
! 536: s_objet_caracteristiques);
! 537:
! 538: (*s_etat_processus).erreur_execution =
! 539: d_ex_erreur_type_argument;
! 540: return;
! 541: }
! 542:
! 543: drapeau_prerelease = d_vrai;
! 544: break;
! 545: }
! 546:
! 547: default :
! 548: {
! 549: liberation(s_etat_processus, s_objet_argument);
! 550: liberation(s_etat_processus,
! 551: s_objet_caracteristiques);
! 552:
! 553: (*s_etat_processus).erreur_execution =
! 554: d_ex_erreur_type_argument;
! 555: return;
! 556: break;
! 557: }
! 558: }
! 559:
! 560: position++;
! 561: l_element_version = (*l_element_version).suivant;
! 562: }
! 563:
! 564: if (drapeau_prerelease == drapeau_final)
! 565: {
! 566: liberation(s_etat_processus, s_objet_argument);
! 567: liberation(s_etat_processus, s_objet_caracteristiques);
! 568:
! 569: (*s_etat_processus).erreur_execution =
! 570: d_ex_argument_invalide;
! 571: return;
! 572: }
! 573:
! 574: l_element_caracteristiques = (*s_objet_caracteristiques).objet;
! 575:
! 576: while(l_element_caracteristiques != NULL)
! 577: {
! 578: if ((*(*l_element_caracteristiques).donnee).type == LST)
! 579: {
! 580: l_element_version = (*(*l_element_caracteristiques)
! 581: .donnee).objet;
! 582:
! 583: position = 1;
! 584:
! 585: while(l_element_version != NULL)
! 586: {
! 587: switch(position)
! 588: {
! 589: case 1 :
! 590: {
! 591: j1 = (*((integer8 *) (*(*l_element_version)
! 592: .donnee).objet));
! 593: break;
! 594: }
! 595:
! 596: case 2 :
! 597: {
! 598: j2 = (*((integer8 *) (*(*l_element_version)
! 599: .donnee).objet));
! 600: break;
! 601: }
! 602:
! 603: case 3 :
! 604: {
! 605: j3 = (*((integer8 *) (*(*l_element_version)
! 606: .donnee).objet));
! 607: break;
! 608: }
! 609:
! 610: case 4 :
! 611: {
! 612: drapeau_final_courant =
! 613: (strcmp((unsigned char *)
! 614: (*(*l_element_version).donnee)
! 615: .objet, "RELEASE") == 0)
! 616: ? d_vrai : d_faux;
! 617: break;
! 618: }
! 619:
! 620: case 5 :
! 621: {
! 622: j4 = (*((integer8 *) (*(*l_element_version)
! 623: .donnee).objet));
! 624: drapeau_prerelease_courant = d_vrai;
! 625: break;
! 626: }
! 627: }
! 628:
! 629: position++;
! 630: l_element_version = (*l_element_version).suivant;
! 631: }
! 632:
! 633: break;
! 634: }
! 635:
! 636: l_element_caracteristiques = (*l_element_caracteristiques)
! 637: .suivant;
! 638: }
! 639:
! 640: if (drapeau_prerelease_courant == drapeau_final_courant)
! 641: {
! 642: liberation(s_etat_processus, s_objet_argument);
! 643: liberation(s_etat_processus, s_objet_caracteristiques);
! 644:
! 645: (*s_etat_processus).erreur_execution =
! 646: d_ex_argument_invalide;
! 647: return;
! 648: }
! 649:
! 650: if (i1 > j1)
! 651: { // Version demandée supérieure à la version courante
! 652: drapeau = d_faux;
! 653: }
! 654: else if (i1 == j1)
! 655: {
! 656: if (i2 > j2)
! 657: { // Versions idendiques et sous-version demandée
! 658: // supérieure à la sous-version courante
! 659: drapeau = d_faux;
! 660: }
! 661: else if (i2 == j2)
! 662: { // Versions et sous-versions identiques
! 663: if (i3 > j3)
! 664: { // Niveau de patches demandé supérieur au niveau
! 665: // de patch courant
! 666: drapeau = d_faux;
! 667: }
! 668: else if (i3 == j3)
! 669: { // Niveaux de patches indentiques
! 670: if ((drapeau_final == d_vrai) &&
! 671: (drapeau_final_courant == d_faux))
! 672: { // Finale requise et prerelease obtenue
! 673: drapeau = d_faux;
! 674: }
! 675: else if ((drapeau_final == d_faux) &&
! 676: (drapeau_final_courant == d_vrai))
! 677: { // Prerelease requise et finale obtenue
! 678: }
! 679: else if ((drapeau_final == d_vrai) &&
! 680: (drapeau_final_courant == d_vrai))
! 681: { // Finales de part et d'autre
! 682: }
! 683: else
! 684: { // Prerelease de part et d'autre
! 685: if (i4 > j4)
! 686: { // Prerelease demandée supérieur à la
! 687: // version courante
! 688: drapeau = d_faux;
! 689: }
! 690: }
! 691: }
! 692: else
! 693: { // Niveaux de patches inférieur au niveau courant
! 694: }
! 695: }
! 696: else
! 697: { // Versions indentiques et sous-version inférieure à
! 698: // la sous-version courante
! 699: }
! 700: }
! 701: else
! 702: { // Version demandée inférieure à la version courante
! 703: }
! 704: }
! 705: else
! 706: {
! 707: liberation(s_etat_processus, s_objet_argument);
! 708: liberation(s_etat_processus, s_objet_caracteristiques);
! 709:
! 710: (*s_etat_processus).erreur_execution =
! 711: d_ex_erreur_type_argument;
! 712: return;
! 713: }
! 714:
! 715: l_element_courant = (*l_element_courant).suivant;
! 716: }
! 717:
! 718: liberation(s_etat_processus, s_objet_caracteristiques);
! 719:
! 720: /*
! 721: * Création du drapeau renvoyé
! 722: */
! 723:
! 724: if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
! 725: {
! 726: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 727: return;
! 728: }
! 729:
! 730: (*((integer8 *) (*s_objet_resultat).objet)) = (drapeau == d_vrai)
! 731: ? -1 : 0;
! 732:
! 733: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 734: s_objet_resultat) == d_erreur)
! 735: {
! 736: return;
! 737: }
! 738: }
! 739: else
! 740: {
! 741: liberation(s_etat_processus, s_objet_argument);
! 742:
! 743: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
! 744: return;
! 745: }
! 746:
! 747: liberation(s_etat_processus, s_objet_argument);
! 748:
! 749: return;
! 750: }
! 751:
! 752: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>