Annotation of rpl/src/instructions_j1.c, revision 1.18

1.1       bertrand    1: /*
                      2: ================================================================================
1.17      bertrand    3:   RPL/2 (R) version 4.1.0.prerelease.0
1.15      bertrand    4:   Copyright (C) 1989-2011 Dr. BERTRAND Joël
1.1       bertrand    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: 
1.11      bertrand   23: #include "rpl-conv.h"
1.1       bertrand   24: 
                     25: 
                     26: /*
                     27: ================================================================================
                     28:   Fonction 'jdate'
                     29: ================================================================================
                     30:   Entrées : pointeur sur une structure struct_processus
                     31: --------------------------------------------------------------------------------
                     32:   Sorties :
                     33: --------------------------------------------------------------------------------
                     34:   Effets de bord : néant
                     35: ================================================================================
                     36: */
                     37: 
                     38: void
                     39: instruction_jdate(struct_processus *s_etat_processus)
                     40: {
                     41:    integer8                a;
                     42:    integer8                b;
                     43:    integer8                c;
                     44:    integer8                d;
                     45:    integer8                e;
                     46:    integer8                m;
                     47:    integer8                jour_julien;
                     48: 
                     49:    long                    nombre_elements;
                     50: 
                     51:    real8                   heure_julienne;
                     52: 
                     53:    struct_liste_chainee    *l_element_courant;
                     54: 
                     55:    struct_objet            *s_objet;
                     56:    struct_objet            *s_objet_argument;
                     57: 
                     58:    struct timeval          horodatage;
                     59: 
                     60:    struct tm               stm;
                     61: 
                     62:    (*s_etat_processus).erreur_execution = d_ex;
                     63: 
                     64:    if ((*s_etat_processus).affichage_arguments == 'Y')
                     65:    {
                     66:        printf("\n  JDATE ");
                     67: 
                     68:        if ((*s_etat_processus).langue == 'F')
                     69:        {
                     70:            printf("(conversion d'un jour julien vers un calendrier grégorien"
                     71:                    " proleptique)\n\n");
                     72:        }
                     73:        else
                     74:        {
                     75:            printf("(conversion from julian day to proleptic gregorian"
                     76:                    " calendar)\n\n");
                     77:        }
                     78: 
                     79:        printf("    1: %s\n", d_LST);
                     80:        printf("->  1: %s\n\n", d_LST);
                     81: 
                     82:        if ((*s_etat_processus).langue == 'F')
                     83:        {
                     84:            printf("  Utilisation :\n\n");
                     85:            printf("    { IP FP } JDATE avec IP > 0, 0 <= FP < 1\n\n");
                     86:            printf("  Note :\n\n");
                     87:            printf("    La conversion n'est assurée que si la date est "
                     88:                    "représentable en temps Unix.\n");
                     89:        }
                     90:        else
                     91:        {
                     92:            printf("  Usage:\n\n");
                     93:            printf("    { IP FP } JDATE with IP > 0, 0 <= FP < 1\n\n");
                     94:            printf("  Note :\n\n");
                     95:            printf("    Conversion is only done if date can be computed in "
                     96:                    "Unix time.\n");
                     97:        }
                     98: 
                     99:        return;
                    100:    }
                    101:    else if ((*s_etat_processus).test_instruction == 'Y')
                    102:    {
                    103:        (*s_etat_processus).nombre_arguments = 1;
                    104:        return;
                    105:    }
                    106: 
                    107:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                    108:    {
                    109:        if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
                    110:        {
                    111:            return;
                    112:        }
                    113:    }
                    114: 
                    115:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                    116:            &s_objet_argument) == d_erreur)
                    117:    {
                    118:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                    119:        return;
                    120:    }
                    121: 
                    122:    if ((*s_objet_argument).type == LST)
                    123:    {
                    124:        l_element_courant = (*s_objet_argument).objet;
                    125:        nombre_elements = 0;
                    126: 
                    127:        while(l_element_courant != NULL)
                    128:        {
                    129:            nombre_elements++;
                    130:            l_element_courant = (*l_element_courant).suivant;
                    131:        }
                    132: 
                    133:        if (nombre_elements != 2)
                    134:        {
                    135:            (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
                    136: 
                    137:            liberation(s_etat_processus, s_objet_argument);
                    138:            return;
                    139:        }
                    140: 
                    141:        l_element_courant = (*s_objet_argument).objet;
                    142: 
                    143:        if ((*(*l_element_courant).donnee).type == INT)
                    144:        {
                    145:            jour_julien = (*((integer8 *) (*(*l_element_courant)
                    146:                    .donnee).objet));
                    147: 
                    148:            if (jour_julien < 0)
                    149:            {
                    150:                (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
                    151: 
                    152:                liberation(s_etat_processus, s_objet_argument);
                    153:                return;
                    154:            }
                    155:        }
                    156:        else
                    157:        {
                    158:            (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
                    159: 
                    160:            liberation(s_etat_processus, s_objet_argument);
                    161:            return;
                    162:        }
                    163: 
                    164:        l_element_courant = (*l_element_courant).suivant;
                    165: 
                    166:        if ((*(*l_element_courant).donnee).type == INT)
                    167:        {
                    168:            heure_julienne = (*((integer8 *) (*(*l_element_courant)
                    169:                    .donnee).objet));
                    170:        }
                    171:        else if ((*(*l_element_courant).donnee).type == REL)
                    172:        {
                    173:            heure_julienne = (*((real8 *) (*(*l_element_courant)
                    174:                    .donnee).objet));
                    175:        }
                    176:        else
                    177:        {
                    178:            (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
                    179: 
                    180:            liberation(s_etat_processus, s_objet_argument);
                    181:            return;
                    182:        }
                    183: 
                    184:        if ((heure_julienne < 0) || (heure_julienne >= 1))
                    185:        {
                    186:            (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
                    187: 
                    188:            liberation(s_etat_processus, s_objet_argument);
                    189:            return;
                    190:        }
                    191: 
                    192:        a = jour_julien + 32045;
                    193:        b = ((4 * (a + 36524)) / 146097) - 1;
                    194:        c = a - ((146097 * b) / 4);
                    195:        d = ((4 * (c + 365)) / 1461) - 1;
                    196:        e = c - ((1461 * d) / 4);
                    197:        m = ((5 * (e - 1)) + 2) / 153;
                    198: 
                    199:        stm.tm_mday = e - (((153 * m) + 2) / 5);
                    200:        stm.tm_mon = m + 3 - ((12 * (m / 10)) + 1);
                    201:        stm.tm_year = (100 * b) + (m / 10) + d - (4800 + 1900);
                    202: 
                    203:        heure_julienne *= 24;
                    204:        stm.tm_hour = (int) floor(heure_julienne);
                    205:        heure_julienne -= stm.tm_hour;
                    206:        stm.tm_hour += 12;
                    207: 
                    208:        heure_julienne *= 60;
                    209:        stm.tm_min = (int) floor(heure_julienne);
                    210:        heure_julienne -= stm.tm_min;
                    211: 
                    212:        heure_julienne *= 60;
                    213:        stm.tm_sec = (int) floor(heure_julienne);
                    214:        heure_julienne -= stm.tm_sec;
                    215: 
                    216:        horodatage.tv_sec = mktime(&stm);
                    217:        horodatage.tv_usec = heure_julienne * 1000000;
                    218: 
                    219:        if (horodatage.tv_sec == -1)
                    220:        {
                    221:            liberation(s_etat_processus, s_objet_argument);
                    222: 
                    223:            (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
                    224:            return;
                    225:        }
                    226: 
                    227:        if ((s_objet = formateur_date(s_etat_processus, &horodatage)) == NULL)
                    228:        {
                    229:            liberation(s_etat_processus, s_objet_argument);
                    230:            return;
                    231:        }
                    232: 
                    233:        liberation(s_etat_processus, s_objet_argument);
                    234:    }
                    235:    else
                    236:    {
                    237:        liberation(s_etat_processus, s_objet_argument);
                    238: 
                    239:        (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
                    240:        return;
                    241:    }
                    242: 
                    243:    if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                    244:            s_objet) == d_erreur)
                    245:    {
                    246:        return;
                    247:    }
                    248: 
                    249:    return;
                    250: }
                    251: 
                    252: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>