Annotation of rpl/src/date.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 de calcul d'une date
        !            29: ================================================================================
        !            30:   Entrées : pointeur sur un time_t
        !            31: --------------------------------------------------------------------------------
        !            32:   Sorties : pointeur sur un object
        !            33: --------------------------------------------------------------------------------
        !            34:   Effets de bord : néant
        !            35: ================================================================================
        !            36: */
        !            37: 
        !            38: struct_objet *
        !            39: formateur_date(struct_processus *s_etat_processus, struct timeval *horodatage)
        !            40: {
        !            41:    char                    tableau[64 + 1];
        !            42: 
        !            43:    integer8                jour_julien;
        !            44: 
        !            45:    long                    d;
        !            46:    long                    heures;
        !            47:    long                    m;
        !            48:    long                    minutes;
        !            49:    long                    secondes;
        !            50:    long                    y;
        !            51: 
        !            52:    real8                   heure_julienne;
        !            53:    real8                   offset_julien;
        !            54: 
        !            55:    size_t                  taille;
        !            56: 
        !            57:    struct_liste_chainee    *l_element_courant;
        !            58: 
        !            59:    struct_objet            *s_objet;
        !            60: 
        !            61:    struct tm               *stm;
        !            62: 
        !            63:    /*
        !            64:     * Récupération de la structure tm
        !            65:     */
        !            66: 
        !            67:    stm = localtime(&((*horodatage).tv_sec));
        !            68: 
        !            69:    if ((s_objet = allocation(s_etat_processus, LST)) == NULL)
        !            70:    {
        !            71:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !            72:        return(NULL);
        !            73:    }
        !            74: 
        !            75:    /*
        !            76:     * Jour de la semaine
        !            77:     */
        !            78: 
        !            79:    if ((l_element_courant = malloc(sizeof(struct_liste_chainee))) == NULL)
        !            80:    {
        !            81:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !            82:        return(NULL);
        !            83:    }
        !            84: 
        !            85:    (*s_objet).objet = l_element_courant;
        !            86: 
        !            87:    if (((*l_element_courant).donnee = allocation(s_etat_processus, CHN))
        !            88:            == NULL)
        !            89:    {
        !            90:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !            91:        return(NULL);
        !            92:    }
        !            93: 
        !            94:    taille = strftime(tableau, 64, "%A", stm);
        !            95: 
        !            96:    if (((*(*l_element_courant).donnee).objet = malloc((taille + 1) *
        !            97:            sizeof(unsigned char))) == NULL)
        !            98:    {
        !            99:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           100:        return(NULL);
        !           101:    }
        !           102: 
        !           103:    strcpy((unsigned char *) (*(*l_element_courant).donnee).objet, tableau);
        !           104: 
        !           105:    /*
        !           106:     * Quantième du mois
        !           107:     */
        !           108: 
        !           109:    if (((*l_element_courant).suivant = malloc(sizeof(struct_liste_chainee)))
        !           110:            == NULL)
        !           111:    {
        !           112:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           113:        return(NULL);
        !           114:    }
        !           115: 
        !           116:    l_element_courant = (*l_element_courant).suivant;
        !           117: 
        !           118:    if (((*l_element_courant).donnee = allocation(s_etat_processus, INT))
        !           119:            == NULL)
        !           120:    {
        !           121:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           122:        return(NULL);
        !           123:    }
        !           124: 
        !           125:    taille = strftime(tableau, 64, "%d", stm);
        !           126:    sscanf(tableau, "%lld", (integer8 *) (*(*l_element_courant).donnee).objet);
        !           127:    d = (long) (*((integer8 *) (*(*l_element_courant).donnee).objet));
        !           128: 
        !           129:    /*
        !           130:     * Mois
        !           131:     */
        !           132: 
        !           133:    if (((*l_element_courant).suivant = malloc(sizeof(struct_liste_chainee)))
        !           134:            == NULL)
        !           135:    {
        !           136:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           137:        return(NULL);
        !           138:    }
        !           139: 
        !           140:    l_element_courant = (*l_element_courant).suivant;
        !           141: 
        !           142:    if (((*l_element_courant).donnee = allocation(s_etat_processus, CHN))
        !           143:            == NULL)
        !           144:    {
        !           145:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           146:        return(NULL);
        !           147:    }
        !           148: 
        !           149:    taille = strftime(tableau, 64, "%B", stm);
        !           150: 
        !           151:    if (((*(*l_element_courant).donnee).objet = malloc((taille + 1) *
        !           152:            sizeof(unsigned char))) == NULL)
        !           153:    {
        !           154:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           155:        return(NULL);
        !           156:    }
        !           157: 
        !           158:    strcpy((unsigned char *) (*(*l_element_courant).donnee).objet, tableau);
        !           159: 
        !           160:    /*
        !           161:     * Année
        !           162:     */
        !           163: 
        !           164:    if (((*l_element_courant).suivant = malloc(sizeof(struct_liste_chainee)))
        !           165:            == NULL)
        !           166:    {
        !           167:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           168:        return(NULL);
        !           169:    }
        !           170: 
        !           171:    l_element_courant = (*l_element_courant).suivant;
        !           172: 
        !           173:    if (((*l_element_courant).donnee = allocation(s_etat_processus, INT))
        !           174:            == NULL)
        !           175:    {
        !           176:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           177:        return(NULL);
        !           178:    }
        !           179: 
        !           180:    taille = strftime(tableau, 64, "%Y", stm);
        !           181:    sscanf(tableau, "%lld", (integer8 *) (*(*l_element_courant).donnee).objet);
        !           182:    y = (long) (*((integer8 *) (*(*l_element_courant).donnee).objet));
        !           183: 
        !           184:    /*
        !           185:     * Heure
        !           186:     */
        !           187: 
        !           188:    if (((*l_element_courant).suivant = malloc(sizeof(struct_liste_chainee)))
        !           189:            == NULL)
        !           190:    {
        !           191:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           192:        return(NULL);
        !           193:    }
        !           194: 
        !           195:    l_element_courant = (*l_element_courant).suivant;
        !           196: 
        !           197:    if (((*l_element_courant).donnee = allocation(s_etat_processus, INT))
        !           198:            == NULL)
        !           199:    {
        !           200:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           201:        return(NULL);
        !           202:    }
        !           203: 
        !           204:    taille = strftime(tableau, 64, "%H", stm);
        !           205:    sscanf(tableau, "%lld", (integer8 *) (*(*l_element_courant).donnee).objet);
        !           206:    heures = (long) (*((integer8 *) (*(*l_element_courant).donnee).objet));
        !           207: 
        !           208:    /*
        !           209:     * Minutes
        !           210:     */
        !           211: 
        !           212:    if (((*l_element_courant).suivant = malloc(sizeof(struct_liste_chainee)))
        !           213:            == NULL)
        !           214:    {
        !           215:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           216:        return(NULL);
        !           217:    }
        !           218: 
        !           219:    l_element_courant = (*l_element_courant).suivant;
        !           220: 
        !           221:    if (((*l_element_courant).donnee = allocation(s_etat_processus, INT))
        !           222:            == NULL)
        !           223:    {
        !           224:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           225:        return(NULL);
        !           226:    }
        !           227: 
        !           228:    taille = strftime(tableau, 64, "%M", stm);
        !           229:    sscanf(tableau, "%lld", (integer8 *) (*(*l_element_courant).donnee).objet);
        !           230:    minutes = (long) (*((integer8 *) (*(*l_element_courant).donnee).objet));
        !           231: 
        !           232:    /*
        !           233:     * Secondes
        !           234:     */
        !           235: 
        !           236:    if (((*l_element_courant).suivant = malloc(sizeof(struct_liste_chainee)))
        !           237:            == NULL)
        !           238:    {
        !           239:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           240:        return(NULL);
        !           241:    }
        !           242: 
        !           243:    l_element_courant = (*l_element_courant).suivant;
        !           244: 
        !           245:    if (((*l_element_courant).donnee = allocation(s_etat_processus, INT))
        !           246:            == NULL)
        !           247:    {
        !           248:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           249:        return(NULL);
        !           250:    }
        !           251: 
        !           252:    taille = strftime(tableau, 64, "%S", stm);
        !           253:    sscanf(tableau, "%lld", (integer8 *) (*(*l_element_courant).donnee).objet);
        !           254:    secondes = (long) (*((integer8 *) (*(*l_element_courant).donnee).objet));
        !           255: 
        !           256:    /*
        !           257:     * Microsecondes
        !           258:     */
        !           259: 
        !           260:    if (((*l_element_courant).suivant = malloc(sizeof(struct_liste_chainee)))
        !           261:            == NULL)
        !           262:    {
        !           263:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           264:        return(NULL);
        !           265:    }
        !           266: 
        !           267:    l_element_courant = (*l_element_courant).suivant;
        !           268: 
        !           269:    if (((*l_element_courant).donnee = allocation(s_etat_processus, INT))
        !           270:            == NULL)
        !           271:    {
        !           272:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           273:        return(NULL);
        !           274:    }
        !           275: 
        !           276:    (*((integer8 *) (*(*l_element_courant).donnee).objet)) =
        !           277:            (integer8) (*horodatage).tv_usec;
        !           278: 
        !           279:    /*
        !           280:     * Fuseau horaire
        !           281:     */
        !           282: 
        !           283:    if (((*l_element_courant).suivant = malloc(sizeof(struct_liste_chainee)))
        !           284:            == NULL)
        !           285:    {
        !           286:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           287:        return(NULL);
        !           288:    }
        !           289: 
        !           290:    l_element_courant = (*l_element_courant).suivant;
        !           291: 
        !           292:    if (((*l_element_courant).donnee = allocation(s_etat_processus, CHN))
        !           293:            == NULL)
        !           294:    {
        !           295:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           296:        return(NULL);
        !           297:    }
        !           298: 
        !           299:    taille = strftime(tableau, 64, "%Z", stm);
        !           300: 
        !           301:    if (((*(*l_element_courant).donnee).objet = malloc((taille + 1) *
        !           302:            sizeof(unsigned char))) == NULL)
        !           303:    {
        !           304:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           305:        return(NULL);
        !           306:    }
        !           307: 
        !           308:    strcpy((unsigned char *) (*(*l_element_courant).donnee).objet, tableau);
        !           309: 
        !           310:    /*
        !           311:     * Jour de la semaine en numérique
        !           312:     */
        !           313: 
        !           314:    if (((*l_element_courant).suivant = malloc(sizeof(struct_liste_chainee)))
        !           315:            == NULL)
        !           316:    {
        !           317:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           318:        return(NULL);
        !           319:    }
        !           320: 
        !           321:    l_element_courant = (*l_element_courant).suivant;
        !           322: 
        !           323:    if (((*l_element_courant).donnee = allocation(s_etat_processus, INT))
        !           324:            == NULL)
        !           325:    {
        !           326:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           327:        return(NULL);
        !           328:    }
        !           329: 
        !           330:    taille = strftime(tableau, 64, "%u", stm);
        !           331:    sscanf(tableau, "%lld", (integer8 *) (*(*l_element_courant).donnee).objet);
        !           332: 
        !           333:    /*
        !           334:     * Numéro de la semaine
        !           335:     */
        !           336: 
        !           337:    if (((*l_element_courant).suivant = malloc(sizeof(struct_liste_chainee)))
        !           338:            == NULL)
        !           339:    {
        !           340:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           341:        return(NULL);
        !           342:    }
        !           343: 
        !           344:    l_element_courant = (*l_element_courant).suivant;
        !           345: 
        !           346:    if (((*l_element_courant).donnee = allocation(s_etat_processus, INT))
        !           347:            == NULL)
        !           348:    {
        !           349:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           350:        return(NULL);
        !           351:    }
        !           352: 
        !           353:    taille = strftime(tableau, 64, "%W", stm);
        !           354:    sscanf(tableau, "%lld", (integer8 *) (*(*l_element_courant).donnee).objet);
        !           355: 
        !           356:    /*
        !           357:     * Numéro du mois
        !           358:     */
        !           359: 
        !           360:    if (((*l_element_courant).suivant = malloc(sizeof(struct_liste_chainee)))
        !           361:            == NULL)
        !           362:    {
        !           363:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           364:        return(NULL);
        !           365:    }
        !           366: 
        !           367:    l_element_courant = (*l_element_courant).suivant;
        !           368: 
        !           369:    if (((*l_element_courant).donnee = allocation(s_etat_processus, INT))
        !           370:            == NULL)
        !           371:    {
        !           372:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           373:        return(NULL);
        !           374:    }
        !           375: 
        !           376:    taille = strftime(tableau, 64, "%m", stm);
        !           377:    sscanf(tableau, "%lld", (integer8 *) (*(*l_element_courant).donnee).objet);
        !           378:    m = (long) (*((integer8 *) (*(*l_element_courant).donnee).objet));
        !           379: 
        !           380:    /*
        !           381:     * Numéro du jour dans l'année
        !           382:     */
        !           383: 
        !           384:    if (((*l_element_courant).suivant = malloc(sizeof(struct_liste_chainee)))
        !           385:            == NULL)
        !           386:    {
        !           387:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           388:        return(NULL);
        !           389:    }
        !           390: 
        !           391:    l_element_courant = (*l_element_courant).suivant;
        !           392: 
        !           393:    if (((*l_element_courant).donnee = allocation(s_etat_processus, INT))
        !           394:            == NULL)
        !           395:    {
        !           396:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           397:        return(NULL);
        !           398:    }
        !           399: 
        !           400:    taille = strftime(tableau, 64, "%j", stm);
        !           401:    sscanf(tableau, "%lld", (integer8 *) (*(*l_element_courant).donnee).objet);
        !           402: 
        !           403:    /*
        !           404:     * Jours juliens (référence 0 le 24 novembre -4713 dans le calendrier
        !           405:     * grégorien proleptique). Le résultat est séparé en deux, tout
        !           406:     * d'abord la partie entière, puis la partie fractionnaire.
        !           407:     * Cette valeur apparaît dans la liste en deux parties, tout d'abord la
        !           408:     * partie entière, puis la partie fractionnaire.
        !           409:     */
        !           410: 
        !           411:    if (((*l_element_courant).suivant = malloc(sizeof(struct_liste_chainee)))
        !           412:            == NULL)
        !           413:    {
        !           414:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           415:        return(NULL);
        !           416:    }
        !           417: 
        !           418:    l_element_courant = (*l_element_courant).suivant;
        !           419: 
        !           420:    if (((*l_element_courant).donnee = allocation(s_etat_processus, INT))
        !           421:            == NULL)
        !           422:    {
        !           423:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           424:        return(NULL);
        !           425:    }
        !           426: 
        !           427:    if (m < 3)
        !           428:    {
        !           429:        y--;
        !           430:        m += 12;
        !           431:    }
        !           432: 
        !           433:    /*
        !           434:     * À noter : la date de base est toujours dans le calendrier
        !           435:     * grégorien à moins d'avoir un sérieux problème de date
        !           436:     * sur le calculateur.
        !           437:     */
        !           438: 
        !           439:    jour_julien = 1721024 + (365 * y) + (30 * m) + d + ((integer8) (y / 4))
        !           440:            + 2 + ((integer8) (y / 400)) - ((integer8) (y / 100));
        !           441:    heure_julienne = floor(((real8) 0.6001) * (m + 1)) +
        !           442:            (((real8 ) heures) / 24) + (((real8) minutes) / 1440) +
        !           443:            (((real8) secondes + (((real8) (*horodatage).tv_usec) / 1000000))
        !           444:            / 86400) + ((real8) 0.5);
        !           445: 
        !           446:    offset_julien = floor(heure_julienne);
        !           447: 
        !           448:    jour_julien += offset_julien;
        !           449:    heure_julienne -= offset_julien;
        !           450: 
        !           451:    (*((integer8 *) (*(*l_element_courant).donnee).objet)) = jour_julien;
        !           452: 
        !           453:    if (((*l_element_courant).suivant = malloc(sizeof(struct_liste_chainee)))
        !           454:            == NULL)
        !           455:    {
        !           456:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           457:        return(NULL);
        !           458:    }
        !           459: 
        !           460:    l_element_courant = (*l_element_courant).suivant;
        !           461: 
        !           462:    if (((*l_element_courant).donnee = allocation(s_etat_processus, REL))
        !           463:            == NULL)
        !           464:    {
        !           465:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           466:        return(NULL);
        !           467:    }
        !           468: 
        !           469:    (*((real8 *) (*(*l_element_courant).donnee).objet)) = heure_julienne;
        !           470: 
        !           471:    /*
        !           472:     * Temps Unix
        !           473:     */
        !           474: 
        !           475:    if (((*l_element_courant).suivant = malloc(sizeof(struct_liste_chainee)))
        !           476:            == NULL)
        !           477:    {
        !           478:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           479:        return(NULL);
        !           480:    }
        !           481: 
        !           482:    l_element_courant = (*l_element_courant).suivant;
        !           483: 
        !           484:    if (((*l_element_courant).donnee = allocation(s_etat_processus, INT))
        !           485:            == NULL)
        !           486:    {
        !           487:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        !           488:        return(NULL);
        !           489:    }
        !           490: 
        !           491:    (*((integer8 *) (*(*l_element_courant).donnee).objet)) =
        !           492:            (*horodatage).tv_sec;
        !           493: 
        !           494:    /*
        !           495:     * Fermeture de la liste
        !           496:     */
        !           497: 
        !           498:    (*l_element_courant).suivant = NULL;
        !           499: 
        !           500:    return(s_objet);
        !           501: }
        !           502: 
        !           503: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>