Annotation of rpl/src/rplcore.c, revision 1.2

1.1       bertrand    1: /*
                      2: ================================================================================
1.2     ! bertrand    3:   RPL/2 (R) version 4.0.10
1.1       bertrand    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 'rplcore' générant un fichier de débogage
                     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: rplcore(struct_processus *s_etat_processus)
                     40: {
                     41:    file                        *fichier;
                     42: 
                     43:    logical1                    erreur;
                     44:    logical1                    fin_boucle;
                     45: 
                     46:    long                        i;
                     47:    long                        j;
                     48:    long                        longueur_lignes = 65;
                     49: 
                     50:    struct_liste_chainee        *l_base_pile;
                     51:    struct_liste_chainee        *l_element_courant;
                     52: 
                     53:    struct_objet                *s_objet_last;
                     54: 
                     55:    unsigned char               *expression;
                     56:    unsigned char               *nom;
                     57:    unsigned char               *message_erreur;
                     58:    unsigned char               *pile;
                     59:    unsigned char               *ptr;
                     60:    unsigned char               *ptr_bis;
                     61:    unsigned char               registre_langue;
                     62: 
                     63:    (*s_etat_processus).core = d_faux;
                     64: 
                     65:    sf(s_etat_processus, 37);
                     66:    sf(s_etat_processus, 38);
                     67:    sf(s_etat_processus, 39);
                     68:    sf(s_etat_processus, 40);
                     69:    sf(s_etat_processus, 41);
                     70:    sf(s_etat_processus, 42);
                     71: 
                     72:    cf(s_etat_processus, 43);
                     73:    cf(s_etat_processus, 44);
                     74: 
                     75:    sf(s_etat_processus, 45);
                     76: 
                     77:    cf(s_etat_processus, 48);
                     78: 
                     79:    cf(s_etat_processus, 49);
                     80:    cf(s_etat_processus, 50);
                     81: 
                     82:    cf(s_etat_processus, 53);
                     83:    cf(s_etat_processus, 54);
                     84:    cf(s_etat_processus, 55);
                     85:    cf(s_etat_processus, 56);
                     86: 
                     87:    sf(s_etat_processus, 60);
                     88: 
                     89:    registre_langue = (*s_etat_processus).langue;
                     90:    (*s_etat_processus).langue = 'E';
                     91: 
                     92:    message_erreur = messages(s_etat_processus);
                     93: 
                     94:    (*s_etat_processus).langue = registre_langue;
                     95: 
                     96:    if ((nom = malloc((strlen(ds_rplcore) + 64 + 1) * sizeof(unsigned char)))
                     97:            == NULL)
                     98:    {
                     99:        free(message_erreur);
                    100:        return;
                    101:    }
                    102: 
                    103:    snprintf(nom, strlen(ds_rplcore) + 64 + 1,
                    104:            "%s-%lu-%lu", ds_rplcore, (unsigned long) getpid(),
                    105:            (unsigned long) pthread_self());
                    106: 
                    107:    if ((fichier = fopen(nom, "w+")) == NULL)
                    108:    {
                    109:        (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                    110:        free(message_erreur);
                    111:        free(nom);
                    112: 
                    113:        return;
                    114:    }
                    115: 
                    116:    free(nom);
                    117: 
                    118:    if (fprintf(fichier, "// RPL/2 version %s process image\n",
                    119:            d_version_rpl) < 0)
                    120:    {
                    121:        free(message_erreur);
                    122: 
                    123:        (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                    124:        return;
                    125:    }
                    126: 
                    127:    if (fprintf(fichier, "// Process %d\n", (int) getpid()) < 0)
                    128:    {
                    129:        free(message_erreur);
                    130: 
                    131:        (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                    132:        return;
                    133:    }
                    134: 
                    135:    if (fprintf(fichier, "// Source file : %s\n\n",
                    136:            (*s_etat_processus).nom_fichier_source) < 0)
                    137:    {
                    138:        free(message_erreur);
                    139: 
                    140:        (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                    141:        return;
                    142:    }
                    143: 
                    144:    if (fprintf(fichier, "// Error :\n%s [%s at level %lu]\n\n",
                    145:            message_erreur, (*s_etat_processus).instruction_derniere_erreur,
                    146:            (*s_etat_processus).niveau_derniere_erreur) < 0)
                    147:    {
                    148:        free(message_erreur);
                    149: 
                    150:        (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                    151:        return;
                    152:    }
                    153: 
                    154:    free(message_erreur);
                    155: 
                    156:    if (fprintf(fichier, "// Process stack\n\n") < 0)
                    157:    {
                    158:        (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                    159:        return;
                    160:    }
                    161: 
                    162:    l_element_courant = (struct_liste_chainee *)
                    163:            (*s_etat_processus).l_base_pile_processus;
                    164:    i = 0;
                    165: 
                    166:    if (pthread_mutex_trylock(&((*s_etat_processus).mutex)) == 0)
                    167:    {
                    168:        while(l_element_courant != NULL)
                    169:        {
                    170:            if ((*(*((struct_processus_fils *)
                    171:                    (*(*l_element_courant).donnee).objet)).thread)
                    172:                    .processus_detache == d_vrai)
                    173:            {
                    174:                if (fprintf(fichier, "%ld: Process [%d]\n",
                    175:                        i++, (int) (*(*((struct_processus_fils *)
                    176:                        (*(*l_element_courant).donnee).objet)).thread).pid) < 0)
                    177:                {
                    178:                    (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                    179:                    return;
                    180:                }
                    181:            }
                    182:            else
                    183:            {
                    184:                if (fprintf(fichier, "%ld: Thread [%llu] from [%llu]\n",
                    185:                        i++, (unsigned long long) (*(*((struct_processus_fils *)
                    186:                        (*(*l_element_courant).donnee).objet)).thread)
                    187:                        .tid, (unsigned long long)
                    188:                        (*(*((struct_processus_fils *) (*(*l_element_courant)
                    189:                        .donnee).objet)).thread).pid) < 0)
                    190:                {
                    191:                    (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                    192:                    return;
                    193:                }
                    194:            }
                    195: 
                    196:            l_element_courant = (*l_element_courant).suivant;
                    197:        }
                    198: 
                    199:        if (fprintf(fichier, "%ld: Process [%d]\n\n", i,
                    200:                (int) getpid()) < 0)
                    201:        {
                    202:            (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                    203:            return;
                    204:        }
                    205: 
                    206:        pthread_mutex_unlock(&((*s_etat_processus).mutex));
                    207:    }
                    208: 
                    209:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                    210:    {
                    211:        // LAST valide
                    212: 
                    213:        if (fprintf(fichier, "// Arguments\n\n") < 0)
                    214:        {
                    215:            (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                    216:            return;
                    217:        }
                    218: 
                    219:        l_base_pile = NULL;
                    220: 
                    221:        while((*s_etat_processus).l_base_pile_last != NULL)
                    222:        {
                    223:            if (depilement(s_etat_processus, &((*s_etat_processus)
                    224:                    .l_base_pile_last), &s_objet_last) == d_erreur)
                    225:            {
                    226:                return;
                    227:            }
                    228: 
                    229:            if (empilement(s_etat_processus, &l_base_pile, s_objet_last)
                    230:                    == d_erreur)
                    231:            {
                    232:                return;
                    233:            }
                    234:        }
                    235: 
                    236:        if ((*s_etat_processus).l_base_pile != NULL)
                    237:        {
                    238:            ecriture_pile(s_etat_processus, fichier, l_base_pile, 1);
                    239:        }
                    240:        else
                    241:        {
                    242:            if (fprintf(fichier, "   No argument\n") < 0)
                    243:            {
                    244:                (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                    245:                return;
                    246:            }
                    247:        }
                    248: 
                    249:        while(l_base_pile != NULL)
                    250:        {
                    251:            if (depilement(s_etat_processus, &l_base_pile,
                    252:                    &s_objet_last) == d_erreur)
                    253:            {
                    254:                return;
                    255:            }
                    256: 
                    257:            if (empilement(s_etat_processus, &((*s_etat_processus)
                    258:                    .l_base_pile_last), s_objet_last) == d_erreur)
                    259:            {
                    260:                return;
                    261:            }
                    262:        }
                    263:    }
                    264:    else
                    265:    {
                    266:        // LAST invalide
                    267: 
                    268:        if (fprintf(fichier, "// Current stack (LAST disabled)\n") < 0)
                    269:        {
                    270:            (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                    271:            return;
                    272:        }
                    273:    }
                    274: 
                    275:    if (fprintf(fichier, "\n// Stack\n\n") < 0)
                    276:    {
                    277:        (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                    278:        return;
                    279:    }
                    280: 
                    281:    if ((*s_etat_processus).l_base_pile != NULL)
                    282:    {
                    283:        ecriture_pile(s_etat_processus, fichier,
                    284:                (*s_etat_processus).l_base_pile, 1);
                    285:    }
                    286:    else
                    287:    {
                    288:        if (fprintf(fichier, "   Empty stack\n") < 0)
                    289:        {
                    290:            (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                    291:            return;
                    292:        }
                    293:    }
                    294: 
                    295:    if ((*s_etat_processus).s_objet_errone != NULL)
                    296:    {
                    297:        if (fprintf(fichier, "\n// Current evaluation\n") < 0)
                    298:        {
                    299:            (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                    300:            return;
                    301:        }
                    302: 
                    303:        // L'objet ne peut être qu'une expression algébrique ou RPN
                    304: 
                    305:        if (((*(*s_etat_processus).s_objet_errone).type == RPN) ||
                    306:                ((*(*s_etat_processus).s_objet_errone).type == ALG))
                    307:        {
                    308:            l_element_courant = (*(*s_etat_processus).s_objet_errone).objet;
                    309: 
                    310:            if (fprintf(fichier, "\n") < 0)
                    311:            {
                    312:                (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                    313:                return;
                    314:            }
                    315: 
                    316:            while(l_element_courant != NULL)
                    317:            {
                    318:                if ((*l_element_courant).donnee ==
                    319:                        (*s_etat_processus).s_objet_erreur)
                    320:                {
                    321:                    if ((expression = formateur(s_etat_processus, 4,
                    322:                            (*l_element_courant).donnee)) == NULL)
                    323:                    {
                    324:                        return;
                    325:                    }
                    326: 
                    327:                    if ((*(*l_element_courant).donnee).type == CHN)
                    328:                    {
                    329:                        if (fprintf(fichier, " -> \"%s\"\n", expression) < 0)
                    330:                        {
                    331:                            (*s_etat_processus).erreur_systeme =
                    332:                                    d_es_erreur_fichier;
                    333:                            return;
                    334:                        }
                    335:                    }
                    336:                    else
                    337:                    {
                    338:                        if (fprintf(fichier, " -> %s\n", expression) < 0)
                    339:                        {
                    340:                            (*s_etat_processus).erreur_systeme =
                    341:                                    d_es_erreur_fichier;
                    342:                            return;
                    343:                        }
                    344:                    }
                    345:                }
                    346:                else
                    347:                {
                    348:                    if ((expression = formateur(s_etat_processus, 4,
                    349:                            (*l_element_courant).donnee)) == NULL)
                    350:                    {
                    351:                        return;
                    352:                    }
                    353: 
                    354:                    if ((*(*l_element_courant).donnee).type == CHN)
                    355:                    {
                    356:                        if (fprintf(fichier, "    \"%s\"\n", expression) < 0)
                    357:                        {
                    358:                            (*s_etat_processus).erreur_systeme =
                    359:                                    d_es_erreur_fichier;
                    360:                            return;
                    361:                        }
                    362:                    }
                    363:                    else
                    364:                    {
                    365:                        if (fprintf(fichier, "    %s\n", expression) < 0)
                    366:                        {
                    367:                            (*s_etat_processus).erreur_systeme =
                    368:                                    d_es_erreur_fichier;
                    369:                            return;
                    370:                        }
                    371:                    }
                    372:                }
                    373: 
                    374:                free(expression);
                    375:                l_element_courant = (*l_element_courant).suivant;
                    376:            }
                    377:        }
                    378:        else
                    379:        {
                    380:            if ((expression = formateur(s_etat_processus, 4,
                    381:                    (*s_etat_processus).s_objet_errone)) == NULL)
                    382:            {
                    383:                return;
                    384:            }
                    385: 
                    386:            if (fprintf(fichier, "\n%s\n", expression) < 0)
                    387:            {
                    388:                (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                    389:                return;
                    390:            }
                    391: 
                    392:            free(expression);
                    393:        }
                    394:    }
                    395: 
                    396:    if ((*s_etat_processus).longueur_definitions_chainees != 0)
                    397:    {
                    398:        if (fprintf(fichier, "\n// Definitions\n") < 0)
                    399:        {
                    400:            (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                    401:            return;
                    402:        }
                    403: 
                    404:        ptr = (*s_etat_processus).definitions_chainees;
                    405:        i = 0;
                    406:        erreur = d_faux;
                    407: 
                    408:        while(((*ptr) != d_code_fin_chaine) || (erreur == d_vrai))
                    409:        {
                    410:            if ((i % longueur_lignes) == 0)
                    411:            {
                    412:                if (fprintf(fichier, "\n") < 0)
                    413:                {
                    414:                    (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                    415:                    return;
                    416:                }
                    417: 
                    418:                if (erreur == d_vrai)
                    419:                {
                    420:                    if (fprintf(fichier, "PC     :") < 0)
                    421:                    {
                    422:                        (*s_etat_processus).erreur_systeme =
                    423:                                d_es_erreur_fichier;
                    424:                        return;
                    425:                    }
                    426: 
                    427:                    if ((j = i - longueur_lignes) < 0)
                    428:                    {
                    429:                        j = 0;
                    430:                        ptr_bis = (*s_etat_processus).definitions_chainees;
                    431:                    }
                    432:                    else
                    433:                    {
                    434:                        ptr_bis = ptr - longueur_lignes;
                    435:                    }
                    436: 
                    437:                    fin_boucle = d_faux;
                    438: 
                    439:                    while(((*ptr_bis) != d_code_fin_chaine) &&
                    440:                            (fin_boucle == d_faux))
                    441:                    {
                    442:                        if (j == (long) (*s_etat_processus).position_courante)
                    443:                        {
                    444:                            if (fprintf(fichier, ">|<") < 0)
                    445:                            {
                    446:                                (*s_etat_processus).erreur_systeme =
                    447:                                        d_es_erreur_fichier;
                    448:                                return;
                    449:                            }
                    450: 
                    451:                            fin_boucle = d_vrai;
                    452:                        }
                    453:                        else
                    454:                        {
                    455:                            if (fprintf(fichier, " ") < 0)
                    456:                            {
                    457:                                (*s_etat_processus).erreur_systeme =
                    458:                                        d_es_erreur_fichier;
                    459:                                return;
                    460:                            }
                    461:                        }
                    462: 
                    463:                        j++;
                    464:                        ptr_bis++;
                    465:                    }
                    466: 
                    467:                    if (fprintf(fichier, "\n") < 0)
                    468:                    {
                    469:                        (*s_etat_processus).erreur_systeme =
                    470:                                d_es_erreur_fichier;
                    471:                        return;
                    472:                    }
                    473:                }
                    474: 
                    475:                if ((*ptr) != d_code_fin_chaine)
                    476:                {
                    477:                    if (erreur == d_vrai)
                    478:                    {
                    479:                        if (fprintf(fichier, "\n") < 0)
                    480:                        {
                    481:                            (*s_etat_processus).erreur_systeme =
                    482:                                    d_es_erreur_fichier;
                    483:                            return;
                    484:                        }
                    485:                    }
                    486: 
                    487:                    if ((i <= (long) (*s_etat_processus).position_courante) &&
                    488:                            ((i + longueur_lignes) > (long) (*s_etat_processus)
                    489:                            .position_courante))
                    490:                    {
                    491:                        if (fprintf(fichier, "\nError  : ") < 0)
                    492:                        {
                    493:                            (*s_etat_processus).erreur_systeme =
                    494:                                    d_es_erreur_fichier;
                    495:                            return;
                    496:                        }
                    497: 
                    498:                        erreur = d_vrai;
                    499:                    }
                    500:                    else
                    501:                    {
                    502:                        if (fprintf(fichier, "         ") < 0)
                    503:                        {
                    504:                            (*s_etat_processus).erreur_systeme =
                    505:                                    d_es_erreur_fichier;
                    506:                            return;
                    507:                        }
                    508: 
                    509:                        erreur = d_faux;
                    510:                    }
                    511:                }
                    512:                else
                    513:                {
                    514:                    erreur = d_faux;
                    515:                }
                    516:            }
                    517: 
                    518:            if ((*ptr) != d_code_fin_chaine)
                    519:            {
                    520:                if (ufprintf(fichier, "%c", *ptr) < 0)
                    521:                {
                    522:                    (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                    523:                    return;
                    524:                }
                    525: 
                    526:                ptr++;
                    527:            }
                    528: 
                    529:            i++;
                    530:        }
                    531: 
                    532:        if (fprintf(fichier, "\n// End of definitions\n") < 0)
                    533:        {
                    534:            (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                    535:            return;
                    536:        }
                    537:    }
                    538: 
                    539:    if (fprintf(fichier, "\n// Externals\n\n") < 0)
                    540:    {
                    541:        (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                    542:        return;
                    543:    }
                    544: 
                    545:    instruction_externals(s_etat_processus);
                    546: 
                    547:    if (fprintf(fichier, "%s\n", pile =
                    548:            formateur(s_etat_processus, 0, (*(*s_etat_processus).l_base_pile)
                    549:            .donnee)) < 0)
                    550:    {
                    551:        (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                    552:        return;
                    553:    }
                    554: 
                    555:    free(pile);
                    556: 
                    557:    if (fprintf(fichier, "\n// Variables\n\n") < 0)
                    558:    {
                    559:        (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                    560:        return;
                    561:    }
                    562: 
                    563:    instruction_vars(s_etat_processus);
                    564: 
                    565:    if (fprintf(fichier, "%s\n", pile =
                    566:            formateur(s_etat_processus, 0, (*(*s_etat_processus).l_base_pile)
                    567:            .donnee)) < 0)
                    568:    {
                    569:        (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                    570:        return;
                    571:    }
                    572: 
                    573:    free(pile);
                    574: 
                    575:    instruction_drop2(s_etat_processus);
                    576: 
                    577:    if (fclose(fichier) != 0)
                    578:    {
                    579:        (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                    580:        return;
                    581:    }
                    582: 
                    583:    free((*s_etat_processus).instruction_derniere_erreur);
                    584:    (*s_etat_processus).instruction_derniere_erreur = NULL;
                    585: 
                    586:    return;
                    587: }
                    588: 
                    589: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>