Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Kod źródłowy PHP, chyba ext/standard/math.c
Zigi
post
Post #1





Grupa: Zarejestrowani
Postów: 57
Pomógł: 3
Dołączył: 20.11.2004

Ostrzeżenie: (0%)
-----


Pytanie odtyczy kodu źródłowego php.
Czy moze mi ktoś napisać jakie funkcje są wykorzystywane w czasie wykonywania skryptu mniej wiecej takiego:

  1. <?php
  2.  
  3. echo &#092;"(3+3*4)/(4*43-476);
  4.  
  5. ?>


wydaje mi się że w celu wykonania takeigo kodu jest wykorzystywany taki plik jaki dałem w opisie czyli ext/standard/math.c, ale tam są funkcje na funkcje trygonometryczne i podobne.
Czy ktoś mi pomoże?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Jabol
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 1 467
Pomógł: 13
Dołączył: 22.02.2003

Ostrzeżenie: (0%)
-----


coś Ci się chyba Zigi pomieszało.
Po pierwsze do wykonania tego skryptu oprócz inicjalizajnych i cleanupowych funkcji samego php wykorzystuje się tylko jakiś php-owy (albo nawet i nie, może ten z glibc) odpowiednik printf[3].
Po drugie nie ma czegoś takiego jak prosty kalkulator... a już na pewno nie prosty kalkulator obsługujący nawiasy. To już musi być jakiś analizator składni. Jeżeli chcesz prosty kalkulator to kiedyś takowy napisałem, ale on wykonuje wszytko po koleji i ma tylko 4 działania (ale za to obsługa big numbers... z openssl, ale to już mankamenty techniczne). Uruchamiasz: `./bncalc 1 + 2 + 3` itp
Kod
/*
    Adam <adam-wieckowski@tlen.pl> Więckowski @ 30.10.2004

    Compile: gcc -std=gnu99 -lsll -lc -pedantic -o bncalc bncalc.c
   */
#include <stdio.h>
#include <error.h>
#include <errno.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <openssl/bn.h>
#include <openssl/err.h>

int main(int ac, char *av[])
{
    BIGNUM *a, *b, *r;
    char buf[512];
    BN_CTX *ctx=BN_CTX_new();
    a=BN_new();b=BN_new();r=BN_new();
    if(!BN_dec2bn(&r,av[1]))
        goto error;
    for(int i=2;i<=ac;i+=2)
        {
        if((ac-i)<2)
            {
            char *buf=BN_bn2dec(r);
            printf("%s\n", buf);
            /*OPENSSL_*/free(buf);
            BN_free(a);BN_free(b);BN_free(r);
            return 0;
            }
        if(!BN_dec2bn(&b,av[i+1]))
            goto error;
        if(BN_copy(a,r)==NULL)
            goto error;
        switch(*av[i])
            {
            case '+':
            case 'a':
                if(!BN_add(r,a,b))
                    goto error;
                break;
            case '-':
            case 's':
                if(!BN_sub(r,a,b))
                    goto error;
                break;
            case '*':
            case 'm':
            case '.':
                if(!BN_mul(r,a,b,ctx))
                    goto error;
                break;
            case '/':
            case ':':
            case 'd':
                if(!BN_div(r,NULL,a,b,ctx))
                    goto error;
                break;
            }
        }
error:
    fprintf(stderr,"%s\n",ERR_error_string(ERR_get_error(),buf));
    exit(-1);
}

A jeżeli chcesz bardziej elastyczny kalkulator to już musisz rozbić działanie na części, ułożyć zgodnie z kolejnością wykonywania działań.
Zainteresuj się może takimi rzeczami jak http://mathomatic.orgserve.de/math/. To JEST prosty kalkulator (15.000 linii kodu).
A jeżeli chcesz zobaczyć jak robi to php, to zauważ, że on CAŁY jest jednym wielkim analizatorem składni.
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 16.10.2025 - 12:08