─εßαΓδσφΦσ Γα°Φ⌡ ±εß±≥Γσφφ√⌡ Γφ≤≥≡σφφΦ⌡ ⌠≤φΩ÷ΦΘ Ω PHP/FI

╠εµσ≥ ±δ≤≈Φ≥ⁿ±  ≥αΩ, ≈≥ε φαßε≡ ⌠≤φΩ÷ΦΘ, εßσ±∩σ≈ΦΓασ∞√⌡ PHP/FI φσ ΓΩδ■≈ασ≥ Γ ±σß  ±∩σ÷Φ⌠Φ≈σ±Ω≤■ ⌠≤φΩ÷Φ■, Γ Ωε≥ε≡α  ∞εµσ≥ Γα∞ ∩ε≥≡σßεΓα≥ⁿ± . ╥∙α≥σδⁿφε ±δσΣ≤  ∩≤φΩ≥α∞, ε∩Φ±αφφ√∞ φΦµσ, Γ√ ±∞εµσ≥σ ΣεßαΓΦ≥ⁿ Γα°Φ ±εß±≥Γσφφ√σ ⌠≤φΩ÷ΦΦ PHP/FI.

╧≡σµΣσ, ≈σ∞ ┬√ φα≈φσ≥σ ⌡α≈Φ≥ⁿ Γφ≤≥≡σφφ■■ ε≡παφΦτα÷Φ■ PHP/FI, φ≤µφε φαΘ≥Φ Ωε∩Φ■ ∩ε±δσΣφσΘ Γσ≡±ΦΦ Bison. Bison - GNU ≡σαδΦτα÷Φ  YACC (Yet Another Compiler Compiler). YACC, Ωε≥ε≡√Θ °σδ ± Γα°σΘ ε∩σ≡α÷ΦεφφεΘ ±Φ±≥σ∞εΘ, ∞εµσ≥ εΩατα≥ⁿ± , α ∞εµσ≥ Φ φσ εΩατα≥ⁿ±  Σε±≥α≥ε≈φε ∩≡Φσ∞δΦ∞√∞, φε ∩≡ε±≥ε ≈≥εß√ ≤Σε±≥εΓσ≡Φ≥ⁿ± , δ≤≈°σ Σεß√≥ⁿ Bison. ┬√ ∞εµσ≥σ φαΘ≥Φ σπε Γ ftp://prep.ai.mit.edu/pub/gnu.

═≤µφε ≥αΩµσ ∩≡ε±∞ε≥≡σ≥ⁿ Makefile Φ ΓΩδ■≈Φ≥ⁿ ε≥δαΣΩ≤. ╧≡ε±≥ε ≡ατΩε∞∞σφ≥Φ≡≤Θ≥σ ±≥≡εΩ≤ DEBUG Γ ⌠αΘδσ Makefile. ┬√⌡εΣφεΘ ⌠αΘδ Φφ⌠ε≡∞α÷ΦΦ ε≥δαΣΩΦ ε∩≡σΣσδ σ≥±  ∩σ≡σ∞σφφεΘ DEBUG_FILE Γ php.h. ╧ε ≤∞εδ≈αφΦ■ ≤±≥αφεΓδσφ Γ /tmp/php.err. ┬√ ∞εµσ≥σ Φτ∞σφ ≥ⁿ σπε, ±επδα±φε Γα°Φ∞ ∩ε≥≡σßφε±≥ ∞.

╟αΩδ■≈Φ≥σδⁿφα  Γσ∙ⁿ Ωε≥ε≡≤■ φ≤µφε Φ∞σ≥ⁿ Γ ΓΦΣ≤ - ≥ε, ≈≥ε php Γ√∩εδφ σ≥±  ± ≥σ∞ µσ ΦΣσφ≥Φ⌠ΦΩα≥ε≡ ∩εδⁿτεΓα≥σδ  ≈≥ε Φ httpd φα Γα°σΘ ±Φ±≥σ∞σ, σ±δΦ Ωεφσ≈φε ┬√ φσ Γ√∩εδφ σ≥σ, σπε ± ≤±≥αφεΓδσφφ√∞ ßΦ≥ε∞ setuid, Φ ²≥ε≥ ∩εδⁿτεΓα≥σδⁿ httpd Γεεß∙σ φσ Φ∞σσ≥ Σε±≥≤∩α Σδ  τα∩Φ±Φ Ω ≡ατδΦ≈φ√∞ Ωα≥αδεπα∞. ▌≥ε ετφα≈ασ≥ ²≥ε, σ±δΦ ┬√ Σσδασ≥σ ≈≥ε-δΦßε, ≈≥ε Γ√τ√Γασ≥ php Ω Σα∞∩≤ ∩α∞ ≥Φ, ┬√ ∞εµσ≥σ φσ ∩εδ≤≈Φ≥ⁿ ⌠αΘδ Σα∞∩α. ╧≡ε±≥εΘ ±∩ε±εß ≡σ°σφΦ  ±ε±≥εΦ≥ Γ ≥ε∞ ≈≥ε φ≤µφε ±Σσδα≥ⁿ Ωα≥αδεπ, πΣσ ┬√ ⌡≡αφΦ≥σ Γα° ≥σ±≥εΓ√σ .html ⌠αΘδ√, Σε±≥≤∩φ√∞ Γ±σ∞ ∩ε τα∩Φ±Φ. PHP Φτ∞σφ σ≥ ≥σΩ≤∙ΦΘ Ωα≥αδεπ φα Ωα≥αδεπ .html ⌠αΘδα, Ωε≥ε≡√Θ ±≈Φ≥ασ≥√Γασ≥± , Φ ≥αΩΦ∞ εß≡ατε∞ ε≥ß≡α±√Γα≥ⁿ Ωε≡Ω≤ ≥≤Σα, σ±δΦ ±∞εµσ≥.

┬ ∩ε±δσΣ≤■∙Φ⌡ °απα⌡ ∞√ ß≤Σσ∞ Φ±∩εδⁿτεΓα≥ⁿ ⌠≤φΩ÷Φ■ Time(), Σδ  Φδδ■±≥≡Φ≡α÷ΦΦ, ΩαΩ ΣεßαΓΦ≥ⁿ ⌠≤φΩ÷Φ■.

╪απ 1 - ╬∩≡σΣσδσφΦσ π≡α∞∞α≥ΦΩΦ Γα°σΘ ╘≤φΩ÷ΦΦ

σ±δΦ Γα°α ⌠≤φΩ÷Φ  ∩≡ΦφΦ∞ασ≥ ε≥ 0 Σε 6 α≡π≤∞σφ≥εΓ, ≥ε Σε±≥≤∩φ√ - ∩≡σΣε∩≡σΣσδσφφ√σ π≡α∞∞α≥ΦΩΦ. ┬√ ∞εµσ≥σ ∩≡ε∩≤±≥Φ≥ⁿ ²≥ε≥ °απ.

├≡α∞∞α≥ΦΩα Γα°σΘ ⌠≤φΩ÷ΦΦ ε∩≡σΣσδ σ≥±  Γ ⌠αΘδσ parse.raw. ╧σ≡Γ√∞ Σσδε∞ φ≤µφε ΣεßαΓΦ≥ⁿ δσΩ±σ∞≤. ╦σΩ±σ∞α - Ωδ■≈σΓεσ ±δεΓε, Φτ ß≤ΩΓ Γσ≡⌡φσπε ≡σπΦ±≥≡α, Ωε≥ε≡εσ εß√≈φε ±εΓ∩αΣασ≥ ± Φ∞σφσ∞ Γα°σΘ ⌠≤φΩ÷ΦΦ. ┬±σ δσΩ±σ∞√ ε∩≡σΣσδσφ√ Γφα≈αδσ ⌠αΘδα parse.raw. ╧ε≡ ΣεΩ φσ Φ∞σσ≥ τφα≈σφΦ . ╟α≥σ∞ φ≤µφε ±⌠ε≡∞Φ≡εΓα≥ⁿ ⌠αΩ≥Φ≈σ±Ωεσ ∩≡αΓΦδε π≡α∞∞α≥ΦΩΦ YACC. ╨α±±∞ε≥≡Φ≥σ ±≤∙σ±≥Γ≤■∙Φσ ∩≡αΓΦδα, Φ φαΘΣΦ≥σ ⌠≤φΩ÷Φ■, Ωε≥ε≡α  ∩ε⌡εµα φα ΣεßαΓδ σ∞≤■. ╚∞σΘ≥σ Γ ΓΦΣ≤, ≈≥ε ßεδⁿ°Φφ±≥Γε φε≡∞αδⁿφ√⌡ ⌠≤φΩ÷ΦΦ - ±≥αφΣα≡≥φ√σ ⌠≤φΩ÷ΦΦ, Ωε≥ε≡√σ ±≈Φ≥√Γα■≥ ∩α≡α∞σ≥≡√ Φτ ±≥σΩα Γ√≡αµσφΦΘ. ┬α°α ⌠≤φΩ÷Φ  ±Ωε≡σσ Γ±σπε ß≤Σσ≥ ε≥φσ±σφα Ω ²≥εΘ π≡≤∩∩σ, Γ ²≥ε∞ ±δ≤≈ασ Γα∞ φσ φ≤µφε ß≤Σσ≥ ≥≡επα≥ⁿ ⌠αΘδ parse.raw.

╪απ 2 - ─εßαΓδσφΦσ Γα°σΘ ⌠≤φΩ÷ΦΦ Ω ⌡²°-≥αßδΦ÷σ δσΩ±Φ≈σ±Ωεπε αφαδΦτα≥ε≡α

≈≥εß√ ±Σσδα≥ⁿ ²≥ε, ∩εΣ≡σΣαΩ≥Φ≡≤Θ≥σ lex.c, Φ φαΘΣΦ≥σ ⌡²°-≥αßδΦ÷≤ ΓßδΦτΦ Γσ≡⌡φσΘ ≈α±≥Φ ⌠αΘδα. ═αΘΣΦ≥σ ±≥≡εΩ≤, static cmd_table_t cmd_table[22][30] = {, Ωε≥ε≡α  ε∩≡σΣσδ σ≥ φα≈αδε ⌡²°-≥αßδΦ÷√. [22] [30] ε∩≡σΣσδ σ≥ ≡ατ∞σ≡ 2 ∞σ≡φεπε ∞α±±ΦΓα, Ωε≥ε≡√Θ ±εΣσ≡µΦ≥ ⌡²°-≥αßδΦ÷≤. 22 ²≥ε φα σΣΦφΦ÷≤ ßεδⁿ°α  ∞αΩ±Φ∞αδⁿφα  ΣδΦφα Φ∞σφΦ ⌠≤φΩ÷ΦΦ, Φ 30 ε≥φε±Φ≥±  Ω ∞αΩ±Φ∞αδⁿφε∞≤ ≈Φ±δ≤ ⌠≤φΩ÷ΦΘ Γ δ■ßε∞ ⌡²° ±∩Φ±Ωσ. ┼±δΦ ┬√ ∩≡σΓ√°ασ≥σ δ■ßεσ Φτ ²≥Φ⌡ επ≡αφΦ≈σφΦΘ, ∩≡ε±≥ε ≤ΓσδΦ≈ⁿ≥σ Φ⌡ ∩≡ ∞ε τΣσ±ⁿ.

▌≥α ⌡²°-≥αßδΦ÷α ταΓεσΓαδα ß√ Γ ±ε≡σΓφεΓαφΦ ⌡ αß±εδ■≥φεσ τΓαφΦσ ±α∞εΘ ∩≡ε±≥εΘ ⌡²°-≥αßδΦ÷√ Γε Γ±σ∞ ∞Φ≡σ. ╒²° τφα≈σφΦσ - ²≥ε ΣδΦφα ±≥≡εΩΦ Φ∞σφΦ ⌠≤φΩ÷ΦΦ, Ωε≥ε≡≤■ φ≤µφε ⌡²°Φ≡εΓα≥ⁿ. ╥αΩ Σδ  φα°σπε ∩≡Φ∞σ≡α Time(), φ≤µφε ΣεßαΓΦ≥ⁿ Γ⌡εΣ Σδ  τφα≈σφΦ  ⌡²°α 4 . ╥αΩΦ∞ εß≡ατε∞ ∞√ ΣεßαΓδ σ∞ ±δσΣ≤■∙≤■ ±≥≡εΩ≤ Ω ⌡²°-±∩Φ±Ω≤ Σδ  4:

	{ "time",INTFUNC0,UnixTime },

▌≥ε≥ τα∩Φ±ⁿ ε≥εß≡αµασ≥ ±≥≡εΩ≤ φα δσΩ±σ∞≤ INTFUNC0. ┬√ ∞εµσ≥σ ∩εΦ±Ωα≥ⁿ π≡α∞∞α≥ΦΩ≤ Σδ  δσΩ±σ∞√ INTFUNC0 Γ parse.raw, Φ ≤ΓΦΣσ≥σ, ≈≥ε ²≥ε - εß∙α  π≡α∞∞α≥ΦΩα Σδ  Γφ≤≥≡σφφσπε Γ√τεΓα ⌠≤φΩ÷ΦΦ ßστ ∩α≡α∞σ≥≡εΓ. ╤≥≡εΩα Γ ΩαΓ√≈Ωα⌡,  Γδ σ≥±  ⌠αΩ≥Φ≈σ±ΩεΘ ±≥≡εΩεΘ, Ωε≥ε≡α  ß≤Σσ≥ Φ±∩εδⁿτεΓα≥ⁿ±  Γ .html ⌠αΘδα⌡, Σδ  Γ√τεΓα ⌠≤φΩ÷Φ■. ╚∞σΘ≥σ Γ ΓΦΣ≤, ≈≥ε Φ∞σφα ⌠≤φΩ÷ΦΦ PHP/FI ≡σπΦ±≥≡εφσταΓΦ±Φ∞√. ╚ ταΩδ■≈Φ≥σδⁿφ√Θ ²δσ∞σφ≥ - UnixTime, ²≥ε ≡σαδⁿφε Γ√τ√Γασ∞α  ⌠≤φΩ÷Φ .

╪απ 3 - ═α∩Φ±αφΦσ Γα°σΘ ≡σαδßφεΘ ⌠≤φΩ÷ΦΦ ┬√ ∞εµσ≥σ ⌠αΩ≥Φ≈σ±ΩΦ ∩Φ±α≥ⁿ Γα°≤ ⌠≤φΩ÷Φ■ φα δ■ßε∞  τ√Ωσ, Ωε≥ε≡√Θ Γα∞ φ≡αΓΦ≥± , δΦ°ⁿ ß√ ≥εδⁿΩε εφ ∩εΣΣσ≡µΦΓαδ ±επδα°σφΦσ ε Γ√τεΓα⌡ Σδ  φε≡∞αδⁿφ√⌡ ⌠≤φΩ÷ΦΘ C, Φ ≤ Γα± σ±≥ⁿ Γ√ßε≡ ±ετΣα≥ⁿ δΦ σσ εß·σΩ≥φ√∞ ⌠αΘδε∞ ΦδΦ ßΦßδΦε≥σ≈φ√∞ ⌠αΘδε∞, ±εΓ∞σ±≥Φ∞√∞ ± Ωε∞∩εφεΓ∙ΦΩε∞ φα Γα°σΘ ±Φ±≥σ∞σ. ┬εεß∙σ, ∞√ ß≤Σσ∞ ∩≡σΣ∩εδαπα≥ⁿ, ≈≥ε ⌠≤φΩ÷Φ■ φα∩Φ±αφα φα C. ┬±σ ⌠≤φΩ÷ΦΦ, ΦΣ≤∙Φσ ± PHP/FI, ß√δΦ φα∩Φ±αφ√ φα C. ╘≤φΩ÷Φ  Time() ΦδΦ UnixTime(), ΩαΩ εφα Γ√τ√Γασ≥±  Γφ≤≥≡Φ PHP, ∞εµσ≥ ß√≥ⁿ φαΘΣσφα Γ ⌠αΘδσ date.c Φ Γ√πδ ΣΦ≥:

	void UnixTime(void) { 
	    char temp[32];
	    sprintf(temp,"%ld",(long)time(NULL)); 
	    Push(temp,LNUMBER);
	}

╬ß≡α≥Φ≥σ ΓφΦ∞αφΦσ, ≈≥ε ⌠≤φΩ÷Φ   Γδ σ≥±  ⌠≤φ÷ΦσΘ void.▌≥ε ≤Ωατ√Γασ≥, ≈≥ε εφα φσ ΓετΓ≡α∙ασ≥ φΦ≈σπε. ▌≥ε ∞εµσ≥ ∩εΩατα≥ⁿ±  ∩≤≥αφφ√∞, ∩ε≥ε∞≤ ≈≥ε ε≈σΓΦΣφε ⌠≤φΩ÷Φ  ≥αΩ ΦδΦ Φφα≈σ Σεδµφα ΓετΓ≡α≥Φ≥ⁿ Γ≡σ∞ . ┬≡σ∞  ΓετΓ≡α∙ασ≥± , φε φσ ΩαΩ τφα≈σφΦσ ΓετΓ≡α∙ασ∞εσ ⌠≤φΩ÷ΦσΘ. ╬φε ∩ε∞σ∙ασ≥±  Γ ≥ε, ≈≥ε φατ√Γασ≥±  ±≥σΩε∞ Γ√≡αµσφΦΘ. ╤≥σΩ Γ√≡αµσφΦΘ - ∩≡ε±≥ε ±≥σΩ ±≥≡εΩ Φ ±Γ ταφφ√⌡ ± φΦ∞Φ ≥Φ∩εΓ. PHP/FI ∩εφΦ∞ασ≥ ≥εδⁿΩε 3 ε±φεΓφ√⌡ ≥Φ∩α ∩σ≡σ∞σφφ√⌡: STRING, LNUMBER Φ DNUMBER. STRING - ±Φ∞Γεδⁿφα  ±≥≡εΩα, LNUMBER - ΣδΦφφεσ ÷σδεσ ≈Φ±δε, Φ DNUMBER - τφα≈σφΦσ double ΦδΦ float. ┬ ²≥ε∞ ∩≡Φ∞σ≡σ Time() , τφα≈σφΦσ, Ωε≥ε≡εσ ß≤Σσ≥ ΓετΓ≡α∙σφε - Γ≡σ∞ , Γ√≡αµσφφεσ Γ ⌠ε≡∞α≥σ Unix (≈Φ±δε ±σΩ≤φΣ φα≈Φφα  ±  φΓα≡ . 1 1970) Φ - ≥αΩΦ∞ εß≡ατε∞ ÷σδεσ ≈Φ±δε. ╤≥σΩ Γ√≡αµσφΦ  ∩≡ΦφΦ∞ασ≥ ≥εδⁿΩε ±≥≡εΩΦ, ≥αΩΦ∞ εß≡ατε∞ ∞√ ∩≡σεß≡ατ≤σ∞, ± ∩ε∞ε∙ⁿ■ sprintf, ΣδΦφφεσ ÷σδεσ ≈Φ±δε Γ ±≥≡εΩ≤ Φ ∩ε∞σ∙ασ∞ ²≥ε τφα≈σφΦσ Γ ±≥σΩ, ≤Ωατ√Γα , ≈≥ε ²≥ε ⌠αΩ≥Φ≈σ±ΩΦ  Γδ σ≥±  ΣδΦφφ√∞ ÷σδ√∞ ≈Φ±δε∞ ± ∩ε∞ε∙ⁿ■ ±≥≡εΩΦ: Push(temp,LNUMBER);

╪απ 4 - ─εßαΓδσφΦσ ∩≡ε≥ε≥Φ∩α Γα°σΘ ⌠≤φΩ÷ΦΦ Γ php.h

┬ φΦµφσΘ ∩εδεΓΦφσ ⌠αΘδα php.h ┬√ φαΘΣσ≥σ ∩εδφ√Θ ±∩Φ±εΩ ∩≡ε≥ε≥Φ∩εΓ Γ±σ⌡ ⌠≤φΩ÷ΦΘ Γ php. ╬φΦ ±π≡≤∩∩Φ≡εΓαφ√ ∩ε ⌠αΘδα∞, Γ Ωε≥ε≡√⌡ εφΦ ∩ε Γδ ■≥± . ╧≡ε±≥ε ΣεßαΓⁿ≥σ Γα° ∩≡ε≥ε≥Φ∩ Ω ±εε≥Γσ≥±≥Γ≤■∙σ∞≤ ∞σ±≥≤ Γ ²≥ε∞ ⌠αΘδσ. ┬ φα°σπε ∩≡Φ∞σ≡α Time() ß≤Σσ≥ ΣεßαΓδσφα ±δσΣ≤■∙α  ±≥≡εΩα:

	void UnixTime(void);

╪απ 5 - ╩ε∞∩ΦδΦ≡εΓαφΦσ

┬√ Σεδµφ√ ∩ε∞φΦ≥ⁿ ε ≥ε∞ ≈≥ε φ≤µφε ∩σ≡σΣσδ√Γα≥ⁿ ±Φφ≥αΩ±Φ≈σ±ΩΦΘ αφαδΦτα≥ε≡ Γ± ΩΦΘ ≡ατ, ΩεπΣα Φτ∞σφσφ σ≥±  ⌠αΘδ parse.raw. ┬ΓσΣΦ≥σ: make parser, ≈≥εß√ ±Σσδα≥ⁿ ²≥ε. ╟α≥σ∞ ±ΣσδαΘ≥σ φε≡∞αδⁿφ≤■ Ωε∞∩Φδ ÷Φ■, ΓΓσΣ : make, σ±δΦ ≥εδⁿΩε ²≥ε Γ√∩εδφσφε.

╪απ 6 - ┬√°δΦ≥σ ∞φσ Γα°Φ ΣεßαΓδσφΦ ! ┼±δΦ ┬√ ⌡ε≥Φ≥σ, ≈≥εß√ Γα°Φ ⌠≤φΩ÷ΦΦ, ß√δΦ ΣεßαΓδσφφ√ Ω ±δσΣ≤■∙σ∞≤ Γ√∩≤±Ω≤ PHP/FI, ∩ε°δΦ≥σ Φ⌡ ∞φσ. ┬ετ∞εµφε ±α∞√Θ δ≤≈°ΦΘ ±∩ε±εß ²≥ε ±Σσδα≥ⁿ - ²≥ε ± ∩ε∞ε∙ⁿ■ Ωεφ≥σΩ±≥φε-ταΓΦ±Φ∞επε diff. ╫≥εß√ ±Σσδα≥ⁿ ²≥ε, Γα∞ φ≤µφα ß≤Σσ≥ Ωε∩Φ  φσ∞εΣΦ⌠Φ÷Φ≡εΓαφφεΘ ΣΦ±≥≡Φß≤÷ΦΦ. ╧≡ε±≥ε ±ΣσδαΘ≥σ, diff -c, Σδ  ⌠αΘδεΓ, Ωε≥ε≡√σ ß√δΦ Φτ∞σφσφ√, ±≡αΓφΦΓα  Φ⌡ ± ∩σ≡Γεφα≈αδⁿφ√∞Φ ⌠αΘδ∞Φ. ╧εµαδ≤Θ±≥α φσ Γ√±√δαΘ≥σ ∞φσ Φτ∞σφσφΦ  Γ ⌠αΘδσ parse.c, ≥αΩ ΩαΩ ≥ε≥ ⌠αΘδ πσφσ≡Φ≡≤σ≥±  αΓ≥ε∞α≥Φ≈σ±ΩΦ. ┬∞σ±≥ε ²≥επε Γ√±√δαΘ≥σ ∞φσ ≡ατδΦ≈Φ  Γ ⌠αΘδσ parse.raw.

Time() - ²≥ε ∩≡Φ∞σ≡, Φδδ■±≥≡Φ≡≤■∙ΦΘ °απΦ, ∩≡Φ ΣεßαΓδσφΦΦ ⌠≤φΩ÷ΦΦ. ┬ετ∞εµφε, ≈≥ε ⌠≤φΩ÷Φ , Ωε≥ε≡≤■ ┬√ τα⌡ε≥Φ≥σ ΣεßαΓΦ≥ⁿ ß≤Σσ≥ φσ∞φεπε ßεδσσ ±δεµφεΘ ≈σ∞ ²≥ε≥ ∩≡Φ∞σ≡. ┬ετ∞εµφε Γ√ τα⌡ε≥Φ≥σ ∩σ≡σΣαΓα≥ⁿ ∩α≡α∞σ≥≡√ Γα°σΘ ⌠≤φΩ÷ΦΦ Φ ∞αφΦ∩≤δΦ≡εΓα≥ⁿ ²≥Φ∞Φ ∩α≡α∞σ≥≡α∞Φ ΩαΩΦ∞-δΦßε ±∩ε±εßε∞. ┬ετ∞εµφε Γ√ Σαµσ τα⌡ε≥Φ≥σ ≈≥εß√ εφα Γ√τ√Γαδα±ⁿ ≡ατδΦ≈φ√∞Φ ±∩ε±εßα∞Φ. ▌≥Φ ∩εφ ≥Φ  ß≤Σ≤≥ ∩≡εΦδδ■±≥≡Φ≡εΓαφ√ PHP/FI ⌠≤φΩ÷ΦσΘ Crypt(). ╤∞. ≥αΩµσ ≡ατΣσδ, εταπδαΓδσφφ√Θ ╟α∞σ≈αφΦ  ∩ε ⌡αΩαφΦ■ ╩εΣα Σδ  φσ±ΩεδⁿΩε ßεδⁿ°σπε ≈Φ±δα ≥σ⌡φΦ≈σ±ΩΦ⌡ Σσ≥αδσΘ ε≥φε±Φ≥σδⁿφε φα∩Φ±αφΦ  ΩεΣα Σδ  PHP/FI.

├≡α∞∞α≥ΦΩα Crypt() Γ parse.raw:

%token CRYPT
        .
        .
        .
    | CRYPT '(' expr ',' expr ')'
        {
            if(GetCurrentState(NULL) || inCase || inElseIf) Crypt(1);
        }
    | CRYPT '(' expr ')'
        {
            if(GetCurrentState(NULL) || inCase || inElseIf) Crypt(0);
        }

╟Σσ±ⁿ ∩εΩαταφε, ΩαΩ ε∩≡σΣσδΦ≥ⁿ π≡α∞∞α≥ΦΩ≤, Ωε≥ε≡α  ∩ετΓεδ σ≥, Γ√τ√Γα≥ⁿ ⌠≤φΩ÷Φ■ ± 1 ΦδΦ 2 ∩α≡α∞σ≥≡α∞Φ. ┬√ ∞εµσ≥σ φα∩Φ±α≥ⁿ ≡ατδΦ≈φ√σ ⌠≤φΩ÷ΦΦ, ≈≥εß√ εß≡αßα≥√Γα≥ⁿ εßα ±δ≤≈α , ΦδΦ ∩≡ε±≥ε ∩ε±√δα≥ⁿ ∩α≡α∞σ≥≡ ≡σµΦ∞α, ΩαΩ Γ√∩εδφσφε τΣσ±ⁿ, Σδ  ≤ΩαταφΦ  ≡σµΦ∞α, Γ Ωε≥ε≡ε∞ ⌠≤φΩ÷Φ  Γ√τΓαφα. ╬ß≡α≥Φ≥σ ΓφΦ∞αφΦσ, ≈≥ε Γ ²≥ε∞ ±δ≤≈ασ φσδⁿτ  Φ±∩εδⁿτεΓα≥ⁿ εΣφ≤ Φτ ∩≡σΣε∩≡σΣσδσφφ√⌡ INTFUNC π≡α∞∞α≥ΦΩ, ≥αΩ ΩαΩ Γα°α ⌠≤φΩ÷Φ  ∞εµσ≥ ∩≡ΦφΦ∞α≥ⁿ ∩σ≡σ∞σφφεσ ≈Φ±δε ∩α≡α∞σ≥≡εΓ.

─≡≤πεΘ Φδδ■±≥≡Φ≡≤σ∞√Θ α±∩σΩ≥ - ΩαΩ ⌠αΩ≥Φ≈σ±ΩΦ ∩≡σΣ±≥αΓΦ≥ⁿ ∩α≡α∞σ≥≡√ ⌠≤φΩ÷ΦΦ . ┬ ßεδⁿ°Φφ±≥Γσ ±δ≤≈ασΓ ┬√ τα⌡ε≥Φ≥σ Φ±∩εδⁿτεΓα≥ⁿ ΦΣσφ≥Φ⌠ΦΩα≥ε≡ expr. ▌≥ε≥ ΦΣσφ≥Φ⌠ΦΩα≥ε≡ ετφα≈ασ≥, ≈≥ε ∩α≡α∞σ≥≡ - Γ√≡αµσφΦσ. ┬√≡αµσφΦσ ∞εµσ≥ ß√≥ⁿ δΦ≥σ≡αδⁿφεσ τφα≈σφΦσ, εß≡α∙σφΦσ Ω ⌠≤φΩ÷ΦΦ ΦδΦ Ωε∞ßΦφα÷Φ  ∞φεπΦ⌡ Γ√≡αµσφΦΘ. ╤∞. parse.raw Σδ  ∩εδφεπε ε∩≡σΣσδσφΦ  π≡α∞∞α≥ΦΩΦ yacc Σδ  Γ√≡αµσφΦΘ Σδ  ßεδⁿ°σπε ΩεδΦ≈σ±≥Γα Σσ≥αδσΘ.

╟α∩Φ±ⁿ ╒²°-╥αßδΦ÷√ Γ lex.c:

	{ "crypt",CRYPT,NULL },

╬ß≡α≥Φ≥σ ΓφΦ∞αφΦσ, ≈≥ε ∩ε±δσΣφΦΘ ²δσ∞σφ≥ - NULL, Γ ²≥ε∞ ±δ≤≈ασ εß≡α∙σφΦσ Ω ⌠≤φΩ÷ΦΦ εß≡αßα≥√Γασ≥±  ∩≡ ∞ε Γ parse.raw. ┼±δΦ ┬√ Φ±∩εδⁿτεΓαδΦ INTFUNC π≡α∞∞α≥ΦΩ≤, ≥ε ┬√ ∩ε∞σ±≥Φ≥σ Φ∞  Γα°σΘ ⌠≤φΩ÷ΦΦ Γ∞σ±≥ε NULL. ╘αΩ≥Φ≈σ±Ωα  ⌠≤φΩ÷Φ  Crypt φα⌡εΣΦ≥±  Γ crypt.c:

/*
* If mode is non-zero, a salt is expected.
* If mode is zero, a pseudo-random salt will be selected. 
*/
void Crypt(int mode) {
#if HAVE_CRYPT
	Stack *s;
	char salt[8];
	char *enc;
	
	salt[0] = '\0';
	if(mode) {
		s = Pop();
		if(!s) {
			Error("Stack error in crypt");
			return;
		}
		if(s->strval) strncpy(salt,s->strval,2);
	}
	s = Pop();
	if(!s) {
		Error("Stack error in crypt");
		return;
	}
	if(!salt[0]) {
		salt[0] = 'A' + (time(NULL) % 26);
		salt[1] = 'a' + (time(NULL) % 26);
		salt[2] = '\0';
	}
	enc = (char *)crypt(s->strval,salt);
#if DEBUG
	Debug("Crypt returned [%s]\n",enc);
#endif
	Push(enc,STRING);	
#else
	Error("No crypt support compiled into this version");
#endif
}

═αΦßεδσσ Γαµφ√Θ α±∩σΩ≥ ²≥εΘ ⌠≤φΩ÷ΦΦ - ²≥ε Γ√τεΓ s = Pop(). ╧α≡α∞σ≥≡√ Σδ  ⌠≤φΩ÷ΦΦ Σεδµφ√ ß√≥ⁿ Γ√≥εδΩφ≤≥√ Φτ ±≥σΩα Γ√≡αµσφΦΘ εΣΦφ τα Σ≡≤πΦ∞. ╩επΣα ┬√ ∩Φ°Φ≥σ ⌠≤φΩ÷Φ■, Ωε≥ε≡α  ∩≡ΦφΦ∞ασ≥ φσ±ΩεδⁿΩε α≡π≤∞σφ≥εΓ, φσ ταß√ΓαΘ≥σ, ≈≥ε ±≥σΩ - ²≥ε ±≥≡≤Ω≥≤≡α Σαφφ√⌡ "∩ε±δσΣφΦ∞ ∩≡Φ°σδ", "∩σ≡Γ√∞ Γ√°σδ" . ▌≥ε ετφα≈ασ≥ ²≥ε, ∩α≡α∞σ≥≡√ ß≤Σ≤≥ Γ√≥αδΩΦΓα≥ⁿ±  Φτ ±≥σΩα Γ εß≡α≥φε∞ ∩ε≡ ΣΩσ. ╧ε±δσΣφΦΘ ∩α≡α∞σ≥≡ Γ√≥αδΩΦΓασ≥±  ∩σ≡Γ√∞. ┬ Γ√°σ≤∩ε∞ φ≤≥ε∞ ∩≡Φ∞σ≡σ ∞√ Γ√ ±φ σ∞, Γ√τΓαφα δΦ ⌠≤φΩ÷Φ  ± 2 ∩α≡α∞σ≥≡α∞Φ. ┼±δΦ Σα, ∩α≡α∞σ≥≡ Γ√≥αδΩΦΓασ≥±  Φτ ±≥σΩα Φ ±ε⌡≡αφ σ≥± . ╟α≥σ∞ Φτ ±≥σΩα Γ√≥αδΩΦΓασ≥±  ±δσΣ≤■∙ΦΘ ∩α≡α∞σ≥≡. Pop() ΓετΓ≡α∙ασ≥ ≤Ωατα≥σδⁿ φα ±≥≡≤Ω≥≤≡≤ Stack (s). ╤≥≡≤Ω≥≤≡α Stack ∩ε⌡εµα φα (Φτ php.h):

/* Expression Stack */
typedef struct Stack {
    short type;
    unsigned char *strval;
    long intval;
    double douval;
    VarTree *var;
    struct Stack *next;
} Stack;

╥Φ∩ type ß≤Σσ≥ εΣΦφ Φτ STRING, LNUMBER ΦδΦ DNUMBER. Strval, intval Φ douval Ωε∞∩εφσφ≥√ - ±≥≡εΩΦ, integer Φ double ∩≡σΣ±≥αΓδσφΦ  τφα≈σφΦ  ±εε≥Γσ≥±≥Γσφφε. ┼±δΦ Γ√≡αµσφΦσ - ⌠αΩ≥Φ≈σ±ΩΦ ε∩≡σΣσδσφφα  ∩σ≡σ∞σφφα , Ωε∞∩εφσφ≥α var ±εΣσ≡µΦ≥ ≤Ωατα≥σδⁿ φα ∩σ≡σ∞σφφ≤■ ±≥≡≤Ω≥≤≡≤, Ωε≥ε≡α  ε∩≡σΣσδ σ≥ ²≥≤ ∩σ≡σ∞σφφ≤■.

┬ φα°σΘ ⌠≤φΩ÷ΦΦ Crypt() φα± Φφ≥σ≡σ±≤σ≥ ≥εδⁿΩε ±≥≡εΩεΓεσ τφα≈σφΦσ ∩α≡α∞σ≥≡α, ≥αΩ ≈≥ε ∞√ Φ±∩εδⁿτ≤σ∞ s->strval. ╠φεπε ⌠≤φΩ÷ΦΘ PHP/FI ∞επ≤≥ Σσδα≥ⁿ ≡ατδΦ≈φ√σ Γσ∙Φ Γ ταΓΦ±Φ∞ε±≥Φ ε≥ ≥Φ∩α ∩σ≡σ∞σφφεΘ ∩≡ε±≥ε ∩≡εΓσ≡   s->type Φ Φ±∩εδⁿτ≤  s->strval, s->intval Φ/ΦδΦ s->douval ±εε≥Γσ≥±≥Γσφφε.

╧ε±δσ Γ√τεΓα ≡σαδⁿφεΘ ⌠≤φΩ÷ΦΦ Crypt() Φ ∩εδ≤≈σφΦ  °Φ⌠≡εΓαφφεΘ ±≥≡εΩΦ, φα°α ⌠≤φΩ÷ΦΦ Crypt() Γ√τ√Γασ≥ Push(enc, STRING); ∩ε∞σ∙α  ΓετΓ≡α∙ασ∞εσ τφα≈σφΦσ Γ ±≥σΩ Γ√≡αµσφΦΘ. ═≤µφε ε≥∞σ≥Φ≥ⁿ, ≈≥ε ±≥σΩ Γ√≡αµσφΦΘ ε≈Φ∙ασ≥±  ∩ε±δσ ΩαµΣεΘ ±≥≡εΩΦ PHP/FI, ≥αΩ ≈≥ε, σ±δΦ ┬√ ∩ε∞σ∙ασ≥σ Γ√≡αµσφΦ  Γ ±≥σΩ, Ωε≥ε≡√σ φΦΩεπΣα φσ Γ√≥αδΩΦΓα■≥±  ≈σ∞-δΦßε, ²≥ε φσ ß≤Σσ≥ Φ∞σ≥ⁿ τφα≈σφΦ .

┬√τεΓ Debug() Γ ∩≡Φ∞σ≡σ Crypt() ∩εΩατ√Γασ≥, ΩαΩ ΣεßαΓΦ≥ⁿ Γ√ΓεΣ ε≥δαΣε≈φεΘ Φφ⌠ε≡∞α÷ΦΦ Ω Γα°σΘ ⌠≤φΩ÷ΦΦ. Debug() - ²≥ε ⌠≤φΩ÷Φ  ± ∩σ≡σ∞σφφ√∞ ±∩Φ±Ωε∞ ∩α≡α∞σ≥≡εΓ, ≥ε≈φε ≥αΩ µσ ΩαΩ printf.

[═αταΣ] [╤εΣσ≡µαφΦσ] [┬∩σ≡σΣ]