12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279 |
- #ifdef HAVE_CONFIG_H
- #include "config.h"
- #endif
- #include "php.h"
- #include "php_ini.h"
- #include "php_variables.h"
- #include "mbstring.h"
- #include "ext/standard/php_string.h"
- #include "ext/standard/php_mail.h"
- #include "ext/standard/exec.h"
- #include "ext/standard/url.h"
- #include "main/php_output.h"
- #include "ext/standard/info.h"
- #include "libmbfl/mbfl/mbfl_allocators.h"
- #include "libmbfl/mbfl/mbfilter_8bit.h"
- #include "libmbfl/mbfl/mbfilter_pass.h"
- #include "libmbfl/mbfl/mbfilter_wchar.h"
- #include "libmbfl/filters/mbfilter_ascii.h"
- #include "libmbfl/filters/mbfilter_base64.h"
- #include "libmbfl/filters/mbfilter_qprint.h"
- #include "libmbfl/filters/mbfilter_ucs4.h"
- #include "libmbfl/filters/mbfilter_utf8.h"
- #include "php_variables.h"
- #include "php_globals.h"
- #include "rfc1867.h"
- #include "php_content_types.h"
- #include "SAPI.h"
- #include "php_unicode.h"
- #include "TSRM.h"
- #include "mb_gpc.h"
- #if HAVE_MBREGEX
- #include "php_mbregex.h"
- #endif
- #include "zend_multibyte.h"
- #if HAVE_ONIG
- #include "php_onig_compat.h"
- #include <oniguruma.h>
- #undef UChar
- #if ONIGURUMA_VERSION_INT < 60800
- typedef void OnigMatchParam;
- #define onig_new_match_param() (NULL)
- #define onig_initialize_match_param(x) (void)(x)
- #define onig_set_match_stack_limit_size_of_match_param(x, y)
- #define onig_free_match_param(x)
- #define onig_search_with_param(reg, str, end, start, range, region, option, mp) \
- onig_search(reg, str, end, start, range, region, option)
- #define onig_match_with_param(re, str, end, at, region, option, mp) \
- onig_match(re, str, end, at, region, option)
- #endif
- #elif HAVE_PCRE || HAVE_BUNDLED_PCRE
- #include "ext/pcre/php_pcre.h"
- #endif
- #if HAVE_MBSTRING
- ZEND_DECLARE_MODULE_GLOBALS(mbstring)
- static PHP_GINIT_FUNCTION(mbstring);
- static PHP_GSHUTDOWN_FUNCTION(mbstring);
- static void php_mb_populate_current_detect_order_list(void);
- static int php_mb_encoding_translation(void);
- static void php_mb_gpc_get_detect_order(const zend_encoding ***list, size_t *list_size);
- static void php_mb_gpc_set_input_encoding(const zend_encoding *encoding);
- static inline zend_bool php_mb_is_unsupported_no_encoding(enum mbfl_no_encoding no_enc);
- static inline zend_bool php_mb_is_no_encoding_utf8(enum mbfl_no_encoding no_enc);
- typedef struct _php_mb_nls_ident_list {
- enum mbfl_no_language lang;
- const enum mbfl_no_encoding *list;
- size_t list_size;
- } php_mb_nls_ident_list;
- static const enum mbfl_no_encoding php_mb_default_identify_list_ja[] = {
- mbfl_no_encoding_ascii,
- mbfl_no_encoding_jis,
- mbfl_no_encoding_utf8,
- mbfl_no_encoding_euc_jp,
- mbfl_no_encoding_sjis
- };
- static const enum mbfl_no_encoding php_mb_default_identify_list_cn[] = {
- mbfl_no_encoding_ascii,
- mbfl_no_encoding_utf8,
- mbfl_no_encoding_euc_cn,
- mbfl_no_encoding_cp936
- };
- static const enum mbfl_no_encoding php_mb_default_identify_list_tw_hk[] = {
- mbfl_no_encoding_ascii,
- mbfl_no_encoding_utf8,
- mbfl_no_encoding_euc_tw,
- mbfl_no_encoding_big5
- };
- static const enum mbfl_no_encoding php_mb_default_identify_list_kr[] = {
- mbfl_no_encoding_ascii,
- mbfl_no_encoding_utf8,
- mbfl_no_encoding_euc_kr,
- mbfl_no_encoding_uhc
- };
- static const enum mbfl_no_encoding php_mb_default_identify_list_ru[] = {
- mbfl_no_encoding_ascii,
- mbfl_no_encoding_utf8,
- mbfl_no_encoding_koi8r,
- mbfl_no_encoding_cp1251,
- mbfl_no_encoding_cp866
- };
- static const enum mbfl_no_encoding php_mb_default_identify_list_hy[] = {
- mbfl_no_encoding_ascii,
- mbfl_no_encoding_utf8,
- mbfl_no_encoding_armscii8
- };
- static const enum mbfl_no_encoding php_mb_default_identify_list_tr[] = {
- mbfl_no_encoding_ascii,
- mbfl_no_encoding_utf8,
- mbfl_no_encoding_cp1254,
- mbfl_no_encoding_8859_9
- };
- static const enum mbfl_no_encoding php_mb_default_identify_list_ua[] = {
- mbfl_no_encoding_ascii,
- mbfl_no_encoding_utf8,
- mbfl_no_encoding_koi8u
- };
- static const enum mbfl_no_encoding php_mb_default_identify_list_neut[] = {
- mbfl_no_encoding_ascii,
- mbfl_no_encoding_utf8
- };
- static const php_mb_nls_ident_list php_mb_default_identify_list[] = {
- { mbfl_no_language_japanese, php_mb_default_identify_list_ja, sizeof(php_mb_default_identify_list_ja) / sizeof(php_mb_default_identify_list_ja[0]) },
- { mbfl_no_language_korean, php_mb_default_identify_list_kr, sizeof(php_mb_default_identify_list_kr) / sizeof(php_mb_default_identify_list_kr[0]) },
- { mbfl_no_language_traditional_chinese, php_mb_default_identify_list_tw_hk, sizeof(php_mb_default_identify_list_tw_hk) / sizeof(php_mb_default_identify_list_tw_hk[0]) },
- { mbfl_no_language_simplified_chinese, php_mb_default_identify_list_cn, sizeof(php_mb_default_identify_list_cn) / sizeof(php_mb_default_identify_list_cn[0]) },
- { mbfl_no_language_russian, php_mb_default_identify_list_ru, sizeof(php_mb_default_identify_list_ru) / sizeof(php_mb_default_identify_list_ru[0]) },
- { mbfl_no_language_armenian, php_mb_default_identify_list_hy, sizeof(php_mb_default_identify_list_hy) / sizeof(php_mb_default_identify_list_hy[0]) },
- { mbfl_no_language_turkish, php_mb_default_identify_list_tr, sizeof(php_mb_default_identify_list_tr) / sizeof(php_mb_default_identify_list_tr[0]) },
- { mbfl_no_language_ukrainian, php_mb_default_identify_list_ua, sizeof(php_mb_default_identify_list_ua) / sizeof(php_mb_default_identify_list_ua[0]) },
- { mbfl_no_language_neutral, php_mb_default_identify_list_neut, sizeof(php_mb_default_identify_list_neut) / sizeof(php_mb_default_identify_list_neut[0]) }
- };
- static const struct mb_overload_def mb_ovld[] = {
- {MB_OVERLOAD_MAIL, "mail", "mb_send_mail", "mb_orig_mail"},
- {MB_OVERLOAD_STRING, "strlen", "mb_strlen", "mb_orig_strlen"},
- {MB_OVERLOAD_STRING, "strpos", "mb_strpos", "mb_orig_strpos"},
- {MB_OVERLOAD_STRING, "strrpos", "mb_strrpos", "mb_orig_strrpos"},
- {MB_OVERLOAD_STRING, "stripos", "mb_stripos", "mb_orig_stripos"},
- {MB_OVERLOAD_STRING, "strripos", "mb_strripos", "mb_orig_strripos"},
- {MB_OVERLOAD_STRING, "strstr", "mb_strstr", "mb_orig_strstr"},
- {MB_OVERLOAD_STRING, "strrchr", "mb_strrchr", "mb_orig_strrchr"},
- {MB_OVERLOAD_STRING, "stristr", "mb_stristr", "mb_orig_stristr"},
- {MB_OVERLOAD_STRING, "substr", "mb_substr", "mb_orig_substr"},
- {MB_OVERLOAD_STRING, "strtolower", "mb_strtolower", "mb_orig_strtolower"},
- {MB_OVERLOAD_STRING, "strtoupper", "mb_strtoupper", "mb_orig_strtoupper"},
- {MB_OVERLOAD_STRING, "substr_count", "mb_substr_count", "mb_orig_substr_count"},
- {0, NULL, NULL, NULL}
- };
- ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_language, 0, 0, 0)
- ZEND_ARG_INFO(0, language)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_internal_encoding, 0, 0, 0)
- ZEND_ARG_INFO(0, encoding)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_http_input, 0, 0, 0)
- ZEND_ARG_INFO(0, type)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_http_output, 0, 0, 0)
- ZEND_ARG_INFO(0, encoding)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_detect_order, 0, 0, 0)
- ZEND_ARG_INFO(0, encoding)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_substitute_character, 0, 0, 0)
- ZEND_ARG_INFO(0, substchar)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_preferred_mime_name, 0, 0, 1)
- ZEND_ARG_INFO(0, encoding)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_parse_str, 0, 0, 1)
- ZEND_ARG_INFO(0, encoded_string)
- ZEND_ARG_INFO(1, result)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_output_handler, 0, 0, 2)
- ZEND_ARG_INFO(0, contents)
- ZEND_ARG_INFO(0, status)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_strlen, 0, 0, 1)
- ZEND_ARG_INFO(0, str)
- ZEND_ARG_INFO(0, encoding)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_strpos, 0, 0, 2)
- ZEND_ARG_INFO(0, haystack)
- ZEND_ARG_INFO(0, needle)
- ZEND_ARG_INFO(0, offset)
- ZEND_ARG_INFO(0, encoding)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_strrpos, 0, 0, 2)
- ZEND_ARG_INFO(0, haystack)
- ZEND_ARG_INFO(0, needle)
- ZEND_ARG_INFO(0, offset)
- ZEND_ARG_INFO(0, encoding)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_stripos, 0, 0, 2)
- ZEND_ARG_INFO(0, haystack)
- ZEND_ARG_INFO(0, needle)
- ZEND_ARG_INFO(0, offset)
- ZEND_ARG_INFO(0, encoding)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_strripos, 0, 0, 2)
- ZEND_ARG_INFO(0, haystack)
- ZEND_ARG_INFO(0, needle)
- ZEND_ARG_INFO(0, offset)
- ZEND_ARG_INFO(0, encoding)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_strstr, 0, 0, 2)
- ZEND_ARG_INFO(0, haystack)
- ZEND_ARG_INFO(0, needle)
- ZEND_ARG_INFO(0, part)
- ZEND_ARG_INFO(0, encoding)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_strrchr, 0, 0, 2)
- ZEND_ARG_INFO(0, haystack)
- ZEND_ARG_INFO(0, needle)
- ZEND_ARG_INFO(0, part)
- ZEND_ARG_INFO(0, encoding)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_stristr, 0, 0, 2)
- ZEND_ARG_INFO(0, haystack)
- ZEND_ARG_INFO(0, needle)
- ZEND_ARG_INFO(0, part)
- ZEND_ARG_INFO(0, encoding)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_strrichr, 0, 0, 2)
- ZEND_ARG_INFO(0, haystack)
- ZEND_ARG_INFO(0, needle)
- ZEND_ARG_INFO(0, part)
- ZEND_ARG_INFO(0, encoding)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_substr_count, 0, 0, 2)
- ZEND_ARG_INFO(0, haystack)
- ZEND_ARG_INFO(0, needle)
- ZEND_ARG_INFO(0, encoding)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_substr, 0, 0, 2)
- ZEND_ARG_INFO(0, str)
- ZEND_ARG_INFO(0, start)
- ZEND_ARG_INFO(0, length)
- ZEND_ARG_INFO(0, encoding)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_strcut, 0, 0, 2)
- ZEND_ARG_INFO(0, str)
- ZEND_ARG_INFO(0, start)
- ZEND_ARG_INFO(0, length)
- ZEND_ARG_INFO(0, encoding)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_strwidth, 0, 0, 1)
- ZEND_ARG_INFO(0, str)
- ZEND_ARG_INFO(0, encoding)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_strimwidth, 0, 0, 3)
- ZEND_ARG_INFO(0, str)
- ZEND_ARG_INFO(0, start)
- ZEND_ARG_INFO(0, width)
- ZEND_ARG_INFO(0, trimmarker)
- ZEND_ARG_INFO(0, encoding)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_convert_encoding, 0, 0, 2)
- ZEND_ARG_INFO(0, str)
- ZEND_ARG_INFO(0, to)
- ZEND_ARG_INFO(0, from)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_convert_case, 0, 0, 2)
- ZEND_ARG_INFO(0, sourcestring)
- ZEND_ARG_INFO(0, mode)
- ZEND_ARG_INFO(0, encoding)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_strtoupper, 0, 0, 1)
- ZEND_ARG_INFO(0, sourcestring)
- ZEND_ARG_INFO(0, encoding)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_strtolower, 0, 0, 1)
- ZEND_ARG_INFO(0, sourcestring)
- ZEND_ARG_INFO(0, encoding)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_detect_encoding, 0, 0, 1)
- ZEND_ARG_INFO(0, str)
- ZEND_ARG_INFO(0, encoding_list)
- ZEND_ARG_INFO(0, strict)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO(arginfo_mb_list_encodings, 0)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_encoding_aliases, 0, 0, 1)
- ZEND_ARG_INFO(0, encoding)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_encode_mimeheader, 0, 0, 1)
- ZEND_ARG_INFO(0, str)
- ZEND_ARG_INFO(0, charset)
- ZEND_ARG_INFO(0, transfer)
- ZEND_ARG_INFO(0, linefeed)
- ZEND_ARG_INFO(0, indent)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_decode_mimeheader, 0, 0, 1)
- ZEND_ARG_INFO(0, string)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_convert_kana, 0, 0, 1)
- ZEND_ARG_INFO(0, str)
- ZEND_ARG_INFO(0, option)
- ZEND_ARG_INFO(0, encoding)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_convert_variables, 0, 0, 3)
- ZEND_ARG_INFO(0, to)
- ZEND_ARG_INFO(0, from)
- ZEND_ARG_VARIADIC_INFO(1, vars)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_encode_numericentity, 0, 0, 2)
- ZEND_ARG_INFO(0, string)
- ZEND_ARG_INFO(0, convmap)
- ZEND_ARG_INFO(0, encoding)
- ZEND_ARG_INFO(0, is_hex)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_decode_numericentity, 0, 0, 2)
- ZEND_ARG_INFO(0, string)
- ZEND_ARG_INFO(0, convmap)
- ZEND_ARG_INFO(0, encoding)
- ZEND_ARG_INFO(0, is_hex)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_send_mail, 0, 0, 3)
- ZEND_ARG_INFO(0, to)
- ZEND_ARG_INFO(0, subject)
- ZEND_ARG_INFO(0, message)
- ZEND_ARG_INFO(0, additional_headers)
- ZEND_ARG_INFO(0, additional_parameters)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_get_info, 0, 0, 0)
- ZEND_ARG_INFO(0, type)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_check_encoding, 0, 0, 0)
- ZEND_ARG_INFO(0, var)
- ZEND_ARG_INFO(0, encoding)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_scrub, 0, 0, 1)
- ZEND_ARG_INFO(0, str)
- ZEND_ARG_INFO(0, encoding)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_ord, 0, 0, 1)
- ZEND_ARG_INFO(0, str)
- ZEND_ARG_INFO(0, encoding)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_chr, 0, 0, 1)
- ZEND_ARG_INFO(0, cp)
- ZEND_ARG_INFO(0, encoding)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_regex_encoding, 0, 0, 0)
- ZEND_ARG_INFO(0, encoding)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_ereg, 0, 0, 2)
- ZEND_ARG_INFO(0, pattern)
- ZEND_ARG_INFO(0, string)
- ZEND_ARG_INFO(1, registers)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_eregi, 0, 0, 2)
- ZEND_ARG_INFO(0, pattern)
- ZEND_ARG_INFO(0, string)
- ZEND_ARG_INFO(1, registers)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_ereg_replace, 0, 0, 3)
- ZEND_ARG_INFO(0, pattern)
- ZEND_ARG_INFO(0, replacement)
- ZEND_ARG_INFO(0, string)
- ZEND_ARG_INFO(0, option)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_eregi_replace, 0, 0, 3)
- ZEND_ARG_INFO(0, pattern)
- ZEND_ARG_INFO(0, replacement)
- ZEND_ARG_INFO(0, string)
- ZEND_ARG_INFO(0, option)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_ereg_replace_callback, 0, 0, 3)
- ZEND_ARG_INFO(0, pattern)
- ZEND_ARG_INFO(0, callback)
- ZEND_ARG_INFO(0, string)
- ZEND_ARG_INFO(0, option)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_split, 0, 0, 2)
- ZEND_ARG_INFO(0, pattern)
- ZEND_ARG_INFO(0, string)
- ZEND_ARG_INFO(0, limit)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_ereg_match, 0, 0, 2)
- ZEND_ARG_INFO(0, pattern)
- ZEND_ARG_INFO(0, string)
- ZEND_ARG_INFO(0, option)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_ereg_search, 0, 0, 0)
- ZEND_ARG_INFO(0, pattern)
- ZEND_ARG_INFO(0, option)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_ereg_search_pos, 0, 0, 0)
- ZEND_ARG_INFO(0, pattern)
- ZEND_ARG_INFO(0, option)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_ereg_search_regs, 0, 0, 0)
- ZEND_ARG_INFO(0, pattern)
- ZEND_ARG_INFO(0, option)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_ereg_search_init, 0, 0, 1)
- ZEND_ARG_INFO(0, string)
- ZEND_ARG_INFO(0, pattern)
- ZEND_ARG_INFO(0, option)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO(arginfo_mb_ereg_search_getregs, 0)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO(arginfo_mb_ereg_search_getpos, 0)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_ereg_search_setpos, 0, 0, 1)
- ZEND_ARG_INFO(0, position)
- ZEND_END_ARG_INFO()
- ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_regex_set_options, 0, 0, 0)
- ZEND_ARG_INFO(0, options)
- ZEND_END_ARG_INFO()
- static const zend_function_entry mbstring_functions[] = {
- PHP_FE(mb_convert_case, arginfo_mb_convert_case)
- PHP_FE(mb_strtoupper, arginfo_mb_strtoupper)
- PHP_FE(mb_strtolower, arginfo_mb_strtolower)
- PHP_FE(mb_language, arginfo_mb_language)
- PHP_FE(mb_internal_encoding, arginfo_mb_internal_encoding)
- PHP_FE(mb_http_input, arginfo_mb_http_input)
- PHP_FE(mb_http_output, arginfo_mb_http_output)
- PHP_FE(mb_detect_order, arginfo_mb_detect_order)
- PHP_FE(mb_substitute_character, arginfo_mb_substitute_character)
- PHP_FE(mb_parse_str, arginfo_mb_parse_str)
- PHP_FE(mb_output_handler, arginfo_mb_output_handler)
- PHP_FE(mb_preferred_mime_name, arginfo_mb_preferred_mime_name)
- PHP_FE(mb_strlen, arginfo_mb_strlen)
- PHP_FE(mb_strpos, arginfo_mb_strpos)
- PHP_FE(mb_strrpos, arginfo_mb_strrpos)
- PHP_FE(mb_stripos, arginfo_mb_stripos)
- PHP_FE(mb_strripos, arginfo_mb_strripos)
- PHP_FE(mb_strstr, arginfo_mb_strstr)
- PHP_FE(mb_strrchr, arginfo_mb_strrchr)
- PHP_FE(mb_stristr, arginfo_mb_stristr)
- PHP_FE(mb_strrichr, arginfo_mb_strrichr)
- PHP_FE(mb_substr_count, arginfo_mb_substr_count)
- PHP_FE(mb_substr, arginfo_mb_substr)
- PHP_FE(mb_strcut, arginfo_mb_strcut)
- PHP_FE(mb_strwidth, arginfo_mb_strwidth)
- PHP_FE(mb_strimwidth, arginfo_mb_strimwidth)
- PHP_FE(mb_convert_encoding, arginfo_mb_convert_encoding)
- PHP_FE(mb_detect_encoding, arginfo_mb_detect_encoding)
- PHP_FE(mb_list_encodings, arginfo_mb_list_encodings)
- PHP_FE(mb_encoding_aliases, arginfo_mb_encoding_aliases)
- PHP_FE(mb_convert_kana, arginfo_mb_convert_kana)
- PHP_FE(mb_encode_mimeheader, arginfo_mb_encode_mimeheader)
- PHP_FE(mb_decode_mimeheader, arginfo_mb_decode_mimeheader)
- PHP_FE(mb_convert_variables, arginfo_mb_convert_variables)
- PHP_FE(mb_encode_numericentity, arginfo_mb_encode_numericentity)
- PHP_FE(mb_decode_numericentity, arginfo_mb_decode_numericentity)
- PHP_FE(mb_send_mail, arginfo_mb_send_mail)
- PHP_FE(mb_get_info, arginfo_mb_get_info)
- PHP_FE(mb_check_encoding, arginfo_mb_check_encoding)
- PHP_FE(mb_ord, arginfo_mb_ord)
- PHP_FE(mb_chr, arginfo_mb_chr)
- PHP_FE(mb_scrub, arginfo_mb_scrub)
- #if HAVE_MBREGEX
- PHP_MBREGEX_FUNCTION_ENTRIES
- #endif
- PHP_FE_END
- };
- zend_module_entry mbstring_module_entry = {
- STANDARD_MODULE_HEADER,
- "mbstring",
- mbstring_functions,
- PHP_MINIT(mbstring),
- PHP_MSHUTDOWN(mbstring),
- PHP_RINIT(mbstring),
- PHP_RSHUTDOWN(mbstring),
- PHP_MINFO(mbstring),
- PHP_MBSTRING_VERSION,
- PHP_MODULE_GLOBALS(mbstring),
- PHP_GINIT(mbstring),
- PHP_GSHUTDOWN(mbstring),
- NULL,
- STANDARD_MODULE_PROPERTIES_EX
- };
- static const sapi_post_entry php_post_entries[] = {
- { DEFAULT_POST_CONTENT_TYPE, sizeof(DEFAULT_POST_CONTENT_TYPE)-1, sapi_read_standard_form_data, php_std_post_handler },
- { MULTIPART_CONTENT_TYPE, sizeof(MULTIPART_CONTENT_TYPE)-1, NULL, rfc1867_post_handler },
- { NULL, 0, NULL, NULL }
- };
- #ifdef COMPILE_DL_MBSTRING
- #ifdef ZTS
- ZEND_TSRMLS_CACHE_DEFINE()
- #endif
- ZEND_GET_MODULE(mbstring)
- #endif
- static char *get_internal_encoding(void) {
- if (PG(internal_encoding) && PG(internal_encoding)[0]) {
- return PG(internal_encoding);
- } else if (SG(default_charset)) {
- return SG(default_charset);
- }
- return "";
- }
- static char *get_input_encoding(void) {
- if (PG(input_encoding) && PG(input_encoding)[0]) {
- return PG(input_encoding);
- } else if (SG(default_charset)) {
- return SG(default_charset);
- }
- return "";
- }
- static char *get_output_encoding(void) {
- if (PG(output_encoding) && PG(output_encoding)[0]) {
- return PG(output_encoding);
- } else if (SG(default_charset)) {
- return SG(default_charset);
- }
- return "";
- }
- static void *_php_mb_allocators_malloc(size_t sz)
- {
- return emalloc(sz);
- }
- static void *_php_mb_allocators_realloc(void *ptr, size_t sz)
- {
- return erealloc(ptr, sz);
- }
- static void *_php_mb_allocators_calloc(size_t nelems, size_t szelem)
- {
- return ecalloc(nelems, szelem);
- }
- static void _php_mb_allocators_free(void *ptr)
- {
- efree(ptr);
- }
- static void *_php_mb_allocators_pmalloc(size_t sz)
- {
- return pemalloc(sz, 1);
- }
- static void *_php_mb_allocators_prealloc(void *ptr, size_t sz)
- {
- return perealloc(ptr, sz, 1);
- }
- static void _php_mb_allocators_pfree(void *ptr)
- {
- pefree(ptr, 1);
- }
- static const mbfl_allocators _php_mb_allocators = {
- _php_mb_allocators_malloc,
- _php_mb_allocators_realloc,
- _php_mb_allocators_calloc,
- _php_mb_allocators_free,
- _php_mb_allocators_pmalloc,
- _php_mb_allocators_prealloc,
- _php_mb_allocators_pfree
- };
- static const sapi_post_entry mbstr_post_entries[] = {
- { DEFAULT_POST_CONTENT_TYPE, sizeof(DEFAULT_POST_CONTENT_TYPE)-1, sapi_read_standard_form_data, php_mb_post_handler },
- { MULTIPART_CONTENT_TYPE, sizeof(MULTIPART_CONTENT_TYPE)-1, NULL, rfc1867_post_handler },
- { NULL, 0, NULL, NULL }
- };
- static const mbfl_encoding *php_mb_get_encoding(const char *encoding_name) {
- if (encoding_name) {
- const mbfl_encoding *encoding;
- if (MBSTRG(last_used_encoding_name)
- && !strcasecmp(encoding_name, MBSTRG(last_used_encoding_name))) {
- return MBSTRG(last_used_encoding);
- }
- encoding = mbfl_name2encoding(encoding_name);
- if (!encoding) {
- php_error_docref(NULL, E_WARNING, "Unknown encoding \"%s\"", encoding_name);
- return NULL;
- }
- if (MBSTRG(last_used_encoding_name)) {
- efree(MBSTRG(last_used_encoding_name));
- }
- MBSTRG(last_used_encoding_name) = estrdup(encoding_name);
- MBSTRG(last_used_encoding) = encoding;
- return encoding;
- } else {
- return MBSTRG(current_internal_encoding);
- }
- }
- static int
- php_mb_parse_encoding_list(const char *value, size_t value_length, const mbfl_encoding ***return_list, size_t *return_size, int persistent)
- {
- int bauto, ret = SUCCESS;
- size_t n, size;
- char *p, *p1, *p2, *endp, *tmpstr;
- const mbfl_encoding **entry, **list;
- list = NULL;
- if (value == NULL || value_length == 0) {
- if (return_list) {
- *return_list = NULL;
- }
- if (return_size) {
- *return_size = 0;
- }
- return FAILURE;
- } else {
-
- if (value[0]=='"' && value[value_length-1]=='"' && value_length>2) {
- tmpstr = (char *)estrndup(value+1, value_length-2);
- value_length -= 2;
- }
- else
- tmpstr = (char *)estrndup(value, value_length);
-
- endp = tmpstr + value_length;
- n = 1;
- p1 = tmpstr;
- while ((p2 = (char*)php_memnstr(p1, ",", 1, endp)) != NULL) {
- p1 = p2 + 1;
- n++;
- }
- size = n + MBSTRG(default_detect_order_list_size);
-
- list = (const mbfl_encoding **)pecalloc(size, sizeof(mbfl_encoding*), persistent);
- entry = list;
- n = 0;
- bauto = 0;
- p1 = tmpstr;
- do {
- p2 = p = (char*)php_memnstr(p1, ",", 1, endp);
- if (p == NULL) {
- p = endp;
- }
- *p = '\0';
-
- while (p1 < p && (*p1 == ' ' || *p1 == '\t')) {
- p1++;
- }
- p--;
- while (p > p1 && (*p == ' ' || *p == '\t')) {
- *p = '\0';
- p--;
- }
-
- if (strcasecmp(p1, "auto") == 0) {
- if (!bauto) {
- const enum mbfl_no_encoding *src = MBSTRG(default_detect_order_list);
- const size_t identify_list_size = MBSTRG(default_detect_order_list_size);
- size_t i;
- bauto = 1;
- for (i = 0; i < identify_list_size; i++) {
- *entry++ = mbfl_no2encoding(*src++);
- n++;
- }
- }
- } else {
- const mbfl_encoding *encoding = mbfl_name2encoding(p1);
- if (encoding) {
- *entry++ = encoding;
- n++;
- } else {
- ret = FAILURE;
- }
- }
- p1 = p2 + 1;
- } while (n < size && p2 != NULL);
- if (n > 0) {
- if (return_list) {
- *return_list = list;
- } else {
- pefree(list, persistent);
- }
- } else {
- pefree(list, persistent);
- if (return_list) {
- *return_list = NULL;
- }
- ret = FAILURE;
- }
- if (return_size) {
- *return_size = n;
- }
- efree(tmpstr);
- }
- return ret;
- }
- static int
- php_mb_parse_encoding_array(zval *array, const mbfl_encoding ***return_list, size_t *return_size, int persistent)
- {
- zval *hash_entry;
- HashTable *target_hash;
- int i, n, bauto, ret = SUCCESS;
- const mbfl_encoding **list, **entry;
- size_t size;
- list = NULL;
- if (Z_TYPE_P(array) == IS_ARRAY) {
- target_hash = Z_ARRVAL_P(array);
- i = zend_hash_num_elements(target_hash);
- size = i + MBSTRG(default_detect_order_list_size);
- list = (const mbfl_encoding **)pecalloc(size, sizeof(mbfl_encoding*), persistent);
- entry = list;
- bauto = 0;
- n = 0;
- ZEND_HASH_FOREACH_VAL(target_hash, hash_entry) {
- convert_to_string_ex(hash_entry);
- if (strcasecmp(Z_STRVAL_P(hash_entry), "auto") == 0) {
- if (!bauto) {
- const enum mbfl_no_encoding *src = MBSTRG(default_detect_order_list);
- const size_t identify_list_size = MBSTRG(default_detect_order_list_size);
- size_t j;
- bauto = 1;
- for (j = 0; j < identify_list_size; j++) {
- *entry++ = mbfl_no2encoding(*src++);
- n++;
- }
- }
- } else {
- const mbfl_encoding *encoding = mbfl_name2encoding(Z_STRVAL_P(hash_entry));
- if (encoding) {
- *entry++ = encoding;
- n++;
- } else {
- ret = FAILURE;
- }
- }
- i--;
- } ZEND_HASH_FOREACH_END();
- if (n > 0) {
- if (return_list) {
- *return_list = list;
- } else {
- pefree(list, persistent);
- }
- } else {
- pefree(list, persistent);
- if (return_list) {
- *return_list = NULL;
- }
- ret = FAILURE;
- }
- if (return_size) {
- *return_size = n;
- }
- }
- return ret;
- }
- static const zend_encoding* php_mb_zend_encoding_fetcher(const char *encoding_name)
- {
- return (const zend_encoding*)mbfl_name2encoding(encoding_name);
- }
- static const char *php_mb_zend_encoding_name_getter(const zend_encoding *encoding)
- {
- return ((const mbfl_encoding *)encoding)->name;
- }
- static int php_mb_zend_encoding_lexer_compatibility_checker(const zend_encoding *_encoding)
- {
- const mbfl_encoding *encoding = (const mbfl_encoding*)_encoding;
- if (encoding->flag & MBFL_ENCTYPE_SBCS) {
- return 1;
- }
- if ((encoding->flag & (MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_GL_UNSAFE)) == MBFL_ENCTYPE_MBCS) {
- return 1;
- }
- return 0;
- }
- static const zend_encoding *php_mb_zend_encoding_detector(const unsigned char *arg_string, size_t arg_length, const zend_encoding **list, size_t list_size)
- {
- mbfl_string string;
- if (!list) {
- list = (const zend_encoding **)MBSTRG(current_detect_order_list);
- list_size = MBSTRG(current_detect_order_list_size);
- }
- mbfl_string_init(&string);
- string.no_language = MBSTRG(language);
- string.val = (unsigned char *)arg_string;
- string.len = arg_length;
- return (const zend_encoding *) mbfl_identify_encoding(&string, (const mbfl_encoding **)list, list_size, 0);
- }
- static size_t php_mb_zend_encoding_converter(unsigned char **to, size_t *to_length, const unsigned char *from, size_t from_length, const zend_encoding *encoding_to, const zend_encoding *encoding_from)
- {
- mbfl_string string, result;
- mbfl_buffer_converter *convd;
- int status;
- size_t loc;
-
-
- mbfl_string_init(&string);
- mbfl_string_init(&result);
- string.encoding = (const mbfl_encoding*)encoding_from;
- string.no_language = MBSTRG(language);
- string.val = (unsigned char*)from;
- string.len = from_length;
-
- convd = mbfl_buffer_converter_new((const mbfl_encoding *)encoding_from, (const mbfl_encoding *)encoding_to, string.len);
- if (convd == NULL) {
- return (size_t) -1;
- }
- mbfl_buffer_converter_illegal_mode(convd, MBSTRG(current_filter_illegal_mode));
- mbfl_buffer_converter_illegal_substchar(convd, MBSTRG(current_filter_illegal_substchar));
-
- status = mbfl_buffer_converter_feed2(convd, &string, &loc);
- if (status) {
- mbfl_buffer_converter_delete(convd);
- return (size_t)-1;
- }
- mbfl_buffer_converter_flush(convd);
- if (!mbfl_buffer_converter_result(convd, &result)) {
- mbfl_buffer_converter_delete(convd);
- return (size_t)-1;
- }
- *to = result.val;
- *to_length = result.len;
- mbfl_buffer_converter_delete(convd);
- return loc;
- }
- static int php_mb_zend_encoding_list_parser(const char *encoding_list, size_t encoding_list_len, const zend_encoding ***return_list, size_t *return_size, int persistent)
- {
- return php_mb_parse_encoding_list(encoding_list, encoding_list_len, (const mbfl_encoding ***)return_list, return_size, persistent);
- }
- static const zend_encoding *php_mb_zend_internal_encoding_getter(void)
- {
- return (const zend_encoding *)MBSTRG(internal_encoding);
- }
- static int php_mb_zend_internal_encoding_setter(const zend_encoding *encoding)
- {
- MBSTRG(internal_encoding) = (const mbfl_encoding *)encoding;
- return SUCCESS;
- }
- static zend_multibyte_functions php_mb_zend_multibyte_functions = {
- "mbstring",
- php_mb_zend_encoding_fetcher,
- php_mb_zend_encoding_name_getter,
- php_mb_zend_encoding_lexer_compatibility_checker,
- php_mb_zend_encoding_detector,
- php_mb_zend_encoding_converter,
- php_mb_zend_encoding_list_parser,
- php_mb_zend_internal_encoding_getter,
- php_mb_zend_internal_encoding_setter
- };
- static void *_php_mb_compile_regex(const char *pattern);
- static int _php_mb_match_regex(void *opaque, const char *str, size_t str_len);
- static void _php_mb_free_regex(void *opaque);
- #if HAVE_ONIG
- static void *_php_mb_compile_regex(const char *pattern)
- {
- php_mb_regex_t *retval;
- OnigErrorInfo err_info;
- int err_code;
- if ((err_code = onig_new(&retval,
- (const OnigUChar *)pattern,
- (const OnigUChar *)pattern + strlen(pattern),
- ONIG_OPTION_IGNORECASE | ONIG_OPTION_DONT_CAPTURE_GROUP,
- ONIG_ENCODING_ASCII, &OnigSyntaxPerl, &err_info))) {
- OnigUChar err_str[ONIG_MAX_ERROR_MESSAGE_LEN];
- onig_error_code_to_str(err_str, err_code, err_info);
- php_error_docref(NULL, E_WARNING, "%s: %s", pattern, err_str);
- retval = NULL;
- }
- return retval;
- }
- static int _php_mb_match_regex(void *opaque, const char *str, size_t str_len)
- {
- OnigMatchParam *mp = onig_new_match_param();
- int err;
- onig_initialize_match_param(mp);
- if (!ZEND_LONG_UINT_OVFL(MBSTRG(regex_stack_limit))) {
- onig_set_match_stack_limit_size_of_match_param(mp, (unsigned int)MBSTRG(regex_stack_limit));
- }
-
- err = onig_search_with_param((php_mb_regex_t *)opaque, (const OnigUChar *)str,
- (const OnigUChar*)str + str_len, (const OnigUChar *)str,
- (const OnigUChar*)str + str_len, NULL, ONIG_OPTION_NONE, mp);
- onig_free_match_param(mp);
- return err >= 0;
- }
- static void _php_mb_free_regex(void *opaque)
- {
- onig_free((php_mb_regex_t *)opaque);
- }
- #elif HAVE_PCRE || HAVE_BUNDLED_PCRE
- static void *_php_mb_compile_regex(const char *pattern)
- {
- pcre2_code *retval;
- PCRE2_SIZE err_offset;
- int errnum;
- if (!(retval = pcre2_compile((PCRE2_SPTR)pattern, PCRE2_ZERO_TERMINATED,
- PCRE2_CASELESS, &errnum, &err_offset, php_pcre_cctx()))) {
- PCRE2_UCHAR err_str[128];
- pcre2_get_error_message(errnum, err_str, sizeof(err_str));
- php_error_docref(NULL, E_WARNING, "%s (offset=%zu): %s", pattern, err_offset, err_str);
- }
- return retval;
- }
- static int _php_mb_match_regex(void *opaque, const char *str, size_t str_len)
- {
- int res;
- pcre2_match_data *match_data = php_pcre_create_match_data(0, opaque);
- if (NULL == match_data) {
- pcre2_code_free(opaque);
- php_error_docref(NULL, E_WARNING, "Cannot allocate match data");
- return FAILURE;
- }
- res = pcre2_match(opaque, (PCRE2_SPTR)str, str_len, 0, 0, match_data, php_pcre_mctx()) >= 0;
- php_pcre_free_match_data(match_data);
- return res;
- }
- static void _php_mb_free_regex(void *opaque)
- {
- pcre2_code_free(opaque);
- }
- #endif
- static int php_mb_nls_get_default_detect_order_list(enum mbfl_no_language lang, enum mbfl_no_encoding **plist, size_t *plist_size)
- {
- size_t i;
- *plist = (enum mbfl_no_encoding *) php_mb_default_identify_list_neut;
- *plist_size = sizeof(php_mb_default_identify_list_neut) / sizeof(php_mb_default_identify_list_neut[0]);
- for (i = 0; i < sizeof(php_mb_default_identify_list) / sizeof(php_mb_default_identify_list[0]); i++) {
- if (php_mb_default_identify_list[i].lang == lang) {
- *plist = (enum mbfl_no_encoding *)php_mb_default_identify_list[i].list;
- *plist_size = php_mb_default_identify_list[i].list_size;
- return 1;
- }
- }
- return 0;
- }
- static char *php_mb_rfc1867_substring_conf(const zend_encoding *encoding, char *start, size_t len, char quote)
- {
- char *result = emalloc(len + 2);
- char *resp = result;
- size_t i;
- for (i = 0; i < len && start[i] != quote; ++i) {
- if (start[i] == '\\' && (start[i + 1] == '\\' || (quote && start[i + 1] == quote))) {
- *resp++ = start[++i];
- } else {
- size_t j = php_mb_mbchar_bytes_ex(start+i, (const mbfl_encoding *)encoding);
- while (j-- > 0 && i < len) {
- *resp++ = start[i++];
- }
- --i;
- }
- }
- *resp = '\0';
- return result;
- }
- static char *php_mb_rfc1867_getword(const zend_encoding *encoding, char **line, char stop)
- {
- char *pos = *line, quote;
- char *res;
- while (*pos && *pos != stop) {
- if ((quote = *pos) == '"' || quote == '\'') {
- ++pos;
- while (*pos && *pos != quote) {
- if (*pos == '\\' && pos[1] && pos[1] == quote) {
- pos += 2;
- } else {
- ++pos;
- }
- }
- if (*pos) {
- ++pos;
- }
- } else {
- pos += php_mb_mbchar_bytes_ex(pos, (const mbfl_encoding *)encoding);
- }
- }
- if (*pos == '\0') {
- res = estrdup(*line);
- *line += strlen(*line);
- return res;
- }
- res = estrndup(*line, pos - *line);
- while (*pos == stop) {
- pos += php_mb_mbchar_bytes_ex(pos, (const mbfl_encoding *)encoding);
- }
- *line = pos;
- return res;
- }
- static char *php_mb_rfc1867_getword_conf(const zend_encoding *encoding, char *str)
- {
- while (*str && isspace(*(unsigned char *)str)) {
- ++str;
- }
- if (!*str) {
- return estrdup("");
- }
- if (*str == '"' || *str == '\'') {
- char quote = *str;
- str++;
- return php_mb_rfc1867_substring_conf(encoding, str, strlen(str), quote);
- } else {
- char *strend = str;
- while (*strend && !isspace(*(unsigned char *)strend)) {
- ++strend;
- }
- return php_mb_rfc1867_substring_conf(encoding, str, strend - str, 0);
- }
- }
- static char *php_mb_rfc1867_basename(const zend_encoding *encoding, char *filename)
- {
- char *s, *s2;
- const size_t filename_len = strlen(filename);
-
- s = php_mb_safe_strrchr_ex(filename, '\\', filename_len, (const mbfl_encoding *)encoding);
- s2 = php_mb_safe_strrchr_ex(filename, '/', filename_len, (const mbfl_encoding *)encoding);
- if (s && s2) {
- if (s > s2) {
- return ++s;
- } else {
- return ++s2;
- }
- } else if (s) {
- return ++s;
- } else if (s2) {
- return ++s2;
- } else {
- return filename;
- }
- }
- static PHP_INI_MH(OnUpdate_mbstring_language)
- {
- enum mbfl_no_language no_language;
- no_language = mbfl_name2no_language(ZSTR_VAL(new_value));
- if (no_language == mbfl_no_language_invalid) {
- MBSTRG(language) = mbfl_no_language_neutral;
- return FAILURE;
- }
- MBSTRG(language) = no_language;
- php_mb_nls_get_default_detect_order_list(no_language, &MBSTRG(default_detect_order_list), &MBSTRG(default_detect_order_list_size));
- return SUCCESS;
- }
- static PHP_INI_MH(OnUpdate_mbstring_detect_order)
- {
- const mbfl_encoding **list;
- size_t size;
- if (!new_value) {
- if (MBSTRG(detect_order_list)) {
- pefree(MBSTRG(detect_order_list), 1);
- }
- MBSTRG(detect_order_list) = NULL;
- MBSTRG(detect_order_list_size) = 0;
- return SUCCESS;
- }
- if (FAILURE == php_mb_parse_encoding_list(ZSTR_VAL(new_value), ZSTR_LEN(new_value), &list, &size, 1)) {
- return FAILURE;
- }
- if (MBSTRG(detect_order_list)) {
- pefree(MBSTRG(detect_order_list), 1);
- }
- MBSTRG(detect_order_list) = list;
- MBSTRG(detect_order_list_size) = size;
- return SUCCESS;
- }
- static PHP_INI_MH(OnUpdate_mbstring_http_input)
- {
- const mbfl_encoding **list;
- size_t size;
- if (!new_value || !ZSTR_VAL(new_value)) {
- if (MBSTRG(http_input_list)) {
- pefree(MBSTRG(http_input_list), 1);
- }
- if (SUCCESS == php_mb_parse_encoding_list(get_input_encoding(), strlen(get_input_encoding())+1, &list, &size, 1)) {
- MBSTRG(http_input_list) = list;
- MBSTRG(http_input_list_size) = size;
- return SUCCESS;
- }
- MBSTRG(http_input_list) = NULL;
- MBSTRG(http_input_list_size) = 0;
- return SUCCESS;
- }
- if (FAILURE == php_mb_parse_encoding_list(ZSTR_VAL(new_value), ZSTR_LEN(new_value), &list, &size, 1)) {
- return FAILURE;
- }
- if (MBSTRG(http_input_list)) {
- pefree(MBSTRG(http_input_list), 1);
- }
- MBSTRG(http_input_list) = list;
- MBSTRG(http_input_list_size) = size;
- if (stage & (PHP_INI_STAGE_ACTIVATE | PHP_INI_STAGE_RUNTIME)) {
- php_error_docref("ref.mbstring", E_DEPRECATED, "Use of mbstring.http_input is deprecated");
- }
- return SUCCESS;
- }
- static PHP_INI_MH(OnUpdate_mbstring_http_output)
- {
- const mbfl_encoding *encoding;
- if (new_value == NULL || ZSTR_LEN(new_value) == 0) {
- encoding = mbfl_name2encoding(get_output_encoding());
- if (!encoding) {
- MBSTRG(http_output_encoding) = &mbfl_encoding_pass;
- MBSTRG(current_http_output_encoding) = &mbfl_encoding_pass;
- return SUCCESS;
- }
- } else {
- encoding = mbfl_name2encoding(ZSTR_VAL(new_value));
- if (!encoding) {
- MBSTRG(http_output_encoding) = &mbfl_encoding_pass;
- MBSTRG(current_http_output_encoding) = &mbfl_encoding_pass;
- return FAILURE;
- }
- }
- MBSTRG(http_output_encoding) = encoding;
- MBSTRG(current_http_output_encoding) = encoding;
- if (stage & (PHP_INI_STAGE_ACTIVATE | PHP_INI_STAGE_RUNTIME)) {
- php_error_docref("ref.mbstring", E_DEPRECATED, "Use of mbstring.http_output is deprecated");
- }
- return SUCCESS;
- }
- int _php_mb_ini_mbstring_internal_encoding_set(const char *new_value, size_t new_value_length)
- {
- const mbfl_encoding *encoding;
- if (!new_value || !new_value_length || !(encoding = mbfl_name2encoding(new_value))) {
-
- encoding = mbfl_no2encoding(mbfl_no_encoding_utf8);
- }
- MBSTRG(internal_encoding) = encoding;
- MBSTRG(current_internal_encoding) = encoding;
- #if HAVE_MBREGEX
- {
- const char *enc_name = new_value;
- if (FAILURE == php_mb_regex_set_default_mbctype(enc_name)) {
-
- enc_name = "UTF-8";
- php_mb_regex_set_default_mbctype(enc_name);
- }
- php_mb_regex_set_mbctype(new_value);
- }
- #endif
- return SUCCESS;
- }
- static PHP_INI_MH(OnUpdate_mbstring_internal_encoding)
- {
- if (stage & (PHP_INI_STAGE_ACTIVATE | PHP_INI_STAGE_RUNTIME)) {
- php_error_docref("ref.mbstring", E_DEPRECATED, "Use of mbstring.internal_encoding is deprecated");
- }
- if (OnUpdateString(entry, new_value, mh_arg1, mh_arg2, mh_arg3, stage) == FAILURE) {
- return FAILURE;
- }
- if (stage & (PHP_INI_STAGE_STARTUP | PHP_INI_STAGE_SHUTDOWN | PHP_INI_STAGE_RUNTIME)) {
- if (new_value && ZSTR_LEN(new_value)) {
- return _php_mb_ini_mbstring_internal_encoding_set(ZSTR_VAL(new_value), ZSTR_LEN(new_value));
- } else {
- return _php_mb_ini_mbstring_internal_encoding_set(get_internal_encoding(), strlen(get_internal_encoding())+1);
- }
- } else {
-
- return SUCCESS;
- }
- }
- static PHP_INI_MH(OnUpdate_mbstring_substitute_character)
- {
- int c;
- char *endptr = NULL;
- if (new_value != NULL) {
- if (strcasecmp("none", ZSTR_VAL(new_value)) == 0) {
- MBSTRG(filter_illegal_mode) = MBFL_OUTPUTFILTER_ILLEGAL_MODE_NONE;
- MBSTRG(current_filter_illegal_mode) = MBFL_OUTPUTFILTER_ILLEGAL_MODE_NONE;
- } else if (strcasecmp("long", ZSTR_VAL(new_value)) == 0) {
- MBSTRG(filter_illegal_mode) = MBFL_OUTPUTFILTER_ILLEGAL_MODE_LONG;
- MBSTRG(current_filter_illegal_mode) = MBFL_OUTPUTFILTER_ILLEGAL_MODE_LONG;
- } else if (strcasecmp("entity", ZSTR_VAL(new_value)) == 0) {
- MBSTRG(filter_illegal_mode) = MBFL_OUTPUTFILTER_ILLEGAL_MODE_ENTITY;
- MBSTRG(current_filter_illegal_mode) = MBFL_OUTPUTFILTER_ILLEGAL_MODE_ENTITY;
- } else {
- MBSTRG(filter_illegal_mode) = MBFL_OUTPUTFILTER_ILLEGAL_MODE_CHAR;
- MBSTRG(current_filter_illegal_mode) = MBFL_OUTPUTFILTER_ILLEGAL_MODE_CHAR;
- if (ZSTR_LEN(new_value) > 0) {
- c = strtol(ZSTR_VAL(new_value), &endptr, 0);
- if (*endptr == '\0') {
- MBSTRG(filter_illegal_substchar) = c;
- MBSTRG(current_filter_illegal_substchar) = c;
- }
- }
- }
- } else {
- MBSTRG(filter_illegal_mode) = MBFL_OUTPUTFILTER_ILLEGAL_MODE_CHAR;
- MBSTRG(current_filter_illegal_mode) = MBFL_OUTPUTFILTER_ILLEGAL_MODE_CHAR;
- MBSTRG(filter_illegal_substchar) = 0x3f;
- MBSTRG(current_filter_illegal_substchar) = 0x3f;
- }
- return SUCCESS;
- }
- static PHP_INI_MH(OnUpdate_mbstring_encoding_translation)
- {
- if (new_value == NULL) {
- return FAILURE;
- }
- OnUpdateBool(entry, new_value, mh_arg1, mh_arg2, mh_arg3, stage);
- if (MBSTRG(encoding_translation)) {
- sapi_unregister_post_entry(php_post_entries);
- sapi_register_post_entries(mbstr_post_entries);
- } else {
- sapi_unregister_post_entry(mbstr_post_entries);
- sapi_register_post_entries(php_post_entries);
- }
- return SUCCESS;
- }
- static PHP_INI_MH(OnUpdate_mbstring_http_output_conv_mimetypes)
- {
- zend_string *tmp;
- void *re = NULL;
- if (!new_value) {
- new_value = entry->orig_value;
- }
- tmp = php_trim(new_value, NULL, 0, 3);
- if (ZSTR_LEN(tmp) > 0) {
- if (!(re = _php_mb_compile_regex(ZSTR_VAL(tmp)))) {
- zend_string_release_ex(tmp, 0);
- return FAILURE;
- }
- }
- if (MBSTRG(http_output_conv_mimetypes)) {
- _php_mb_free_regex(MBSTRG(http_output_conv_mimetypes));
- }
- MBSTRG(http_output_conv_mimetypes) = re;
- zend_string_release_ex(tmp, 0);
- return SUCCESS;
- }
- PHP_INI_BEGIN()
- PHP_INI_ENTRY("mbstring.language", "neutral", PHP_INI_ALL, OnUpdate_mbstring_language)
- PHP_INI_ENTRY("mbstring.detect_order", NULL, PHP_INI_ALL, OnUpdate_mbstring_detect_order)
- PHP_INI_ENTRY("mbstring.http_input", NULL, PHP_INI_ALL, OnUpdate_mbstring_http_input)
- PHP_INI_ENTRY("mbstring.http_output", NULL, PHP_INI_ALL, OnUpdate_mbstring_http_output)
- STD_PHP_INI_ENTRY("mbstring.internal_encoding", NULL, PHP_INI_ALL, OnUpdate_mbstring_internal_encoding, internal_encoding_name, zend_mbstring_globals, mbstring_globals)
- PHP_INI_ENTRY("mbstring.substitute_character", NULL, PHP_INI_ALL, OnUpdate_mbstring_substitute_character)
- STD_PHP_INI_ENTRY("mbstring.func_overload", "0",
- PHP_INI_SYSTEM, OnUpdateLong, func_overload, zend_mbstring_globals, mbstring_globals)
- STD_PHP_INI_BOOLEAN("mbstring.encoding_translation", "0",
- PHP_INI_SYSTEM | PHP_INI_PERDIR,
- OnUpdate_mbstring_encoding_translation,
- encoding_translation, zend_mbstring_globals, mbstring_globals)
- PHP_INI_ENTRY("mbstring.http_output_conv_mimetypes",
- "^(text/|application/xhtml\\+xml)",
- PHP_INI_ALL,
- OnUpdate_mbstring_http_output_conv_mimetypes)
- STD_PHP_INI_BOOLEAN("mbstring.strict_detection", "0",
- PHP_INI_ALL,
- OnUpdateBool,
- strict_detection, zend_mbstring_globals, mbstring_globals)
- #if HAVE_MBREGEX
- STD_PHP_INI_ENTRY("mbstring.regex_stack_limit", "100000",PHP_INI_ALL, OnUpdateLong, regex_stack_limit, zend_mbstring_globals, mbstring_globals)
- #endif
- PHP_INI_END()
- static PHP_GINIT_FUNCTION(mbstring)
- {
- #if defined(COMPILE_DL_MBSTRING) && defined(ZTS)
- ZEND_TSRMLS_CACHE_UPDATE();
- #endif
- mbstring_globals->language = mbfl_no_language_uni;
- mbstring_globals->internal_encoding = NULL;
- mbstring_globals->current_internal_encoding = mbstring_globals->internal_encoding;
- mbstring_globals->http_output_encoding = &mbfl_encoding_pass;
- mbstring_globals->current_http_output_encoding = &mbfl_encoding_pass;
- mbstring_globals->http_input_identify = NULL;
- mbstring_globals->http_input_identify_get = NULL;
- mbstring_globals->http_input_identify_post = NULL;
- mbstring_globals->http_input_identify_cookie = NULL;
- mbstring_globals->http_input_identify_string = NULL;
- mbstring_globals->http_input_list = NULL;
- mbstring_globals->http_input_list_size = 0;
- mbstring_globals->detect_order_list = NULL;
- mbstring_globals->detect_order_list_size = 0;
- mbstring_globals->current_detect_order_list = NULL;
- mbstring_globals->current_detect_order_list_size = 0;
- mbstring_globals->default_detect_order_list = (enum mbfl_no_encoding *) php_mb_default_identify_list_neut;
- mbstring_globals->default_detect_order_list_size = sizeof(php_mb_default_identify_list_neut) / sizeof(php_mb_default_identify_list_neut[0]);
- mbstring_globals->filter_illegal_mode = MBFL_OUTPUTFILTER_ILLEGAL_MODE_CHAR;
- mbstring_globals->filter_illegal_substchar = 0x3f;
- mbstring_globals->current_filter_illegal_mode = MBFL_OUTPUTFILTER_ILLEGAL_MODE_CHAR;
- mbstring_globals->current_filter_illegal_substchar = 0x3f;
- mbstring_globals->illegalchars = 0;
- mbstring_globals->func_overload = 0;
- mbstring_globals->encoding_translation = 0;
- mbstring_globals->strict_detection = 0;
- mbstring_globals->outconv = NULL;
- mbstring_globals->http_output_conv_mimetypes = NULL;
- #if HAVE_MBREGEX
- mbstring_globals->mb_regex_globals = php_mb_regex_globals_alloc();
- #endif
- mbstring_globals->last_used_encoding_name = NULL;
- mbstring_globals->last_used_encoding = NULL;
- }
- static PHP_GSHUTDOWN_FUNCTION(mbstring)
- {
- if (mbstring_globals->http_input_list) {
- free(mbstring_globals->http_input_list);
- }
- if (mbstring_globals->detect_order_list) {
- free(mbstring_globals->detect_order_list);
- }
- if (mbstring_globals->http_output_conv_mimetypes) {
- _php_mb_free_regex(mbstring_globals->http_output_conv_mimetypes);
- }
- #if HAVE_MBREGEX
- php_mb_regex_globals_free(mbstring_globals->mb_regex_globals);
- #endif
- }
- PHP_MINIT_FUNCTION(mbstring)
- {
- #if defined(COMPILE_DL_MBSTRING) && defined(ZTS)
- ZEND_TSRMLS_CACHE_UPDATE();
- #endif
- __mbfl_allocators = (mbfl_allocators*)&_php_mb_allocators;
- REGISTER_INI_ENTRIES();
-
- sapi_register_treat_data(mbstr_treat_data);
-
- if (MBSTRG(encoding_translation)) {
- sapi_register_post_entries(mbstr_post_entries);
- }
- REGISTER_LONG_CONSTANT("MB_OVERLOAD_MAIL", MB_OVERLOAD_MAIL, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("MB_OVERLOAD_STRING", MB_OVERLOAD_STRING, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("MB_OVERLOAD_REGEX", MB_OVERLOAD_REGEX, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("MB_CASE_UPPER", PHP_UNICODE_CASE_UPPER, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("MB_CASE_LOWER", PHP_UNICODE_CASE_LOWER, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("MB_CASE_TITLE", PHP_UNICODE_CASE_TITLE, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("MB_CASE_FOLD", PHP_UNICODE_CASE_FOLD, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("MB_CASE_UPPER_SIMPLE", PHP_UNICODE_CASE_UPPER_SIMPLE, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("MB_CASE_LOWER_SIMPLE", PHP_UNICODE_CASE_LOWER_SIMPLE, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("MB_CASE_TITLE_SIMPLE", PHP_UNICODE_CASE_TITLE_SIMPLE, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("MB_CASE_FOLD_SIMPLE", PHP_UNICODE_CASE_FOLD_SIMPLE, CONST_CS | CONST_PERSISTENT);
- #if HAVE_MBREGEX
- PHP_MINIT(mb_regex) (INIT_FUNC_ARGS_PASSTHRU);
- #endif
- if (FAILURE == zend_multibyte_set_functions(&php_mb_zend_multibyte_functions)) {
- return FAILURE;
- }
- php_rfc1867_set_multibyte_callbacks(
- php_mb_encoding_translation,
- php_mb_gpc_get_detect_order,
- php_mb_gpc_set_input_encoding,
- php_mb_rfc1867_getword,
- php_mb_rfc1867_getword_conf,
- php_mb_rfc1867_basename);
-
- if (MBSTRG(func_overload)){
- zend_function *func, *orig;
- const struct mb_overload_def *p;
- zend_string *str;
- p = &(mb_ovld[0]);
- while (p->type > 0) {
- if ((MBSTRG(func_overload) & p->type) == p->type &&
- !zend_hash_str_exists(CG(function_table), p->save_func, strlen(p->save_func))
- ) {
- func = zend_hash_str_find_ptr(CG(function_table), p->ovld_func, strlen(p->ovld_func));
- if ((orig = zend_hash_str_find_ptr(CG(function_table), p->orig_func, strlen(p->orig_func))) == NULL) {
- php_error_docref("ref.mbstring", E_WARNING, "mbstring couldn't find function %s.", p->orig_func);
- return FAILURE;
- } else {
- ZEND_ASSERT(orig->type == ZEND_INTERNAL_FUNCTION);
- str = zend_string_init_interned(p->save_func, strlen(p->save_func), 1);
- zend_hash_add_mem(CG(function_table), str, orig, sizeof(zend_internal_function));
- zend_string_release_ex(str, 1);
- function_add_ref(orig);
- str = zend_string_init_interned(p->orig_func, strlen(p->orig_func), 1);
- zend_hash_update_mem(CG(function_table), str, func, sizeof(zend_internal_function));
- zend_string_release_ex(str, 1);
- function_add_ref(func);
- }
- }
- p++;
- }
- }
- return SUCCESS;
- }
- PHP_MSHUTDOWN_FUNCTION(mbstring)
- {
-
- if (MBSTRG(func_overload)){
- const struct mb_overload_def *p;
- zend_function *orig;
- p = &(mb_ovld[0]);
- while (p->type > 0) {
- if ((MBSTRG(func_overload) & p->type) == p->type &&
- (orig = zend_hash_str_find_ptr(CG(function_table), p->save_func, strlen(p->save_func)))) {
- zend_hash_str_update_mem(CG(function_table), p->orig_func, strlen(p->orig_func), orig, sizeof(zend_internal_function));
- function_add_ref(orig);
- zend_hash_str_del(CG(function_table), p->save_func, strlen(p->save_func));
- }
- p++;
- }
- }
- UNREGISTER_INI_ENTRIES();
- zend_multibyte_restore_functions();
- #if HAVE_MBREGEX
- PHP_MSHUTDOWN(mb_regex) (INIT_FUNC_ARGS_PASSTHRU);
- #endif
- return SUCCESS;
- }
- PHP_RINIT_FUNCTION(mbstring)
- {
- MBSTRG(current_internal_encoding) = MBSTRG(internal_encoding);
- MBSTRG(current_http_output_encoding) = MBSTRG(http_output_encoding);
- MBSTRG(current_filter_illegal_mode) = MBSTRG(filter_illegal_mode);
- MBSTRG(current_filter_illegal_substchar) = MBSTRG(filter_illegal_substchar);
- MBSTRG(illegalchars) = 0;
- php_mb_populate_current_detect_order_list();
-
- if (MBSTRG(func_overload)){
- zend_error(E_DEPRECATED, "The mbstring.func_overload directive is deprecated");
- CG(compiler_options) |= ZEND_COMPILE_NO_BUILTIN_STRLEN;
- }
- #if HAVE_MBREGEX
- PHP_RINIT(mb_regex) (INIT_FUNC_ARGS_PASSTHRU);
- #endif
- zend_multibyte_set_internal_encoding((const zend_encoding *)MBSTRG(internal_encoding));
- return SUCCESS;
- }
- PHP_RSHUTDOWN_FUNCTION(mbstring)
- {
- if (MBSTRG(current_detect_order_list) != NULL) {
- efree(MBSTRG(current_detect_order_list));
- MBSTRG(current_detect_order_list) = NULL;
- MBSTRG(current_detect_order_list_size) = 0;
- }
- if (MBSTRG(outconv) != NULL) {
- MBSTRG(illegalchars) += mbfl_buffer_illegalchars(MBSTRG(outconv));
- mbfl_buffer_converter_delete(MBSTRG(outconv));
- MBSTRG(outconv) = NULL;
- }
-
- MBSTRG(http_input_identify) = NULL;
- MBSTRG(http_input_identify_post) = NULL;
- MBSTRG(http_input_identify_get) = NULL;
- MBSTRG(http_input_identify_cookie) = NULL;
- MBSTRG(http_input_identify_string) = NULL;
- if (MBSTRG(last_used_encoding_name)) {
- efree(MBSTRG(last_used_encoding_name));
- MBSTRG(last_used_encoding_name) = NULL;
- }
- #if HAVE_MBREGEX
- PHP_RSHUTDOWN(mb_regex) (INIT_FUNC_ARGS_PASSTHRU);
- #endif
- return SUCCESS;
- }
- PHP_MINFO_FUNCTION(mbstring)
- {
- php_info_print_table_start();
- php_info_print_table_row(2, "Multibyte Support", "enabled");
- php_info_print_table_row(2, "Multibyte string engine", "libmbfl");
- php_info_print_table_row(2, "HTTP input encoding translation", MBSTRG(encoding_translation) ? "enabled": "disabled");
- {
- char tmp[256];
- snprintf(tmp, sizeof(tmp), "%d.%d.%d", MBFL_VERSION_MAJOR, MBFL_VERSION_MINOR, MBFL_VERSION_TEENY);
- php_info_print_table_row(2, "libmbfl version", tmp);
- }
- #if HAVE_ONIG
- {
- char tmp[256];
- snprintf(tmp, sizeof(tmp), "%d.%d.%d", ONIGURUMA_VERSION_MAJOR, ONIGURUMA_VERSION_MINOR, ONIGURUMA_VERSION_TEENY);
- php_info_print_table_row(2, "oniguruma version", tmp);
- }
- #endif
- php_info_print_table_end();
- php_info_print_table_start();
- php_info_print_table_header(1, "mbstring extension makes use of \"streamable kanji code filter and converter\", which is distributed under the GNU Lesser General Public License version 2.1.");
- php_info_print_table_end();
- #if HAVE_MBREGEX
- PHP_MINFO(mb_regex)(ZEND_MODULE_INFO_FUNC_ARGS_PASSTHRU);
- #endif
- DISPLAY_INI_ENTRIES();
- }
- PHP_FUNCTION(mb_language)
- {
- zend_string *name = NULL;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "|S", &name) == FAILURE) {
- return;
- }
- if (name == NULL) {
- RETVAL_STRING((char *)mbfl_no_language2name(MBSTRG(language)));
- } else {
- zend_string *ini_name = zend_string_init("mbstring.language", sizeof("mbstring.language") - 1, 0);
- if (FAILURE == zend_alter_ini_entry(ini_name, name, PHP_INI_USER, PHP_INI_STAGE_RUNTIME)) {
- php_error_docref(NULL, E_WARNING, "Unknown language \"%s\"", ZSTR_VAL(name));
- RETVAL_FALSE;
- } else {
- RETVAL_TRUE;
- }
- zend_string_release_ex(ini_name, 0);
- }
- }
- PHP_FUNCTION(mb_internal_encoding)
- {
- const char *name = NULL;
- size_t name_len;
- const mbfl_encoding *encoding;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "|s", &name, &name_len) == FAILURE) {
- return;
- }
- if (name == NULL) {
- name = MBSTRG(current_internal_encoding) ? MBSTRG(current_internal_encoding)->name: NULL;
- if (name != NULL) {
- RETURN_STRING(name);
- } else {
- RETURN_FALSE;
- }
- } else {
- encoding = mbfl_name2encoding(name);
- if (!encoding) {
- php_error_docref(NULL, E_WARNING, "Unknown encoding \"%s\"", name);
- RETURN_FALSE;
- } else {
- MBSTRG(current_internal_encoding) = encoding;
- RETURN_TRUE;
- }
- }
- }
- PHP_FUNCTION(mb_http_input)
- {
- char *typ = NULL;
- size_t typ_len;
- int retname;
- char *list, *temp;
- const mbfl_encoding *result = NULL;
- retname = 1;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "|s", &typ, &typ_len) == FAILURE) {
- return;
- }
- if (typ == NULL) {
- result = MBSTRG(http_input_identify);
- } else {
- switch (*typ) {
- case 'G':
- case 'g':
- result = MBSTRG(http_input_identify_get);
- break;
- case 'P':
- case 'p':
- result = MBSTRG(http_input_identify_post);
- break;
- case 'C':
- case 'c':
- result = MBSTRG(http_input_identify_cookie);
- break;
- case 'S':
- case 's':
- result = MBSTRG(http_input_identify_string);
- break;
- case 'I':
- case 'i':
- {
- const mbfl_encoding **entry = MBSTRG(http_input_list);
- const size_t n = MBSTRG(http_input_list_size);
- size_t i;
- array_init(return_value);
- for (i = 0; i < n; i++) {
- add_next_index_string(return_value, (*entry)->name);
- entry++;
- }
- retname = 0;
- }
- break;
- case 'L':
- case 'l':
- {
- const mbfl_encoding **entry = MBSTRG(http_input_list);
- const size_t n = MBSTRG(http_input_list_size);
- size_t i;
- list = NULL;
- for (i = 0; i < n; i++) {
- if (list) {
- temp = list;
- spprintf(&list, 0, "%s,%s", temp, (*entry)->name);
- efree(temp);
- if (!list) {
- break;
- }
- } else {
- list = estrdup((*entry)->name);
- }
- entry++;
- }
- }
- if (!list) {
- RETURN_FALSE;
- }
- RETVAL_STRING(list);
- efree(list);
- retname = 0;
- break;
- default:
- result = MBSTRG(http_input_identify);
- break;
- }
- }
- if (retname) {
- if (result) {
- RETVAL_STRING(result->name);
- } else {
- RETVAL_FALSE;
- }
- }
- }
- PHP_FUNCTION(mb_http_output)
- {
- const char *name = NULL;
- size_t name_len;
- const mbfl_encoding *encoding;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "|s", &name, &name_len) == FAILURE) {
- return;
- }
- if (name == NULL) {
- name = MBSTRG(current_http_output_encoding) ? MBSTRG(current_http_output_encoding)->name: NULL;
- if (name != NULL) {
- RETURN_STRING(name);
- } else {
- RETURN_FALSE;
- }
- } else {
- encoding = mbfl_name2encoding(name);
- if (!encoding) {
- php_error_docref(NULL, E_WARNING, "Unknown encoding \"%s\"", name);
- RETURN_FALSE;
- } else {
- MBSTRG(current_http_output_encoding) = encoding;
- RETURN_TRUE;
- }
- }
- }
- PHP_FUNCTION(mb_detect_order)
- {
- zval *arg1 = NULL;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "|z", &arg1) == FAILURE) {
- return;
- }
- if (!arg1) {
- size_t i;
- size_t n = MBSTRG(current_detect_order_list_size);
- const mbfl_encoding **entry = MBSTRG(current_detect_order_list);
- array_init(return_value);
- for (i = 0; i < n; i++) {
- add_next_index_string(return_value, (*entry)->name);
- entry++;
- }
- } else {
- const mbfl_encoding **list = NULL;
- size_t size = 0;
- switch (Z_TYPE_P(arg1)) {
- case IS_ARRAY:
- if (FAILURE == php_mb_parse_encoding_array(arg1, &list, &size, 0)) {
- if (list) {
- efree(list);
- }
- RETURN_FALSE;
- }
- break;
- default:
- convert_to_string_ex(arg1);
- if (FAILURE == php_mb_parse_encoding_list(Z_STRVAL_P(arg1), Z_STRLEN_P(arg1), &list, &size, 0)) {
- if (list) {
- efree(list);
- }
- RETURN_FALSE;
- }
- break;
- }
- if (list == NULL) {
- RETURN_FALSE;
- }
- if (MBSTRG(current_detect_order_list)) {
- efree(MBSTRG(current_detect_order_list));
- }
- MBSTRG(current_detect_order_list) = list;
- MBSTRG(current_detect_order_list_size) = size;
- RETURN_TRUE;
- }
- }
- static inline int php_mb_check_code_point(zend_long cp)
- {
- if (cp <= 0 || cp >= 0x110000) {
-
- return 0;
- }
- if (cp >= 0xd800 && cp <= 0xdfff) {
-
- return 0;
- }
-
- return 1;
- }
- PHP_FUNCTION(mb_substitute_character)
- {
- zval *arg1 = NULL;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "|z", &arg1) == FAILURE) {
- return;
- }
- if (!arg1) {
- if (MBSTRG(current_filter_illegal_mode) == MBFL_OUTPUTFILTER_ILLEGAL_MODE_NONE) {
- RETURN_STRING("none");
- } else if (MBSTRG(current_filter_illegal_mode) == MBFL_OUTPUTFILTER_ILLEGAL_MODE_LONG) {
- RETURN_STRING("long");
- } else if (MBSTRG(current_filter_illegal_mode) == MBFL_OUTPUTFILTER_ILLEGAL_MODE_ENTITY) {
- RETURN_STRING("entity");
- } else {
- RETURN_LONG(MBSTRG(current_filter_illegal_substchar));
- }
- } else {
- RETVAL_TRUE;
- switch (Z_TYPE_P(arg1)) {
- case IS_STRING:
- if (strncasecmp("none", Z_STRVAL_P(arg1), Z_STRLEN_P(arg1)) == 0) {
- MBSTRG(current_filter_illegal_mode) = MBFL_OUTPUTFILTER_ILLEGAL_MODE_NONE;
- } else if (strncasecmp("long", Z_STRVAL_P(arg1), Z_STRLEN_P(arg1)) == 0) {
- MBSTRG(current_filter_illegal_mode) = MBFL_OUTPUTFILTER_ILLEGAL_MODE_LONG;
- } else if (strncasecmp("entity", Z_STRVAL_P(arg1), Z_STRLEN_P(arg1)) == 0) {
- MBSTRG(current_filter_illegal_mode) = MBFL_OUTPUTFILTER_ILLEGAL_MODE_ENTITY;
- } else {
- convert_to_long_ex(arg1);
- if (php_mb_check_code_point(Z_LVAL_P(arg1))) {
- MBSTRG(current_filter_illegal_mode) = MBFL_OUTPUTFILTER_ILLEGAL_MODE_CHAR;
- MBSTRG(current_filter_illegal_substchar) = Z_LVAL_P(arg1);
- } else {
- php_error_docref(NULL, E_WARNING, "Unknown character");
- RETURN_FALSE;
- }
- }
- break;
- default:
- convert_to_long_ex(arg1);
- if (php_mb_check_code_point(Z_LVAL_P(arg1))) {
- MBSTRG(current_filter_illegal_mode) = MBFL_OUTPUTFILTER_ILLEGAL_MODE_CHAR;
- MBSTRG(current_filter_illegal_substchar) = Z_LVAL_P(arg1);
- } else {
- php_error_docref(NULL, E_WARNING, "Unknown character");
- RETURN_FALSE;
- }
- break;
- }
- }
- }
- PHP_FUNCTION(mb_preferred_mime_name)
- {
- enum mbfl_no_encoding no_encoding;
- char *name = NULL;
- size_t name_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &name, &name_len) == FAILURE) {
- return;
- } else {
- no_encoding = mbfl_name2no_encoding(name);
- if (no_encoding == mbfl_no_encoding_invalid) {
- php_error_docref(NULL, E_WARNING, "Unknown encoding \"%s\"", name);
- RETVAL_FALSE;
- } else {
- const char *preferred_name = mbfl_no2preferred_mime_name(no_encoding);
- if (preferred_name == NULL || *preferred_name == '\0') {
- php_error_docref(NULL, E_WARNING, "No MIME preferred name corresponding to \"%s\"", name);
- RETVAL_FALSE;
- } else {
- RETVAL_STRING((char *)preferred_name);
- }
- }
- }
- }
- #define IS_SJIS1(c) ((((c)>=0x81 && (c)<=0x9f) || ((c)>=0xe0 && (c)<=0xf5)) ? 1 : 0)
- #define IS_SJIS2(c) ((((c)>=0x40 && (c)<=0x7e) || ((c)>=0x80 && (c)<=0xfc)) ? 1 : 0)
- PHP_FUNCTION(mb_parse_str)
- {
- zval *track_vars_array = NULL;
- char *encstr = NULL;
- size_t encstr_len;
- php_mb_encoding_handler_info_t info;
- const mbfl_encoding *detected;
- track_vars_array = NULL;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|z/", &encstr, &encstr_len, &track_vars_array) == FAILURE) {
- return;
- }
- if (track_vars_array != NULL) {
-
- zval_ptr_dtor(track_vars_array);
- array_init(track_vars_array);
- }
- encstr = estrndup(encstr, encstr_len);
- info.data_type = PARSE_STRING;
- info.separator = PG(arg_separator).input;
- info.report_errors = 1;
- info.to_encoding = MBSTRG(current_internal_encoding);
- info.to_language = MBSTRG(language);
- info.from_encodings = MBSTRG(http_input_list);
- info.num_from_encodings = MBSTRG(http_input_list_size);
- info.from_language = MBSTRG(language);
- if (track_vars_array != NULL) {
- detected = _php_mb_encoding_handler_ex(&info, track_vars_array, encstr);
- } else {
- zval tmp;
- zend_array *symbol_table;
- if (zend_forbid_dynamic_call("mb_parse_str() with a single argument") == FAILURE) {
- efree(encstr);
- return;
- }
- php_error_docref(NULL, E_DEPRECATED, "Calling mb_parse_str() without the result argument is deprecated");
- symbol_table = zend_rebuild_symbol_table();
- ZVAL_ARR(&tmp, symbol_table);
- detected = _php_mb_encoding_handler_ex(&info, &tmp, encstr);
- }
- MBSTRG(http_input_identify) = detected;
- RETVAL_BOOL(detected);
- if (encstr != NULL) efree(encstr);
- }
- PHP_FUNCTION(mb_output_handler)
- {
- char *arg_string;
- size_t arg_string_len;
- zend_long arg_status;
- mbfl_string string, result;
- const char *charset;
- char *p;
- const mbfl_encoding *encoding;
- int last_feed;
- size_t len;
- unsigned char send_text_mimetype = 0;
- char *s, *mimetype = NULL;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "sl", &arg_string, &arg_string_len, &arg_status) == FAILURE) {
- return;
- }
- encoding = MBSTRG(current_http_output_encoding);
-
- if ((arg_status & PHP_OUTPUT_HANDLER_START) != 0) {
-
- if (MBSTRG(outconv)) {
- MBSTRG(illegalchars) += mbfl_buffer_illegalchars(MBSTRG(outconv));
- mbfl_buffer_converter_delete(MBSTRG(outconv));
- MBSTRG(outconv) = NULL;
- }
- if (encoding == &mbfl_encoding_pass) {
- RETURN_STRINGL(arg_string, arg_string_len);
- }
-
- if (SG(sapi_headers).mimetype &&
- _php_mb_match_regex(
- MBSTRG(http_output_conv_mimetypes),
- SG(sapi_headers).mimetype,
- strlen(SG(sapi_headers).mimetype))) {
- if ((s = strchr(SG(sapi_headers).mimetype,';')) == NULL){
- mimetype = estrdup(SG(sapi_headers).mimetype);
- } else {
- mimetype = estrndup(SG(sapi_headers).mimetype,s-SG(sapi_headers).mimetype);
- }
- send_text_mimetype = 1;
- } else if (SG(sapi_headers).send_default_content_type) {
- mimetype = SG(default_mimetype) ? SG(default_mimetype) : SAPI_DEFAULT_MIMETYPE;
- }
-
- if (SG(sapi_headers).send_default_content_type || send_text_mimetype) {
- charset = encoding->mime_name;
- if (charset) {
- len = spprintf( &p, 0, "Content-Type: %s; charset=%s", mimetype, charset );
- if (sapi_add_header(p, len, 0) != FAILURE) {
- SG(sapi_headers).send_default_content_type = 0;
- }
- }
-
- MBSTRG(outconv) = mbfl_buffer_converter_new(MBSTRG(current_internal_encoding), encoding, 0);
- if (send_text_mimetype){
- efree(mimetype);
- }
- }
- }
-
- if (MBSTRG(outconv) == NULL) {
- RETURN_STRINGL(arg_string, arg_string_len);
- }
-
- last_feed = ((arg_status & PHP_OUTPUT_HANDLER_END) != 0);
-
- mbfl_buffer_converter_illegal_mode(MBSTRG(outconv), MBSTRG(current_filter_illegal_mode));
- mbfl_buffer_converter_illegal_substchar(MBSTRG(outconv), MBSTRG(current_filter_illegal_substchar));
-
- mbfl_string_init(&string);
-
- string.val = (unsigned char *)arg_string;
- string.len = arg_string_len;
- mbfl_buffer_converter_feed(MBSTRG(outconv), &string);
- if (last_feed) {
- mbfl_buffer_converter_flush(MBSTRG(outconv));
- }
-
- mbfl_buffer_converter_result(MBSTRG(outconv), &result);
-
- RETVAL_STRINGL((char *)result.val, result.len);
- efree(result.val);
-
- if (last_feed) {
- MBSTRG(illegalchars) += mbfl_buffer_illegalchars(MBSTRG(outconv));
- mbfl_buffer_converter_delete(MBSTRG(outconv));
- MBSTRG(outconv) = NULL;
- }
- }
- PHP_FUNCTION(mb_strlen)
- {
- size_t n;
- mbfl_string string;
- char *str, *enc_name = NULL;
- size_t str_len, enc_name_len;
- mbfl_string_init(&string);
- ZEND_PARSE_PARAMETERS_START(1, 2)
- Z_PARAM_STRING(str, str_len)
- Z_PARAM_OPTIONAL
- Z_PARAM_STRING(enc_name, enc_name_len)
- ZEND_PARSE_PARAMETERS_END();
- string.val = (unsigned char *) str;
- string.len = str_len;
- string.no_language = MBSTRG(language);
- string.encoding = php_mb_get_encoding(enc_name);
- if (!string.encoding) {
- RETURN_FALSE;
- }
- n = mbfl_strlen(&string);
- if (!mbfl_is_error(n)) {
- RETVAL_LONG(n);
- } else {
- RETVAL_FALSE;
- }
- }
- PHP_FUNCTION(mb_strpos)
- {
- int reverse = 0;
- zend_long offset = 0;
- mbfl_string haystack, needle;
- char *enc_name = NULL;
- size_t enc_name_len, n;
- mbfl_string_init(&haystack);
- mbfl_string_init(&needle);
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss|ls", (char **)&haystack.val, &haystack.len, (char **)&needle.val, &needle.len, &offset, &enc_name, &enc_name_len) == FAILURE) {
- return;
- }
- haystack.no_language = needle.no_language = MBSTRG(language);
- haystack.encoding = needle.encoding = php_mb_get_encoding(enc_name);
- if (!haystack.encoding) {
- RETURN_FALSE;
- }
- if (offset != 0) {
- size_t slen = mbfl_strlen(&haystack);
- if (offset < 0) {
- offset += slen;
- }
- if (offset < 0 || offset > slen) {
- php_error_docref(NULL, E_WARNING, "Offset not contained in string");
- RETURN_FALSE;
- }
- }
- if (needle.len == 0) {
- php_error_docref(NULL, E_WARNING, "Empty delimiter");
- RETURN_FALSE;
- }
- n = mbfl_strpos(&haystack, &needle, offset, reverse);
- if (!mbfl_is_error(n)) {
- RETVAL_LONG(n);
- } else {
- switch (-n) {
- case 1:
- break;
- case 2:
- php_error_docref(NULL, E_WARNING, "Needle has not positive length");
- break;
- case 4:
- php_error_docref(NULL, E_WARNING, "Unknown encoding or conversion error");
- break;
- case 8:
- php_error_docref(NULL, E_NOTICE, "Argument is empty");
- break;
- default:
- php_error_docref(NULL, E_WARNING, "Unknown error in mb_strpos");
- break;
- }
- RETVAL_FALSE;
- }
- }
- PHP_FUNCTION(mb_strrpos)
- {
- mbfl_string haystack, needle;
- char *enc_name = NULL;
- size_t enc_name_len;
- zval *zoffset = NULL;
- zend_long offset = 0, str_flg, n;
- char *enc_name2 = NULL;
- size_t enc_name_len2;
- mbfl_string_init(&haystack);
- mbfl_string_init(&needle);
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss|zs", (char **)&haystack.val, &haystack.len, (char **)&needle.val, &needle.len, &zoffset, &enc_name, &enc_name_len) == FAILURE) {
- return;
- }
- if (zoffset) {
- if (Z_TYPE_P(zoffset) == IS_STRING) {
- enc_name2 = Z_STRVAL_P(zoffset);
- enc_name_len2 = Z_STRLEN_P(zoffset);
- str_flg = 1;
- if (enc_name2 != NULL) {
- switch (*enc_name2) {
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- case ' ':
- case '-':
- case '.':
- break;
- default :
- str_flg = 0;
- break;
- }
- }
- if (str_flg) {
- convert_to_long_ex(zoffset);
- offset = Z_LVAL_P(zoffset);
- } else {
- enc_name = enc_name2;
- enc_name_len = enc_name_len2;
- }
- } else {
- convert_to_long_ex(zoffset);
- offset = Z_LVAL_P(zoffset);
- }
- }
- haystack.no_language = needle.no_language = MBSTRG(language);
- haystack.encoding = needle.encoding = php_mb_get_encoding(enc_name);
- if (!haystack.encoding) {
- RETURN_FALSE;
- }
- if (offset != 0) {
- size_t haystack_char_len = mbfl_strlen(&haystack);
- if ((offset > 0 && offset > haystack_char_len) ||
- (offset < 0 && -offset > haystack_char_len)) {
- php_error_docref(NULL, E_WARNING, "Offset is greater than the length of haystack string");
- RETURN_FALSE;
- }
- }
- n = mbfl_strpos(&haystack, &needle, offset, 1);
- if (!mbfl_is_error(n)) {
- RETVAL_LONG(n);
- } else {
- RETVAL_FALSE;
- }
- }
- PHP_FUNCTION(mb_stripos)
- {
- size_t n = (size_t) -1;
- zend_long offset = 0;
- mbfl_string haystack, needle;
- const char *from_encoding = MBSTRG(current_internal_encoding)->mime_name;
- size_t from_encoding_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss|ls", (char **)&haystack.val, &haystack.len, (char **)&needle.val, &needle.len, &offset, &from_encoding, &from_encoding_len) == FAILURE) {
- return;
- }
- if (needle.len == 0) {
- php_error_docref(NULL, E_WARNING, "Empty delimiter");
- RETURN_FALSE;
- }
- n = php_mb_stripos(0, (char *)haystack.val, haystack.len, (char *)needle.val, needle.len, offset, from_encoding);
- if (!mbfl_is_error(n)) {
- RETVAL_LONG(n);
- } else {
- RETVAL_FALSE;
- }
- }
- PHP_FUNCTION(mb_strripos)
- {
- size_t n = (size_t) -1;
- zend_long offset = 0;
- mbfl_string haystack, needle;
- const char *from_encoding = MBSTRG(current_internal_encoding)->mime_name;
- size_t from_encoding_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss|ls", (char **)&haystack.val, &haystack.len, (char **)&needle.val, &needle.len, &offset, &from_encoding, &from_encoding_len) == FAILURE) {
- return;
- }
- n = php_mb_stripos(1, (char *)haystack.val, haystack.len, (char *)needle.val, needle.len, offset, from_encoding);
- if (!mbfl_is_error(n)) {
- RETVAL_LONG(n);
- } else {
- RETVAL_FALSE;
- }
- }
- PHP_FUNCTION(mb_strstr)
- {
- size_t n;
- mbfl_string haystack, needle, result, *ret = NULL;
- char *enc_name = NULL;
- size_t enc_name_len;
- zend_bool part = 0;
- mbfl_string_init(&haystack);
- mbfl_string_init(&needle);
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss|bs", (char **)&haystack.val, &haystack.len, (char **)&needle.val, &needle.len, &part, &enc_name, &enc_name_len) == FAILURE) {
- return;
- }
- haystack.no_language = needle.no_language = MBSTRG(language);
- haystack.encoding = needle.encoding = php_mb_get_encoding(enc_name);
- if (!haystack.encoding) {
- RETURN_FALSE;
- }
- if (needle.len == 0) {
- php_error_docref(NULL, E_WARNING, "Empty delimiter");
- RETURN_FALSE;
- }
- n = mbfl_strpos(&haystack, &needle, 0, 0);
- if (!mbfl_is_error(n)) {
- if (part) {
- ret = mbfl_substr(&haystack, &result, 0, n);
- if (ret != NULL) {
-
- RETVAL_STRINGL((char *)ret->val, ret->len);
- efree(ret->val);
- } else {
- RETVAL_FALSE;
- }
- } else {
- ret = mbfl_substr(&haystack, &result, n, MBFL_SUBSTR_UNTIL_END);
- if (ret != NULL) {
-
- RETVAL_STRINGL((char *)ret->val, ret->len);
- efree(ret->val);
- } else {
- RETVAL_FALSE;
- }
- }
- } else {
- RETVAL_FALSE;
- }
- }
- PHP_FUNCTION(mb_strrchr)
- {
- size_t n;
- mbfl_string haystack, needle, result, *ret = NULL;
- char *enc_name = NULL;
- size_t enc_name_len;
- zend_bool part = 0;
- mbfl_string_init(&haystack);
- mbfl_string_init(&needle);
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss|bs", (char **)&haystack.val, &haystack.len, (char **)&needle.val, &needle.len, &part, &enc_name, &enc_name_len) == FAILURE) {
- return;
- }
- haystack.no_language = needle.no_language = MBSTRG(language);
- haystack.encoding = needle.encoding = php_mb_get_encoding(enc_name);
- if (!haystack.encoding) {
- RETURN_FALSE;
- }
- if (haystack.len == 0) {
- RETURN_FALSE;
- }
- if (needle.len == 0) {
- RETURN_FALSE;
- }
- n = mbfl_strpos(&haystack, &needle, 0, 1);
- if (!mbfl_is_error(n)) {
- if (part) {
- ret = mbfl_substr(&haystack, &result, 0, n);
- if (ret != NULL) {
-
- RETVAL_STRINGL((char *)ret->val, ret->len);
- efree(ret->val);
- } else {
- RETVAL_FALSE;
- }
- } else {
- ret = mbfl_substr(&haystack, &result, n, MBFL_SUBSTR_UNTIL_END);
- if (ret != NULL) {
-
- RETVAL_STRINGL((char *)ret->val, ret->len);
- efree(ret->val);
- } else {
- RETVAL_FALSE;
- }
- }
- } else {
- RETVAL_FALSE;
- }
- }
- PHP_FUNCTION(mb_stristr)
- {
- zend_bool part = 0;
- size_t from_encoding_len, n;
- mbfl_string haystack, needle, result, *ret = NULL;
- const char *from_encoding = NULL;
- mbfl_string_init(&haystack);
- mbfl_string_init(&needle);
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss|bs", (char **)&haystack.val, &haystack.len, (char **)&needle.val, &needle.len, &part, &from_encoding, &from_encoding_len) == FAILURE) {
- return;
- }
- haystack.no_language = needle.no_language = MBSTRG(language);
- haystack.encoding = needle.encoding = php_mb_get_encoding(from_encoding);
- if (!haystack.encoding) {
- RETURN_FALSE;
- }
- if (!needle.len) {
- php_error_docref(NULL, E_WARNING, "Empty delimiter");
- RETURN_FALSE;
- }
- n = php_mb_stripos(0, (char *)haystack.val, haystack.len, (char *)needle.val, needle.len, 0, from_encoding);
- if (mbfl_is_error(n)) {
- RETURN_FALSE;
- }
- if (part) {
- ret = mbfl_substr(&haystack, &result, 0, n);
- if (ret != NULL) {
-
- RETVAL_STRINGL((char *)ret->val, ret->len);
- efree(ret->val);
- } else {
- RETVAL_FALSE;
- }
- } else {
- ret = mbfl_substr(&haystack, &result, n, MBFL_SUBSTR_UNTIL_END);
- if (ret != NULL) {
-
- RETVAL_STRINGL((char *)ret->val, ret->len);
- efree(ret->val);
- } else {
- RETVAL_FALSE;
- }
- }
- }
- PHP_FUNCTION(mb_strrichr)
- {
- zend_bool part = 0;
- size_t n;
- size_t from_encoding_len;
- mbfl_string haystack, needle, result, *ret = NULL;
- const char *from_encoding = NULL;
- mbfl_string_init(&haystack);
- mbfl_string_init(&needle);
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss|bs", (char **)&haystack.val, &haystack.len, (char **)&needle.val, &needle.len, &part, &from_encoding, &from_encoding_len) == FAILURE) {
- return;
- }
- haystack.no_language = needle.no_language = MBSTRG(language);
- haystack.encoding = needle.encoding = php_mb_get_encoding(from_encoding);
- if (!haystack.encoding) {
- RETURN_FALSE;
- }
- n = php_mb_stripos(1, (char *)haystack.val, haystack.len, (char *)needle.val, needle.len, 0, from_encoding);
- if (mbfl_is_error(n)) {
- RETURN_FALSE;
- }
- if (part) {
- ret = mbfl_substr(&haystack, &result, 0, n);
- if (ret != NULL) {
-
- RETVAL_STRINGL((char *)ret->val, ret->len);
- efree(ret->val);
- } else {
- RETVAL_FALSE;
- }
- } else {
- ret = mbfl_substr(&haystack, &result, n, MBFL_SUBSTR_UNTIL_END);
- if (ret != NULL) {
-
- RETVAL_STRINGL((char *)ret->val, ret->len);
- efree(ret->val);
- } else {
- RETVAL_FALSE;
- }
- }
- }
- PHP_FUNCTION(mb_substr_count)
- {
- size_t n;
- mbfl_string haystack, needle;
- char *enc_name = NULL;
- size_t enc_name_len;
- mbfl_string_init(&haystack);
- mbfl_string_init(&needle);
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss|s", (char **)&haystack.val, &haystack.len, (char **)&needle.val, &needle.len, &enc_name, &enc_name_len) == FAILURE) {
- return;
- }
- haystack.no_language = needle.no_language = MBSTRG(language);
- haystack.encoding = needle.encoding = php_mb_get_encoding(enc_name);
- if (!haystack.encoding) {
- RETURN_FALSE;
- }
- if (needle.len == 0) {
- php_error_docref(NULL, E_WARNING, "Empty substring");
- RETURN_FALSE;
- }
- n = mbfl_substr_count(&haystack, &needle);
- if (!mbfl_is_error(n)) {
- RETVAL_LONG(n);
- } else {
- RETVAL_FALSE;
- }
- }
- PHP_FUNCTION(mb_substr)
- {
- char *str, *encoding = NULL;
- zend_long from, len;
- size_t mblen, real_from, real_len;
- size_t str_len, encoding_len;
- zend_bool len_is_null = 1;
- mbfl_string string, result, *ret;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "sl|l!s", &str, &str_len, &from, &len, &len_is_null, &encoding, &encoding_len) == FAILURE) {
- return;
- }
- mbfl_string_init(&string);
- string.no_language = MBSTRG(language);
- string.encoding = php_mb_get_encoding(encoding);
- if (!string.encoding) {
- RETURN_FALSE;
- }
- string.val = (unsigned char *)str;
- string.len = str_len;
-
- mblen = 0;
- if (from < 0 || (!len_is_null && len < 0)) {
- mblen = mbfl_strlen(&string);
- }
-
- if (from >= 0) {
- real_from = (size_t) from;
- } else if (-from < mblen) {
- real_from = mblen + from;
- } else {
- real_from = 0;
- }
-
- if (len_is_null) {
- real_len = MBFL_SUBSTR_UNTIL_END;
- } else if (len >= 0) {
- real_len = (size_t) len;
- } else if (real_from < mblen && -len < mblen - real_from) {
- real_len = (mblen - real_from) + len;
- } else {
- real_len = 0;
- }
- if (((MBSTRG(func_overload) & MB_OVERLOAD_STRING) == MB_OVERLOAD_STRING)
- && (real_from > mbfl_strlen(&string))) {
- RETURN_FALSE;
- }
- ret = mbfl_substr(&string, &result, real_from, real_len);
- if (NULL == ret) {
- RETURN_FALSE;
- }
-
- RETVAL_STRINGL((char *)ret->val, ret->len);
- efree(ret->val);
- }
- PHP_FUNCTION(mb_strcut)
- {
- char *encoding = NULL;
- zend_long from, len;
- size_t encoding_len;
- zend_bool len_is_null = 1;
- mbfl_string string, result, *ret;
- mbfl_string_init(&string);
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "sl|l!s", (char **)&string.val, &string.len, &from, &len, &len_is_null, &encoding, &encoding_len) == FAILURE) {
- return;
- }
- string.no_language = MBSTRG(language);
- string.encoding = php_mb_get_encoding(encoding);
- if (!string.encoding) {
- RETURN_FALSE;
- }
- if (len_is_null) {
- len = string.len;
- }
-
- if (from < 0) {
- from = string.len + from;
- if (from < 0) {
- from = 0;
- }
- }
-
- if (len < 0) {
- len = (string.len - from) + len;
- if (len < 0) {
- len = 0;
- }
- }
- if (from > string.len) {
- RETURN_FALSE;
- }
- ret = mbfl_strcut(&string, &result, from, len);
- if (ret == NULL) {
- RETURN_FALSE;
- }
-
- RETVAL_STRINGL((char *)ret->val, ret->len);
- efree(ret->val);
- }
- PHP_FUNCTION(mb_strwidth)
- {
- size_t n;
- mbfl_string string;
- char *enc_name = NULL;
- size_t enc_name_len;
- mbfl_string_init(&string);
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|s", (char **)&string.val, &string.len, &enc_name, &enc_name_len) == FAILURE) {
- return;
- }
- string.no_language = MBSTRG(language);
- string.encoding = php_mb_get_encoding(enc_name);
- if (!string.encoding) {
- RETURN_FALSE;
- }
- n = mbfl_strwidth(&string);
- if (!mbfl_is_error(n)) {
- RETVAL_LONG(n);
- } else {
- RETVAL_FALSE;
- }
- }
- PHP_FUNCTION(mb_strimwidth)
- {
- char *str, *trimmarker = NULL, *encoding = NULL;
- zend_long from, width, swidth;
- size_t str_len, trimmarker_len, encoding_len;
- mbfl_string string, result, marker, *ret;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "sll|ss", &str, &str_len, &from, &width, &trimmarker, &trimmarker_len, &encoding, &encoding_len) == FAILURE) {
- return;
- }
- mbfl_string_init(&string);
- mbfl_string_init(&marker);
- string.no_language = marker.no_language = MBSTRG(language);
- string.encoding = marker.encoding = php_mb_get_encoding(encoding);
- if (!string.encoding) {
- RETURN_FALSE;
- }
- string.val = (unsigned char *)str;
- string.len = str_len;
- marker.val = NULL;
- marker.len = 0;
- if ((from < 0) || (width < 0)) {
- swidth = mbfl_strwidth(&string);
- }
- if (from < 0) {
- from += swidth;
- }
- if (from < 0 || (size_t)from > str_len) {
- php_error_docref(NULL, E_WARNING, "Start position is out of range");
- RETURN_FALSE;
- }
- if (width < 0) {
- width = swidth + width - from;
- }
- if (width < 0) {
- php_error_docref(NULL, E_WARNING, "Width is out of range");
- RETURN_FALSE;
- }
- if (trimmarker) {
- marker.val = (unsigned char *)trimmarker;
- marker.len = trimmarker_len;
- }
- ret = mbfl_strimwidth(&string, &marker, &result, from, width);
- if (ret == NULL) {
- RETURN_FALSE;
- }
-
- RETVAL_STRINGL((char *)ret->val, ret->len);
- efree(ret->val);
- }
- static inline zend_bool php_mb_is_unsupported_no_encoding(enum mbfl_no_encoding no_enc)
- {
- return ((no_enc >= mbfl_no_encoding_invalid && no_enc <= mbfl_no_encoding_qprint)
- || (no_enc >= mbfl_no_encoding_utf7 && no_enc <= mbfl_no_encoding_utf7imap)
- || (no_enc >= mbfl_no_encoding_jis && no_enc <= mbfl_no_encoding_2022jpms)
- || (no_enc >= mbfl_no_encoding_cp50220 && no_enc <= mbfl_no_encoding_cp50222));
- }
- static inline zend_bool php_mb_is_no_encoding_utf8(enum mbfl_no_encoding no_enc)
- {
- return (no_enc >= mbfl_no_encoding_utf8 && no_enc <= mbfl_no_encoding_utf8_sb);
- }
- MBSTRING_API char *php_mb_convert_encoding_ex(const char *input, size_t length, const mbfl_encoding *to_encoding, const mbfl_encoding *from_encoding, size_t *output_len)
- {
- mbfl_string string, result, *ret;
- mbfl_buffer_converter *convd;
- char *output = NULL;
- if (output_len) {
- *output_len = 0;
- }
-
- mbfl_string_init(&string);
- mbfl_string_init(&result);
- string.encoding = from_encoding;
- string.no_language = MBSTRG(language);
- string.val = (unsigned char *)input;
- string.len = length;
-
- convd = mbfl_buffer_converter_new(from_encoding, to_encoding, string.len);
- if (convd == NULL) {
- php_error_docref(NULL, E_WARNING, "Unable to create character encoding converter");
- return NULL;
- }
- mbfl_buffer_converter_illegal_mode(convd, MBSTRG(current_filter_illegal_mode));
- mbfl_buffer_converter_illegal_substchar(convd, MBSTRG(current_filter_illegal_substchar));
-
- ret = mbfl_buffer_converter_feed_result(convd, &string, &result);
- if (ret) {
- if (output_len) {
- *output_len = ret->len;
- }
- output = (char *)ret->val;
- }
- MBSTRG(illegalchars) += mbfl_buffer_illegalchars(convd);
- mbfl_buffer_converter_delete(convd);
- return output;
- }
- MBSTRING_API char *php_mb_convert_encoding(const char *input, size_t length, const char *_to_encoding, const char *_from_encodings, size_t *output_len)
- {
- const mbfl_encoding *from_encoding, *to_encoding;
- if (output_len) {
- *output_len = 0;
- }
- if (!input) {
- return NULL;
- }
-
- if (_to_encoding && strlen(_to_encoding)) {
- to_encoding = mbfl_name2encoding(_to_encoding);
- if (!to_encoding) {
- php_error_docref(NULL, E_WARNING, "Unknown encoding \"%s\"", _to_encoding);
- return NULL;
- }
- } else {
- to_encoding = MBSTRG(current_internal_encoding);
- }
-
- from_encoding = MBSTRG(current_internal_encoding);
- if (_from_encodings) {
- const mbfl_encoding **list = NULL;
- size_t size = 0;
- php_mb_parse_encoding_list(_from_encodings, strlen(_from_encodings), &list, &size, 0);
- if (size == 1) {
- from_encoding = *list;
- } else if (size > 1) {
-
- mbfl_string string;
- mbfl_string_init(&string);
- string.val = (unsigned char *)input;
- string.len = length;
- from_encoding = mbfl_identify_encoding(&string, list, size, MBSTRG(strict_detection));
- if (!from_encoding) {
- php_error_docref(NULL, E_WARNING, "Unable to detect character encoding");
- from_encoding = &mbfl_encoding_pass;
- }
- } else {
- php_error_docref(NULL, E_WARNING, "Illegal character encoding specified");
- }
- if (list != NULL) {
- efree((void *)list);
- }
- }
- return php_mb_convert_encoding_ex(input, length, to_encoding, from_encoding, output_len);
- }
- MBSTRING_API HashTable *php_mb_convert_encoding_recursive(HashTable *input, const char *_to_encoding, const char *_from_encodings)
- {
- HashTable *output, *chash;
- zend_long idx;
- zend_string *key;
- zval *entry, entry_tmp;
- size_t ckey_len, cval_len;
- char *ckey, *cval;
- if (!input) {
- return NULL;
- }
- if (GC_IS_RECURSIVE(input)) {
- GC_UNPROTECT_RECURSION(input);
- php_error_docref(NULL, E_WARNING, "Cannot convert recursively referenced values");
- return NULL;
- }
- GC_TRY_PROTECT_RECURSION(input);
- output = zend_new_array(zend_hash_num_elements(input));
- ZEND_HASH_FOREACH_KEY_VAL(input, idx, key, entry) {
-
- if (key) {
- ckey = php_mb_convert_encoding(ZSTR_VAL(key), ZSTR_LEN(key), _to_encoding, _from_encodings, &ckey_len);
- key = zend_string_init(ckey, ckey_len, 0);
- efree(ckey);
- }
-
- ZEND_ASSERT(entry);
- switch(Z_TYPE_P(entry)) {
- case IS_STRING:
- cval = php_mb_convert_encoding(Z_STRVAL_P(entry), Z_STRLEN_P(entry), _to_encoding, _from_encodings, &cval_len);
- ZVAL_STRINGL(&entry_tmp, cval, cval_len);
- efree(cval);
- break;
- case IS_NULL:
- case IS_TRUE:
- case IS_FALSE:
- case IS_LONG:
- case IS_DOUBLE:
- ZVAL_COPY(&entry_tmp, entry);
- break;
- case IS_ARRAY:
- chash = php_mb_convert_encoding_recursive(HASH_OF(entry), _to_encoding, _from_encodings);
- if (chash) {
- ZVAL_ARR(&entry_tmp, chash);
- } else {
- ZVAL_EMPTY_ARRAY(&entry_tmp);
- }
- break;
- case IS_OBJECT:
- default:
- if (key) {
- zend_string_release(key);
- }
- php_error_docref(NULL, E_WARNING, "Object is not supported");
- continue;
- }
- if (key) {
- zend_hash_add(output, key, &entry_tmp);
- zend_string_release(key);
- } else {
- zend_hash_index_add(output, idx, &entry_tmp);
- }
- } ZEND_HASH_FOREACH_END();
- GC_TRY_UNPROTECT_RECURSION(input);
- return output;
- }
- PHP_FUNCTION(mb_convert_encoding)
- {
- zval *input;
- char *arg_new;
- size_t new_len;
- zval *arg_old = NULL;
- size_t size, l, n;
- char *_from_encodings = NULL, *ret, *s_free = NULL;
- zval *hash_entry;
- HashTable *target_hash;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "zs|z", &input, &arg_new, &new_len, &arg_old) == FAILURE) {
- return;
- }
- if (Z_TYPE_P(input) != IS_STRING && Z_TYPE_P(input) != IS_ARRAY) {
- convert_to_string(input);
- }
- if (arg_old) {
- switch (Z_TYPE_P(arg_old)) {
- case IS_ARRAY:
- target_hash = Z_ARRVAL_P(arg_old);
- _from_encodings = NULL;
- ZEND_HASH_FOREACH_VAL(target_hash, hash_entry) {
- zend_string *encoding_str = zval_get_string(hash_entry);
- if ( _from_encodings) {
- l = strlen(_from_encodings);
- n = strlen(ZSTR_VAL(encoding_str));
- _from_encodings = erealloc(_from_encodings, l+n+2);
- memcpy(_from_encodings + l, ",", 1);
- memcpy(_from_encodings + l + 1, ZSTR_VAL(encoding_str), ZSTR_LEN(encoding_str) + 1);
- } else {
- _from_encodings = estrdup(ZSTR_VAL(encoding_str));
- }
- zend_string_release(encoding_str);
- } ZEND_HASH_FOREACH_END();
- if (_from_encodings != NULL && !strlen(_from_encodings)) {
- efree(_from_encodings);
- _from_encodings = NULL;
- }
- s_free = _from_encodings;
- break;
- default:
- convert_to_string(arg_old);
- _from_encodings = Z_STRVAL_P(arg_old);
- break;
- }
- }
- if (Z_TYPE_P(input) == IS_STRING) {
-
- ret = php_mb_convert_encoding(Z_STRVAL_P(input), Z_STRLEN_P(input), arg_new, _from_encodings, &size);
- if (ret != NULL) {
-
- RETVAL_STRINGL(ret, size);
- efree(ret);
- } else {
- RETVAL_FALSE;
- }
- if (s_free) {
- efree(s_free);
- }
- } else {
- HashTable *tmp;
- tmp = php_mb_convert_encoding_recursive(HASH_OF(input), arg_new, _from_encodings);
- RETURN_ARR(tmp);
- }
- return;
- }
- static char *mbstring_convert_case(
- int case_mode, const char *str, size_t str_len, size_t *ret_len,
- const mbfl_encoding *enc) {
- return php_unicode_convert_case(
- case_mode, str, str_len, ret_len, enc,
- MBSTRG(current_filter_illegal_mode), MBSTRG(current_filter_illegal_substchar));
- }
- PHP_FUNCTION(mb_convert_case)
- {
- const char *from_encoding = NULL;
- char *str;
- size_t str_len, from_encoding_len;
- zend_long case_mode = 0;
- char *newstr;
- size_t ret_len;
- const mbfl_encoding *enc;
- RETVAL_FALSE;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "sl|s!", &str, &str_len,
- &case_mode, &from_encoding, &from_encoding_len) == FAILURE) {
- return;
- }
- enc = php_mb_get_encoding(from_encoding);
- if (!enc) {
- return;
- }
- if (case_mode < 0 || case_mode > PHP_UNICODE_CASE_MODE_MAX) {
- php_error_docref(NULL, E_WARNING, "Invalid case mode");
- return;
- }
- newstr = mbstring_convert_case(case_mode, str, str_len, &ret_len, enc);
- if (newstr) {
-
- RETVAL_STRINGL(newstr, ret_len);
- efree(newstr);
- }
- }
- PHP_FUNCTION(mb_strtoupper)
- {
- const char *from_encoding = NULL;
- char *str;
- size_t str_len, from_encoding_len;
- char *newstr;
- size_t ret_len;
- const mbfl_encoding *enc;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|s!", &str, &str_len,
- &from_encoding, &from_encoding_len) == FAILURE) {
- return;
- }
- enc = php_mb_get_encoding(from_encoding);
- if (!enc) {
- RETURN_FALSE;
- }
- newstr = mbstring_convert_case(PHP_UNICODE_CASE_UPPER, str, str_len, &ret_len, enc);
- if (newstr) {
-
- RETVAL_STRINGL(newstr, ret_len);
- efree(newstr);
- return;
- }
- RETURN_FALSE;
- }
- PHP_FUNCTION(mb_strtolower)
- {
- const char *from_encoding = NULL;
- char *str;
- size_t str_len, from_encoding_len;
- char *newstr;
- size_t ret_len;
- const mbfl_encoding *enc;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|s!", &str, &str_len,
- &from_encoding, &from_encoding_len) == FAILURE) {
- return;
- }
- enc = php_mb_get_encoding(from_encoding);
- if (!enc) {
- RETURN_FALSE;
- }
- newstr = mbstring_convert_case(PHP_UNICODE_CASE_LOWER, str, str_len, &ret_len, enc);
- if (newstr) {
-
- RETVAL_STRINGL(newstr, ret_len);
- efree(newstr);
- return;
- }
- RETURN_FALSE;
- }
- PHP_FUNCTION(mb_detect_encoding)
- {
- char *str;
- size_t str_len;
- zend_bool strict=0;
- zval *encoding_list = NULL;
- mbfl_string string;
- const mbfl_encoding *ret;
- const mbfl_encoding **elist, **list;
- size_t size;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|z!b", &str, &str_len, &encoding_list, &strict) == FAILURE) {
- return;
- }
-
- list = NULL;
- size = 0;
- if (encoding_list) {
- switch (Z_TYPE_P(encoding_list)) {
- case IS_ARRAY:
- if (FAILURE == php_mb_parse_encoding_array(encoding_list, &list, &size, 0)) {
- if (list) {
- efree(list);
- list = NULL;
- size = 0;
- }
- }
- break;
- default:
- convert_to_string(encoding_list);
- if (FAILURE == php_mb_parse_encoding_list(Z_STRVAL_P(encoding_list), Z_STRLEN_P(encoding_list), &list, &size, 0)) {
- if (list) {
- efree(list);
- list = NULL;
- size = 0;
- }
- }
- break;
- }
- if (size == 0) {
- php_error_docref(NULL, E_WARNING, "Illegal argument");
- }
- }
- if (ZEND_NUM_ARGS() < 3) {
- strict = MBSTRG(strict_detection);
- }
- if (size > 0 && list != NULL) {
- elist = list;
- } else {
- elist = MBSTRG(current_detect_order_list);
- size = MBSTRG(current_detect_order_list_size);
- }
- mbfl_string_init(&string);
- string.no_language = MBSTRG(language);
- string.val = (unsigned char *)str;
- string.len = str_len;
- ret = mbfl_identify_encoding(&string, elist, size, strict);
- if (list != NULL) {
- efree((void *)list);
- }
- if (ret == NULL) {
- RETURN_FALSE;
- }
- RETVAL_STRING((char *)ret->name);
- }
- PHP_FUNCTION(mb_list_encodings)
- {
- const mbfl_encoding **encodings;
- const mbfl_encoding *encoding;
- int i;
- if (zend_parse_parameters_none() == FAILURE) {
- return;
- }
- array_init(return_value);
- i = 0;
- encodings = mbfl_get_supported_encodings();
- while ((encoding = encodings[i++]) != NULL) {
- add_next_index_string(return_value, (char *) encoding->name);
- }
- }
- PHP_FUNCTION(mb_encoding_aliases)
- {
- const mbfl_encoding *encoding;
- char *name = NULL;
- size_t name_len;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &name, &name_len) == FAILURE) {
- return;
- }
- encoding = mbfl_name2encoding(name);
- if (!encoding) {
- php_error_docref(NULL, E_WARNING, "Unknown encoding \"%s\"", name);
- RETURN_FALSE;
- }
- array_init(return_value);
- if (encoding->aliases != NULL) {
- const char **alias;
- for (alias = *encoding->aliases; *alias; ++alias) {
- add_next_index_string(return_value, (char *)*alias);
- }
- }
- }
- PHP_FUNCTION(mb_encode_mimeheader)
- {
- const mbfl_encoding *charset, *transenc;
- mbfl_string string, result, *ret;
- char *charset_name = NULL;
- size_t charset_name_len;
- char *trans_enc_name = NULL;
- size_t trans_enc_name_len;
- char *linefeed = "\r\n";
- size_t linefeed_len;
- zend_long indent = 0;
- mbfl_string_init(&string);
- string.no_language = MBSTRG(language);
- string.encoding = MBSTRG(current_internal_encoding);
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|sssl", (char **)&string.val, &string.len, &charset_name, &charset_name_len, &trans_enc_name, &trans_enc_name_len, &linefeed, &linefeed_len, &indent) == FAILURE) {
- return;
- }
- charset = &mbfl_encoding_pass;
- transenc = &mbfl_encoding_base64;
- if (charset_name != NULL) {
- charset = mbfl_name2encoding(charset_name);
- if (!charset) {
- php_error_docref(NULL, E_WARNING, "Unknown encoding \"%s\"", charset_name);
- RETURN_FALSE;
- }
- } else {
- const mbfl_language *lang = mbfl_no2language(MBSTRG(language));
- if (lang != NULL) {
- charset = mbfl_no2encoding(lang->mail_charset);
- transenc = mbfl_no2encoding(lang->mail_header_encoding);
- }
- }
- if (trans_enc_name != NULL) {
- if (*trans_enc_name == 'B' || *trans_enc_name == 'b') {
- transenc = &mbfl_encoding_base64;
- } else if (*trans_enc_name == 'Q' || *trans_enc_name == 'q') {
- transenc = &mbfl_encoding_qprint;
- }
- }
- mbfl_string_init(&result);
- ret = mbfl_mime_header_encode(&string, &result, charset, transenc, linefeed, indent);
- if (ret != NULL) {
-
- RETVAL_STRINGL((char *)ret->val, ret->len);
- efree(ret->val);
- } else {
- RETVAL_FALSE;
- }
- }
- PHP_FUNCTION(mb_decode_mimeheader)
- {
- mbfl_string string, result, *ret;
- mbfl_string_init(&string);
- string.no_language = MBSTRG(language);
- string.encoding = MBSTRG(current_internal_encoding);
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", (char **)&string.val, &string.len) == FAILURE) {
- return;
- }
- mbfl_string_init(&result);
- ret = mbfl_mime_header_decode(&string, &result, MBSTRG(current_internal_encoding));
- if (ret != NULL) {
-
- RETVAL_STRINGL((char *)ret->val, ret->len);
- efree(ret->val);
- } else {
- RETVAL_FALSE;
- }
- }
- PHP_FUNCTION(mb_convert_kana)
- {
- int opt;
- mbfl_string string, result, *ret;
- char *optstr = NULL;
- size_t optstr_len;
- char *encname = NULL;
- size_t encname_len;
- mbfl_string_init(&string);
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|ss", (char **)&string.val, &string.len, &optstr, &optstr_len, &encname, &encname_len) == FAILURE) {
- return;
- }
-
- if (optstr != NULL) {
- char *p = optstr;
- size_t i = 0, n = optstr_len;
- opt = 0;
- while (i < n) {
- i++;
- switch (*p++) {
- case 'A':
- opt |= 0x1;
- break;
- case 'a':
- opt |= 0x10;
- break;
- case 'R':
- opt |= 0x2;
- break;
- case 'r':
- opt |= 0x20;
- break;
- case 'N':
- opt |= 0x4;
- break;
- case 'n':
- opt |= 0x40;
- break;
- case 'S':
- opt |= 0x8;
- break;
- case 's':
- opt |= 0x80;
- break;
- case 'K':
- opt |= 0x100;
- break;
- case 'k':
- opt |= 0x1000;
- break;
- case 'H':
- opt |= 0x200;
- break;
- case 'h':
- opt |= 0x2000;
- break;
- case 'V':
- opt |= 0x800;
- break;
- case 'C':
- opt |= 0x10000;
- break;
- case 'c':
- opt |= 0x20000;
- break;
- case 'M':
- opt |= 0x100000;
- break;
- case 'm':
- opt |= 0x200000;
- break;
- }
- }
- } else {
- opt = 0x900;
- }
-
- string.no_language = MBSTRG(language);
- string.encoding = php_mb_get_encoding(encname);
- if (!string.encoding) {
- RETURN_FALSE;
- }
- ret = mbfl_ja_jp_hantozen(&string, &result, opt);
- if (ret != NULL) {
-
- RETVAL_STRINGL((char *)ret->val, ret->len);
- efree(ret->val);
- } else {
- RETVAL_FALSE;
- }
- }
- static int mb_recursive_encoder_detector_feed(mbfl_encoding_detector *identd, zval *var, int *recursion_error)
- {
- mbfl_string string;
- HashTable *ht;
- zval *entry;
- ZVAL_DEREF(var);
- if (Z_TYPE_P(var) == IS_STRING) {
- string.val = (unsigned char *)Z_STRVAL_P(var);
- string.len = Z_STRLEN_P(var);
- if (mbfl_encoding_detector_feed(identd, &string)) {
- return 1;
- }
- } else if (Z_TYPE_P(var) == IS_ARRAY || Z_TYPE_P(var) == IS_OBJECT) {
- if (Z_REFCOUNTED_P(var)) {
- if (Z_IS_RECURSIVE_P(var)) {
- *recursion_error = 1;
- return 0;
- }
- Z_PROTECT_RECURSION_P(var);
- }
- ht = HASH_OF(var);
- if (ht != NULL) {
- ZEND_HASH_FOREACH_VAL_IND(ht, entry) {
- if (mb_recursive_encoder_detector_feed(identd, entry, recursion_error)) {
- if (Z_REFCOUNTED_P(var)) {
- Z_UNPROTECT_RECURSION_P(var);
- }
- return 1;
- } else if (*recursion_error) {
- if (Z_REFCOUNTED_P(var)) {
- Z_UNPROTECT_RECURSION_P(var);
- }
- return 0;
- }
- } ZEND_HASH_FOREACH_END();
- }
- if (Z_REFCOUNTED_P(var)) {
- Z_UNPROTECT_RECURSION_P(var);
- }
- }
- return 0;
- }
- static int mb_recursive_convert_variable(mbfl_buffer_converter *convd, zval *var)
- {
- mbfl_string string, result, *ret;
- HashTable *ht;
- zval *entry, *orig_var;
- orig_var = var;
- ZVAL_DEREF(var);
- if (Z_TYPE_P(var) == IS_STRING) {
- string.val = (unsigned char *)Z_STRVAL_P(var);
- string.len = Z_STRLEN_P(var);
- ret = mbfl_buffer_converter_feed_result(convd, &string, &result);
- if (ret != NULL) {
- zval_ptr_dtor(orig_var);
-
- ZVAL_STRINGL(orig_var, (char *)ret->val, ret->len);
- efree(ret->val);
- }
- } else if (Z_TYPE_P(var) == IS_ARRAY || Z_TYPE_P(var) == IS_OBJECT) {
- if (Z_TYPE_P(var) == IS_ARRAY) {
- SEPARATE_ARRAY(var);
- }
- if (Z_REFCOUNTED_P(var)) {
- if (Z_IS_RECURSIVE_P(var)) {
- return 1;
- }
- Z_PROTECT_RECURSION_P(var);
- }
- ht = HASH_OF(var);
- if (ht != NULL) {
- ZEND_HASH_FOREACH_VAL_IND(ht, entry) {
- if (mb_recursive_convert_variable(convd, entry)) {
- if (Z_REFCOUNTED_P(var)) {
- Z_UNPROTECT_RECURSION_P(var);
- }
- return 1;
- }
- } ZEND_HASH_FOREACH_END();
- }
- if (Z_REFCOUNTED_P(var)) {
- Z_UNPROTECT_RECURSION_P(var);
- }
- }
- return 0;
- }
- PHP_FUNCTION(mb_convert_variables)
- {
- zval *args, *zfrom_enc;
- mbfl_string string, result;
- const mbfl_encoding *from_encoding, *to_encoding;
- mbfl_encoding_detector *identd;
- mbfl_buffer_converter *convd;
- int n, argc;
- size_t to_enc_len;
- size_t elistsz;
- const mbfl_encoding **elist;
- char *to_enc;
- int recursion_error = 0;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz+", &to_enc, &to_enc_len, &zfrom_enc, &args, &argc) == FAILURE) {
- return;
- }
-
- to_encoding = mbfl_name2encoding(to_enc);
- if (!to_encoding) {
- php_error_docref(NULL, E_WARNING, "Unknown encoding \"%s\"", to_enc);
- RETURN_FALSE;
- }
-
- mbfl_string_init(&string);
- mbfl_string_init(&result);
- from_encoding = MBSTRG(current_internal_encoding);
- string.encoding = from_encoding;
- string.no_language = MBSTRG(language);
-
- elist = NULL;
- elistsz = 0;
- switch (Z_TYPE_P(zfrom_enc)) {
- case IS_ARRAY:
- php_mb_parse_encoding_array(zfrom_enc, &elist, &elistsz, 0);
- break;
- default:
- convert_to_string_ex(zfrom_enc);
- php_mb_parse_encoding_list(Z_STRVAL_P(zfrom_enc), Z_STRLEN_P(zfrom_enc), &elist, &elistsz, 0);
- break;
- }
- if (elistsz == 0) {
- from_encoding = &mbfl_encoding_pass;
- } else if (elistsz == 1) {
- from_encoding = *elist;
- } else {
-
- from_encoding = NULL;
- identd = mbfl_encoding_detector_new(elist, elistsz, MBSTRG(strict_detection));
- if (identd != NULL) {
- n = 0;
- while (n < argc) {
- if (mb_recursive_encoder_detector_feed(identd, &args[n], &recursion_error)) {
- break;
- }
- n++;
- }
- from_encoding = mbfl_encoding_detector_judge(identd);
- mbfl_encoding_detector_delete(identd);
- if (recursion_error) {
- if (elist != NULL) {
- efree((void *)elist);
- }
- php_error_docref(NULL, E_WARNING, "Cannot handle recursive references");
- RETURN_FALSE;
- }
- }
- if (!from_encoding) {
- php_error_docref(NULL, E_WARNING, "Unable to detect encoding");
- from_encoding = &mbfl_encoding_pass;
- }
- }
- if (elist != NULL) {
- efree((void *)elist);
- }
-
- convd = NULL;
- if (from_encoding != &mbfl_encoding_pass) {
- convd = mbfl_buffer_converter_new(from_encoding, to_encoding, 0);
- if (convd == NULL) {
- php_error_docref(NULL, E_WARNING, "Unable to create converter");
- RETURN_FALSE;
- }
- mbfl_buffer_converter_illegal_mode(convd, MBSTRG(current_filter_illegal_mode));
- mbfl_buffer_converter_illegal_substchar(convd, MBSTRG(current_filter_illegal_substchar));
- }
-
- if (convd != NULL) {
- n = 0;
- while (n < argc) {
- zval *zv = &args[n];
- ZVAL_DEREF(zv);
- recursion_error = mb_recursive_convert_variable(convd, zv);
- if (recursion_error) {
- break;
- }
- n++;
- }
- MBSTRG(illegalchars) += mbfl_buffer_illegalchars(convd);
- mbfl_buffer_converter_delete(convd);
- if (recursion_error) {
- php_error_docref(NULL, E_WARNING, "Cannot handle recursive references");
- RETURN_FALSE;
- }
- }
- if (from_encoding) {
- RETURN_STRING(from_encoding->name);
- } else {
- RETURN_FALSE;
- }
- }
- static void
- php_mb_numericentity_exec(INTERNAL_FUNCTION_PARAMETERS, int type)
- {
- char *str, *encoding = NULL;
- size_t str_len, encoding_len;
- zval *zconvmap, *hash_entry;
- HashTable *target_hash;
- int i, *convmap, *mapelm, mapsize=0;
- zend_bool is_hex = 0;
- mbfl_string string, result, *ret;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz|sb", &str, &str_len, &zconvmap, &encoding, &encoding_len, &is_hex) == FAILURE) {
- return;
- }
- mbfl_string_init(&string);
- string.no_language = MBSTRG(language);
- string.encoding = MBSTRG(current_internal_encoding);
- string.val = (unsigned char *)str;
- string.len = str_len;
-
- if (encoding && encoding_len > 0) {
- string.encoding = mbfl_name2encoding(encoding);
- if (!string.encoding) {
- php_error_docref(NULL, E_WARNING, "Unknown encoding \"%s\"", encoding);
- RETURN_FALSE;
- }
- }
- if (type == 0 && is_hex) {
- type = 2;
- }
-
- convmap = NULL;
- if (Z_TYPE_P(zconvmap) == IS_ARRAY) {
- target_hash = Z_ARRVAL_P(zconvmap);
- i = zend_hash_num_elements(target_hash);
- if (i > 0) {
- convmap = (int *)safe_emalloc(i, sizeof(int), 0);
- mapelm = convmap;
- mapsize = 0;
- ZEND_HASH_FOREACH_VAL(target_hash, hash_entry) {
- *mapelm++ = zval_get_long(hash_entry);
- mapsize++;
- } ZEND_HASH_FOREACH_END();
- }
- }
- if (convmap == NULL) {
- RETURN_FALSE;
- }
- mapsize /= 4;
- ret = mbfl_html_numeric_entity(&string, &result, convmap, mapsize, type);
- if (ret != NULL) {
-
- RETVAL_STRINGL((char *)ret->val, ret->len);
- efree(ret->val);
- } else {
- RETVAL_FALSE;
- }
- efree((void *)convmap);
- }
- PHP_FUNCTION(mb_encode_numericentity)
- {
- php_mb_numericentity_exec(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
- }
- PHP_FUNCTION(mb_decode_numericentity)
- {
- php_mb_numericentity_exec(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);
- }
- #define SKIP_LONG_HEADER_SEP_MBSTRING(str, pos) \
- if (str[pos] == '\r' && str[pos + 1] == '\n' && (str[pos + 2] == ' ' || str[pos + 2] == '\t')) { \
- pos += 2; \
- while (str[pos + 1] == ' ' || str[pos + 1] == '\t') { \
- pos++; \
- } \
- continue; \
- }
- #define MAIL_ASCIIZ_CHECK_MBSTRING(str, len) \
- pp = str; \
- ee = pp + len; \
- while ((pp = memchr(pp, '\0', (ee - pp)))) { \
- *pp = ' '; \
- } \
- static int _php_mbstr_parse_mail_headers(HashTable *ht, const char *str, size_t str_len)
- {
- const char *ps;
- size_t icnt;
- int state = 0;
- int crlf_state = -1;
- char *token = NULL;
- size_t token_pos = 0;
- zend_string *fld_name, *fld_val;
- ps = str;
- icnt = str_len;
- fld_name = fld_val = NULL;
-
- while (icnt > 0) {
- switch (*ps) {
- case ':':
- if (crlf_state == 1) {
- token_pos++;
- }
- if (state == 0 || state == 1) {
- if(token && token_pos > 0) {
- fld_name = zend_string_init(token, token_pos, 0);
- }
- state = 2;
- } else {
- token_pos++;
- }
- crlf_state = 0;
- break;
- case '\n':
- if (crlf_state == -1) {
- goto out;
- }
- crlf_state = -1;
- break;
- case '\r':
- if (crlf_state == 1) {
- token_pos++;
- } else {
- crlf_state = 1;
- }
- break;
- case ' ': case '\t':
- if (crlf_state == -1) {
- if (state == 3) {
-
- state = 4;
- } else {
-
- state = 5;
- }
- } else {
- if (crlf_state == 1) {
- token_pos++;
- }
- if (state == 1 || state == 3) {
- token_pos++;
- }
- }
- crlf_state = 0;
- break;
- default:
- switch (state) {
- case 0:
- token = (char*)ps;
- token_pos = 0;
- state = 1;
- break;
- case 2:
- if (crlf_state != -1) {
- token = (char*)ps;
- token_pos = 0;
- state = 3;
- break;
- }
-
- case 3:
- if (crlf_state == -1) {
- if(token && token_pos > 0) {
- fld_val = zend_string_init(token, token_pos, 0);
- }
- if (fld_name != NULL && fld_val != NULL) {
- zval val;
-
- php_strtoupper(ZSTR_VAL(fld_name), ZSTR_LEN(fld_name));
- ZVAL_STR(&val, fld_val);
- zend_hash_update(ht, fld_name, &val);
- zend_string_release_ex(fld_name, 0);
- }
- fld_name = fld_val = NULL;
- token = (char*)ps;
- token_pos = 0;
- state = 1;
- }
- break;
- case 4:
- token_pos++;
- state = 3;
- break;
- }
- if (crlf_state == 1) {
- token_pos++;
- }
- token_pos++;
- crlf_state = 0;
- break;
- }
- ps++, icnt--;
- }
- out:
- if (state == 2) {
- token = "";
- token_pos = 0;
- state = 3;
- }
- if (state == 3) {
- if(token && token_pos > 0) {
- fld_val = zend_string_init(token, token_pos, 0);
- }
- if (fld_name != NULL && fld_val != NULL) {
- zval val;
-
- php_strtoupper(ZSTR_VAL(fld_name), ZSTR_LEN(fld_name));
- ZVAL_STR(&val, fld_val);
- zend_hash_update(ht, fld_name, &val);
- zend_string_release_ex(fld_name, 0);
- }
- }
- return state;
- }
- PHP_FUNCTION(mb_send_mail)
- {
- char *to;
- size_t to_len;
- char *message;
- size_t message_len;
- char *subject;
- size_t subject_len;
- zval *headers = NULL;
- zend_string *extra_cmd = NULL;
- zend_string *str_headers = NULL, *tmp_headers;
- size_t n, i;
- char *to_r = NULL;
- char *force_extra_parameters = INI_STR("mail.force_extra_parameters");
- struct {
- int cnt_type:1;
- int cnt_trans_enc:1;
- } suppressed_hdrs = { 0, 0 };
- char *message_buf = NULL, *subject_buf = NULL, *p;
- mbfl_string orig_str, conv_str;
- mbfl_string *pstr;
- enum mbfl_no_encoding;
- const mbfl_encoding *tran_cs,
- *head_enc,
- *body_enc;
- mbfl_memory_device device;
- const mbfl_language *lang;
- int err = 0;
- HashTable ht_headers;
- zval *s;
- extern void mbfl_memory_device_unput(mbfl_memory_device *device);
- char *pp, *ee;
-
- mbfl_memory_device_init(&device, 0, 0);
- mbfl_string_init(&orig_str);
- mbfl_string_init(&conv_str);
-
- tran_cs = &mbfl_encoding_utf8;
- head_enc = &mbfl_encoding_base64;
- body_enc = &mbfl_encoding_base64;
- lang = mbfl_no2language(MBSTRG(language));
- if (lang != NULL) {
- tran_cs = mbfl_no2encoding(lang->mail_charset);
- head_enc = mbfl_no2encoding(lang->mail_header_encoding);
- body_enc = mbfl_no2encoding(lang->mail_body_encoding);
- }
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "sss|zS", &to, &to_len, &subject, &subject_len, &message, &message_len, &headers, &extra_cmd) == FAILURE) {
- return;
- }
-
- MAIL_ASCIIZ_CHECK_MBSTRING(to, to_len);
- MAIL_ASCIIZ_CHECK_MBSTRING(subject, subject_len);
- MAIL_ASCIIZ_CHECK_MBSTRING(message, message_len);
- if (headers) {
- switch(Z_TYPE_P(headers)) {
- case IS_STRING:
- tmp_headers = zend_string_init(Z_STRVAL_P(headers), Z_STRLEN_P(headers), 0);
- MAIL_ASCIIZ_CHECK_MBSTRING(ZSTR_VAL(tmp_headers), ZSTR_LEN(tmp_headers));
- str_headers = php_trim(tmp_headers, NULL, 0, 2);
- zend_string_release_ex(tmp_headers, 0);
- break;
- case IS_ARRAY:
- str_headers = php_mail_build_headers(headers);
- break;
- default:
- php_error_docref(NULL, E_WARNING, "headers parameter must be string or array");
- RETURN_FALSE;
- }
- }
- if (extra_cmd) {
- MAIL_ASCIIZ_CHECK_MBSTRING(ZSTR_VAL(extra_cmd), ZSTR_LEN(extra_cmd));
- }
- zend_hash_init(&ht_headers, 0, NULL, ZVAL_PTR_DTOR, 0);
- if (str_headers != NULL) {
- _php_mbstr_parse_mail_headers(&ht_headers, ZSTR_VAL(str_headers), ZSTR_LEN(str_headers));
- }
- if ((s = zend_hash_str_find(&ht_headers, "CONTENT-TYPE", sizeof("CONTENT-TYPE") - 1))) {
- char *tmp;
- char *param_name;
- char *charset = NULL;
- ZEND_ASSERT(Z_TYPE_P(s) == IS_STRING);
- p = strchr(Z_STRVAL_P(s), ';');
- if (p != NULL) {
-
- do {
- ++p;
- } while (*p == ' ' || *p == '\t');
- if (*p != '\0') {
- if ((param_name = php_strtok_r(p, "= ", &tmp)) != NULL) {
- if (strcasecmp(param_name, "charset") == 0) {
- const mbfl_encoding *_tran_cs = tran_cs;
- charset = php_strtok_r(NULL, "= \"", &tmp);
- if (charset != NULL) {
- _tran_cs = mbfl_name2encoding(charset);
- }
- if (!_tran_cs) {
- php_error_docref(NULL, E_WARNING, "Unsupported charset \"%s\" - will be regarded as ascii", charset);
- _tran_cs = &mbfl_encoding_ascii;
- }
- tran_cs = _tran_cs;
- }
- }
- }
- }
- suppressed_hdrs.cnt_type = 1;
- }
- if ((s = zend_hash_str_find(&ht_headers, "CONTENT-TRANSFER-ENCODING", sizeof("CONTENT-TRANSFER-ENCODING") - 1))) {
- const mbfl_encoding *_body_enc;
- ZEND_ASSERT(Z_TYPE_P(s) == IS_STRING);
- _body_enc = mbfl_name2encoding(Z_STRVAL_P(s));
- switch (_body_enc ? _body_enc->no_encoding : mbfl_no_encoding_invalid) {
- case mbfl_no_encoding_base64:
- case mbfl_no_encoding_7bit:
- case mbfl_no_encoding_8bit:
- body_enc = _body_enc;
- break;
- default:
- php_error_docref(NULL, E_WARNING, "Unsupported transfer encoding \"%s\" - will be regarded as 8bit", Z_STRVAL_P(s));
- body_enc = &mbfl_encoding_8bit;
- break;
- }
- suppressed_hdrs.cnt_trans_enc = 1;
- }
-
- if (to_len > 0) {
- to_r = estrndup(to, to_len);
- for (; to_len; to_len--) {
- if (!isspace((unsigned char) to_r[to_len - 1])) {
- break;
- }
- to_r[to_len - 1] = '\0';
- }
- for (i = 0; to_r[i]; i++) {
- if (iscntrl((unsigned char) to_r[i])) {
-
- SKIP_LONG_HEADER_SEP_MBSTRING(to_r, i);
- to_r[i] = ' ';
- }
- }
- } else {
- to_r = to;
- }
-
- orig_str.no_language = MBSTRG(language);
- orig_str.val = (unsigned char *)subject;
- orig_str.len = subject_len;
- orig_str.encoding = MBSTRG(current_internal_encoding);
- if (orig_str.encoding->no_encoding == mbfl_no_encoding_invalid
- || orig_str.encoding->no_encoding == mbfl_no_encoding_pass) {
- orig_str.encoding = mbfl_identify_encoding(&orig_str, MBSTRG(current_detect_order_list), MBSTRG(current_detect_order_list_size), MBSTRG(strict_detection));
- }
- pstr = mbfl_mime_header_encode(&orig_str, &conv_str, tran_cs, head_enc, "\n", sizeof("Subject: [PHP-jp nnnnnnnn]"));
- if (pstr != NULL) {
- subject_buf = subject = (char *)pstr->val;
- }
-
- orig_str.no_language = MBSTRG(language);
- orig_str.val = (unsigned char *)message;
- orig_str.len = message_len;
- orig_str.encoding = MBSTRG(current_internal_encoding);
- if (orig_str.encoding->no_encoding == mbfl_no_encoding_invalid
- || orig_str.encoding->no_encoding == mbfl_no_encoding_pass) {
- orig_str.encoding = mbfl_identify_encoding(&orig_str, MBSTRG(current_detect_order_list), MBSTRG(current_detect_order_list_size), MBSTRG(strict_detection));
- }
- pstr = NULL;
- {
- mbfl_string tmpstr;
- if (mbfl_convert_encoding(&orig_str, &tmpstr, tran_cs) != NULL) {
- tmpstr.encoding = &mbfl_encoding_8bit;
- pstr = mbfl_convert_encoding(&tmpstr, &conv_str, body_enc);
- efree(tmpstr.val);
- }
- }
- if (pstr != NULL) {
- message_buf = message = (char *)pstr->val;
- }
-
- #define PHP_MBSTR_MAIL_MIME_HEADER1 "MIME-Version: 1.0"
- #define PHP_MBSTR_MAIL_MIME_HEADER2 "Content-Type: text/plain"
- #define PHP_MBSTR_MAIL_MIME_HEADER3 "; charset="
- #define PHP_MBSTR_MAIL_MIME_HEADER4 "Content-Transfer-Encoding: "
- if (str_headers != NULL) {
- p = ZSTR_VAL(str_headers);
- n = ZSTR_LEN(str_headers);
- mbfl_memory_device_strncat(&device, p, n);
- if (n > 0 && p[n - 1] != '\n') {
- mbfl_memory_device_strncat(&device, "\n", 1);
- }
- zend_string_release_ex(str_headers, 0);
- }
- if (!zend_hash_str_exists(&ht_headers, "MIME-VERSION", sizeof("MIME-VERSION") - 1)) {
- mbfl_memory_device_strncat(&device, PHP_MBSTR_MAIL_MIME_HEADER1, sizeof(PHP_MBSTR_MAIL_MIME_HEADER1) - 1);
- mbfl_memory_device_strncat(&device, "\n", 1);
- }
- if (!suppressed_hdrs.cnt_type) {
- mbfl_memory_device_strncat(&device, PHP_MBSTR_MAIL_MIME_HEADER2, sizeof(PHP_MBSTR_MAIL_MIME_HEADER2) - 1);
- p = (char *)mbfl_no2preferred_mime_name(tran_cs->no_encoding);
- if (p != NULL) {
- mbfl_memory_device_strncat(&device, PHP_MBSTR_MAIL_MIME_HEADER3, sizeof(PHP_MBSTR_MAIL_MIME_HEADER3) - 1);
- mbfl_memory_device_strcat(&device, p);
- }
- mbfl_memory_device_strncat(&device, "\n", 1);
- }
- if (!suppressed_hdrs.cnt_trans_enc) {
- mbfl_memory_device_strncat(&device, PHP_MBSTR_MAIL_MIME_HEADER4, sizeof(PHP_MBSTR_MAIL_MIME_HEADER4) - 1);
- p = (char *)mbfl_no2preferred_mime_name(body_enc->no_encoding);
- if (p == NULL) {
- p = "7bit";
- }
- mbfl_memory_device_strcat(&device, p);
- mbfl_memory_device_strncat(&device, "\n", 1);
- }
- mbfl_memory_device_unput(&device);
- mbfl_memory_device_output('\0', &device);
- str_headers = zend_string_init((char *)device.buffer, strlen((char *)device.buffer), 0);
- if (force_extra_parameters) {
- extra_cmd = php_escape_shell_cmd(force_extra_parameters);
- } else if (extra_cmd) {
- extra_cmd = php_escape_shell_cmd(ZSTR_VAL(extra_cmd));
- }
- if (!err && php_mail(to_r, subject, message, ZSTR_VAL(str_headers), extra_cmd ? ZSTR_VAL(extra_cmd) : NULL)) {
- RETVAL_TRUE;
- } else {
- RETVAL_FALSE;
- }
- if (extra_cmd) {
- zend_string_release_ex(extra_cmd, 0);
- }
- if (to_r != to) {
- efree(to_r);
- }
- if (subject_buf) {
- efree((void *)subject_buf);
- }
- if (message_buf) {
- efree((void *)message_buf);
- }
- mbfl_memory_device_clear(&device);
- zend_hash_destroy(&ht_headers);
- if (str_headers) {
- zend_string_release_ex(str_headers, 0);
- }
- }
- #undef SKIP_LONG_HEADER_SEP_MBSTRING
- #undef MAIL_ASCIIZ_CHECK_MBSTRING
- #undef PHP_MBSTR_MAIL_MIME_HEADER1
- #undef PHP_MBSTR_MAIL_MIME_HEADER2
- #undef PHP_MBSTR_MAIL_MIME_HEADER3
- #undef PHP_MBSTR_MAIL_MIME_HEADER4
- PHP_FUNCTION(mb_get_info)
- {
- char *typ = NULL;
- size_t typ_len;
- size_t n;
- char *name;
- const struct mb_overload_def *over_func;
- zval row1, row2;
- const mbfl_language *lang = mbfl_no2language(MBSTRG(language));
- const mbfl_encoding **entry;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "|s", &typ, &typ_len) == FAILURE) {
- return;
- }
- if (!typ || !strcasecmp("all", typ)) {
- array_init(return_value);
- if (MBSTRG(current_internal_encoding)) {
- add_assoc_string(return_value, "internal_encoding", (char *)MBSTRG(current_internal_encoding)->name);
- }
- if (MBSTRG(http_input_identify)) {
- add_assoc_string(return_value, "http_input", (char *)MBSTRG(http_input_identify)->name);
- }
- if (MBSTRG(current_http_output_encoding)) {
- add_assoc_string(return_value, "http_output", (char *)MBSTRG(current_http_output_encoding)->name);
- }
- if ((name = (char *)zend_ini_string("mbstring.http_output_conv_mimetypes", sizeof("mbstring.http_output_conv_mimetypes") - 1, 0)) != NULL) {
- add_assoc_string(return_value, "http_output_conv_mimetypes", name);
- }
- add_assoc_long(return_value, "func_overload", MBSTRG(func_overload));
- if (MBSTRG(func_overload)){
- over_func = &(mb_ovld[0]);
- array_init(&row1);
- while (over_func->type > 0) {
- if ((MBSTRG(func_overload) & over_func->type) == over_func->type ) {
- add_assoc_string(&row1, over_func->orig_func, over_func->ovld_func);
- }
- over_func++;
- }
- add_assoc_zval(return_value, "func_overload_list", &row1);
- } else {
- add_assoc_string(return_value, "func_overload_list", "no overload");
- }
- if (lang != NULL) {
- if ((name = (char *)mbfl_no_encoding2name(lang->mail_charset)) != NULL) {
- add_assoc_string(return_value, "mail_charset", name);
- }
- if ((name = (char *)mbfl_no_encoding2name(lang->mail_header_encoding)) != NULL) {
- add_assoc_string(return_value, "mail_header_encoding", name);
- }
- if ((name = (char *)mbfl_no_encoding2name(lang->mail_body_encoding)) != NULL) {
- add_assoc_string(return_value, "mail_body_encoding", name);
- }
- }
- add_assoc_long(return_value, "illegal_chars", MBSTRG(illegalchars));
- if (MBSTRG(encoding_translation)) {
- add_assoc_string(return_value, "encoding_translation", "On");
- } else {
- add_assoc_string(return_value, "encoding_translation", "Off");
- }
- if ((name = (char *)mbfl_no_language2name(MBSTRG(language))) != NULL) {
- add_assoc_string(return_value, "language", name);
- }
- n = MBSTRG(current_detect_order_list_size);
- entry = MBSTRG(current_detect_order_list);
- if (n > 0) {
- size_t i;
- array_init(&row2);
- for (i = 0; i < n; i++) {
- add_next_index_string(&row2, (*entry)->name);
- entry++;
- }
- add_assoc_zval(return_value, "detect_order", &row2);
- }
- if (MBSTRG(current_filter_illegal_mode) == MBFL_OUTPUTFILTER_ILLEGAL_MODE_NONE) {
- add_assoc_string(return_value, "substitute_character", "none");
- } else if (MBSTRG(current_filter_illegal_mode) == MBFL_OUTPUTFILTER_ILLEGAL_MODE_LONG) {
- add_assoc_string(return_value, "substitute_character", "long");
- } else if (MBSTRG(current_filter_illegal_mode) == MBFL_OUTPUTFILTER_ILLEGAL_MODE_ENTITY) {
- add_assoc_string(return_value, "substitute_character", "entity");
- } else {
- add_assoc_long(return_value, "substitute_character", MBSTRG(current_filter_illegal_substchar));
- }
- if (MBSTRG(strict_detection)) {
- add_assoc_string(return_value, "strict_detection", "On");
- } else {
- add_assoc_string(return_value, "strict_detection", "Off");
- }
- } else if (!strcasecmp("internal_encoding", typ)) {
- if (MBSTRG(current_internal_encoding)) {
- RETVAL_STRING((char *)MBSTRG(current_internal_encoding)->name);
- }
- } else if (!strcasecmp("http_input", typ)) {
- if (MBSTRG(http_input_identify)) {
- RETVAL_STRING((char *)MBSTRG(http_input_identify)->name);
- }
- } else if (!strcasecmp("http_output", typ)) {
- if (MBSTRG(current_http_output_encoding)) {
- RETVAL_STRING((char *)MBSTRG(current_http_output_encoding)->name);
- }
- } else if (!strcasecmp("http_output_conv_mimetypes", typ)) {
- if ((name = (char *)zend_ini_string("mbstring.http_output_conv_mimetypes", sizeof("mbstring.http_output_conv_mimetypes") - 1, 0)) != NULL) {
- RETVAL_STRING(name);
- }
- } else if (!strcasecmp("func_overload", typ)) {
- RETVAL_LONG(MBSTRG(func_overload));
- } else if (!strcasecmp("func_overload_list", typ)) {
- if (MBSTRG(func_overload)){
- over_func = &(mb_ovld[0]);
- array_init(return_value);
- while (over_func->type > 0) {
- if ((MBSTRG(func_overload) & over_func->type) == over_func->type ) {
- add_assoc_string(return_value, over_func->orig_func, over_func->ovld_func);
- }
- over_func++;
- }
- } else {
- RETVAL_STRING("no overload");
- }
- } else if (!strcasecmp("mail_charset", typ)) {
- if (lang != NULL && (name = (char *)mbfl_no_encoding2name(lang->mail_charset)) != NULL) {
- RETVAL_STRING(name);
- }
- } else if (!strcasecmp("mail_header_encoding", typ)) {
- if (lang != NULL && (name = (char *)mbfl_no_encoding2name(lang->mail_header_encoding)) != NULL) {
- RETVAL_STRING(name);
- }
- } else if (!strcasecmp("mail_body_encoding", typ)) {
- if (lang != NULL && (name = (char *)mbfl_no_encoding2name(lang->mail_body_encoding)) != NULL) {
- RETVAL_STRING(name);
- }
- } else if (!strcasecmp("illegal_chars", typ)) {
- RETVAL_LONG(MBSTRG(illegalchars));
- } else if (!strcasecmp("encoding_translation", typ)) {
- if (MBSTRG(encoding_translation)) {
- RETVAL_STRING("On");
- } else {
- RETVAL_STRING("Off");
- }
- } else if (!strcasecmp("language", typ)) {
- if ((name = (char *)mbfl_no_language2name(MBSTRG(language))) != NULL) {
- RETVAL_STRING(name);
- }
- } else if (!strcasecmp("detect_order", typ)) {
- n = MBSTRG(current_detect_order_list_size);
- entry = MBSTRG(current_detect_order_list);
- if (n > 0) {
- size_t i;
- array_init(return_value);
- for (i = 0; i < n; i++) {
- add_next_index_string(return_value, (*entry)->name);
- entry++;
- }
- }
- } else if (!strcasecmp("substitute_character", typ)) {
- if (MBSTRG(current_filter_illegal_mode) == MBFL_OUTPUTFILTER_ILLEGAL_MODE_NONE) {
- RETVAL_STRING("none");
- } else if (MBSTRG(current_filter_illegal_mode) == MBFL_OUTPUTFILTER_ILLEGAL_MODE_LONG) {
- RETVAL_STRING("long");
- } else if (MBSTRG(current_filter_illegal_mode) == MBFL_OUTPUTFILTER_ILLEGAL_MODE_ENTITY) {
- RETVAL_STRING("entity");
- } else {
- RETVAL_LONG(MBSTRG(current_filter_illegal_substchar));
- }
- } else if (!strcasecmp("strict_detection", typ)) {
- if (MBSTRG(strict_detection)) {
- RETVAL_STRING("On");
- } else {
- RETVAL_STRING("Off");
- }
- } else {
- RETURN_FALSE;
- }
- }
- static inline mbfl_buffer_converter *php_mb_init_convd(const mbfl_encoding *encoding)
- {
- mbfl_buffer_converter *convd;
- convd = mbfl_buffer_converter_new(encoding, encoding, 0);
- if (convd == NULL) {
- return NULL;
- }
- mbfl_buffer_converter_illegal_mode(convd, MBFL_OUTPUTFILTER_ILLEGAL_MODE_NONE);
- mbfl_buffer_converter_illegal_substchar(convd, 0);
- return convd;
- }
- static inline int php_mb_check_encoding_impl(mbfl_buffer_converter *convd, const char *input, size_t length, const mbfl_encoding *encoding) {
- mbfl_string string, result, *ret = NULL;
- size_t illegalchars = 0;
-
- mbfl_string_init_set(&string, mbfl_no_language_neutral, encoding);
- mbfl_string_init(&result);
- string.val = (unsigned char *) input;
- string.len = length;
- ret = mbfl_buffer_converter_feed_result(convd, &string, &result);
- illegalchars = mbfl_buffer_illegalchars(convd);
- if (ret != NULL) {
- if (illegalchars == 0 && string.len == result.len && memcmp(string.val, result.val, string.len) == 0) {
- mbfl_string_clear(&result);
- return 1;
- }
- mbfl_string_clear(&result);
- }
- return 0;
- }
- MBSTRING_API int php_mb_check_encoding(const char *input, size_t length, const char *enc)
- {
- const mbfl_encoding *encoding = MBSTRG(current_internal_encoding);
- mbfl_buffer_converter *convd;
- if (input == NULL) {
- return MBSTRG(illegalchars) == 0;
- }
- if (enc != NULL) {
- encoding = mbfl_name2encoding(enc);
- if (!encoding || encoding == &mbfl_encoding_pass) {
- php_error_docref(NULL, E_WARNING, "Invalid encoding \"%s\"", enc);
- return 0;
- }
- }
- convd = php_mb_init_convd(encoding);
- if (convd == NULL) {
- php_error_docref(NULL, E_WARNING, "Unable to create converter");
- return 0;
- }
- if (php_mb_check_encoding_impl(convd, input, length, encoding)) {
- mbfl_buffer_converter_delete(convd);
- return 1;
- }
- mbfl_buffer_converter_delete(convd);
- return 0;
- }
- MBSTRING_API int php_mb_check_encoding_recursive(HashTable *vars, const zend_string *enc)
- {
- const mbfl_encoding *encoding = MBSTRG(current_internal_encoding);
- mbfl_buffer_converter *convd;
- zend_long idx;
- zend_string *key;
- zval *entry;
- int valid = 1;
- (void)(idx);
- if (enc != NULL) {
- encoding = mbfl_name2encoding(ZSTR_VAL(enc));
- if (!encoding || encoding == &mbfl_encoding_pass) {
- php_error_docref(NULL, E_WARNING, "Invalid encoding \"%s\"", ZSTR_VAL(enc));
- return 0;
- }
- }
- convd = php_mb_init_convd(encoding);
- if (convd == NULL) {
- php_error_docref(NULL, E_WARNING, "Unable to create converter");
- return 0;
- }
- if (GC_IS_RECURSIVE(vars)) {
- mbfl_buffer_converter_delete(convd);
- php_error_docref(NULL, E_WARNING, "Cannot not handle circular references");
- return 0;
- }
- GC_TRY_PROTECT_RECURSION(vars);
- ZEND_HASH_FOREACH_KEY_VAL(vars, idx, key, entry) {
- ZVAL_DEREF(entry);
- if (key) {
- if (!php_mb_check_encoding_impl(convd, ZSTR_VAL(key), ZSTR_LEN(key), encoding)) {
- valid = 0;
- break;
- }
- }
- switch (Z_TYPE_P(entry)) {
- case IS_STRING:
- if (!php_mb_check_encoding_impl(convd, Z_STRVAL_P(entry), Z_STRLEN_P(entry), encoding)) {
- valid = 0;
- break;
- }
- break;
- case IS_ARRAY:
- if (!php_mb_check_encoding_recursive(HASH_OF(entry), enc)) {
- valid = 0;
- break;
- }
- break;
- case IS_LONG:
- case IS_DOUBLE:
- case IS_NULL:
- case IS_TRUE:
- case IS_FALSE:
- break;
- default:
-
- valid = 0;
- break;
- }
- } ZEND_HASH_FOREACH_END();
- GC_TRY_UNPROTECT_RECURSION(vars);
- mbfl_buffer_converter_delete(convd);
- return valid;
- }
- PHP_FUNCTION(mb_check_encoding)
- {
- zval *input = NULL;
- zend_string *enc = NULL;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "|zS", &input, &enc) == FAILURE) {
- return;
- }
-
- if (input == NULL) {
- if (MBSTRG(illegalchars) == 0) {
- RETURN_TRUE;
- }
- RETURN_FALSE;
- }
- if (Z_TYPE_P(input) == IS_ARRAY) {
- if (!php_mb_check_encoding_recursive(HASH_OF(input), enc)) {
- RETURN_FALSE;
- }
- } else {
- convert_to_string(input);
- if (!php_mb_check_encoding(Z_STRVAL_P(input), Z_STRLEN_P(input), enc ? ZSTR_VAL(enc): NULL)) {
- RETURN_FALSE;
- }
- }
- RETURN_TRUE;
- }
- static inline zend_long php_mb_ord(const char* str, size_t str_len, const char* enc_name)
- {
- const mbfl_encoding *enc;
- enum mbfl_no_encoding no_enc;
- enc = php_mb_get_encoding(enc_name);
- if (!enc) {
- return -1;
- }
- no_enc = enc->no_encoding;
- if (php_mb_is_unsupported_no_encoding(no_enc)) {
- php_error_docref(NULL, E_WARNING, "Unsupported encoding \"%s\"", enc->name);
- return -1;
- }
- if (str_len == 0) {
- php_error_docref(NULL, E_WARNING, "Empty string");
- return -1;
- }
- {
- mbfl_wchar_device dev;
- mbfl_convert_filter *filter;
- zend_long cp;
- mbfl_wchar_device_init(&dev);
- filter = mbfl_convert_filter_new(
- enc, &mbfl_encoding_wchar,
- mbfl_wchar_device_output, 0, &dev);
- if (!filter) {
- php_error_docref(NULL, E_WARNING, "Creation of filter failed");
- return -1;
- }
- mbfl_convert_filter_feed_string(filter, (const unsigned char *) str, str_len);
- mbfl_convert_filter_flush(filter);
- if (dev.pos < 1 || filter->num_illegalchar || dev.buffer[0] >= MBFL_WCSGROUP_UCS4MAX) {
- mbfl_convert_filter_delete(filter);
- mbfl_wchar_device_clear(&dev);
- return -1;
- }
- cp = dev.buffer[0];
- mbfl_convert_filter_delete(filter);
- mbfl_wchar_device_clear(&dev);
- return cp;
- }
- }
- PHP_FUNCTION(mb_ord)
- {
- char* str;
- size_t str_len;
- char* enc = NULL;
- size_t enc_len;
- zend_long cp;
- ZEND_PARSE_PARAMETERS_START(1, 2)
- Z_PARAM_STRING(str, str_len)
- Z_PARAM_OPTIONAL
- Z_PARAM_STRING(enc, enc_len)
- ZEND_PARSE_PARAMETERS_END();
- cp = php_mb_ord(str, str_len, enc);
- if (0 > cp) {
- RETURN_FALSE;
- }
- RETURN_LONG(cp);
- }
- static inline zend_string *php_mb_chr(zend_long cp, const char *enc_name)
- {
- const mbfl_encoding *enc;
- enum mbfl_no_encoding no_enc;
- zend_string *ret;
- char* buf;
- size_t buf_len;
- enc = php_mb_get_encoding(enc_name);
- if (!enc) {
- return NULL;
- }
- no_enc = enc->no_encoding;
- if (php_mb_is_unsupported_no_encoding(no_enc)) {
- php_error_docref(NULL, E_WARNING, "Unsupported encoding \"%s\"", enc->name);
- return NULL;
- }
- if (cp < 0 || cp > 0x10ffff) {
- return NULL;
- }
- if (php_mb_is_no_encoding_utf8(no_enc)) {
- if (cp > 0xd7ff && 0xe000 > cp) {
- return NULL;
- }
- if (cp < 0x80) {
- ret = ZSTR_CHAR(cp);
- } else if (cp < 0x800) {
- ret = zend_string_alloc(2, 0);
- ZSTR_VAL(ret)[0] = 0xc0 | (cp >> 6);
- ZSTR_VAL(ret)[1] = 0x80 | (cp & 0x3f);
- ZSTR_VAL(ret)[2] = 0;
- } else if (cp < 0x10000) {
- ret = zend_string_alloc(3, 0);
- ZSTR_VAL(ret)[0] = 0xe0 | (cp >> 12);
- ZSTR_VAL(ret)[1] = 0x80 | ((cp >> 6) & 0x3f);
- ZSTR_VAL(ret)[2] = 0x80 | (cp & 0x3f);
- ZSTR_VAL(ret)[3] = 0;
- } else {
- ret = zend_string_alloc(4, 0);
- ZSTR_VAL(ret)[0] = 0xf0 | (cp >> 18);
- ZSTR_VAL(ret)[1] = 0x80 | ((cp >> 12) & 0x3f);
- ZSTR_VAL(ret)[2] = 0x80 | ((cp >> 6) & 0x3f);
- ZSTR_VAL(ret)[3] = 0x80 | (cp & 0x3f);
- ZSTR_VAL(ret)[4] = 0;
- }
- return ret;
- }
- buf_len = 4;
- buf = (char *) emalloc(buf_len + 1);
- buf[0] = (cp >> 24) & 0xff;
- buf[1] = (cp >> 16) & 0xff;
- buf[2] = (cp >> 8) & 0xff;
- buf[3] = cp & 0xff;
- buf[4] = 0;
- {
- char *ret_str;
- size_t ret_len;
- long orig_illegalchars = MBSTRG(illegalchars);
- MBSTRG(illegalchars) = 0;
- ret_str = php_mb_convert_encoding_ex(buf, buf_len, enc, &mbfl_encoding_ucs4be, &ret_len);
- if (MBSTRG(illegalchars) != 0) {
- efree(buf);
- efree(ret_str);
- MBSTRG(illegalchars) = orig_illegalchars;
- return NULL;
- }
- ret = zend_string_init(ret_str, ret_len, 0);
- efree(ret_str);
- MBSTRG(illegalchars) = orig_illegalchars;
- }
- efree(buf);
- return ret;
- }
- PHP_FUNCTION(mb_chr)
- {
- zend_long cp;
- char* enc = NULL;
- size_t enc_len;
- zend_string* ret;
- ZEND_PARSE_PARAMETERS_START(1, 2)
- Z_PARAM_LONG(cp)
- Z_PARAM_OPTIONAL
- Z_PARAM_STRING(enc, enc_len)
- ZEND_PARSE_PARAMETERS_END();
- ret = php_mb_chr(cp, enc);
- if (ret == NULL) {
- RETURN_FALSE;
- }
- RETURN_STR(ret);
- }
- static inline char* php_mb_scrub(const char* str, size_t str_len, const mbfl_encoding *enc, size_t *ret_len)
- {
- return php_mb_convert_encoding_ex(str, str_len, enc, enc, ret_len);
- }
- PHP_FUNCTION(mb_scrub)
- {
- const mbfl_encoding *enc;
- char* str;
- size_t str_len;
- char *enc_name = NULL;
- size_t enc_name_len;
- char *ret;
- size_t ret_len;
- ZEND_PARSE_PARAMETERS_START(1, 2)
- Z_PARAM_STRING(str, str_len)
- Z_PARAM_OPTIONAL
- Z_PARAM_STRING(enc_name, enc_name_len)
- ZEND_PARSE_PARAMETERS_END();
- enc = php_mb_get_encoding(enc_name);
- if (!enc) {
- RETURN_FALSE;
- }
- ret = php_mb_scrub(str, str_len, enc, &ret_len);
- if (ret == NULL) {
- RETURN_FALSE;
- }
- RETVAL_STRINGL(ret, ret_len);
- efree(ret);
- }
- static void php_mb_populate_current_detect_order_list(void)
- {
- const mbfl_encoding **entry = 0;
- size_t nentries;
- if (MBSTRG(current_detect_order_list)) {
- return;
- }
- if (MBSTRG(detect_order_list) && MBSTRG(detect_order_list_size)) {
- nentries = MBSTRG(detect_order_list_size);
- entry = (const mbfl_encoding **)safe_emalloc(nentries, sizeof(mbfl_encoding*), 0);
- memcpy(entry, MBSTRG(detect_order_list), sizeof(mbfl_encoding*) * nentries);
- } else {
- const enum mbfl_no_encoding *src = MBSTRG(default_detect_order_list);
- size_t i;
- nentries = MBSTRG(default_detect_order_list_size);
- entry = (const mbfl_encoding **)safe_emalloc(nentries, sizeof(mbfl_encoding*), 0);
- for (i = 0; i < nentries; i++) {
- entry[i] = mbfl_no2encoding(src[i]);
- }
- }
- MBSTRG(current_detect_order_list) = entry;
- MBSTRG(current_detect_order_list_size) = nentries;
- }
- static int php_mb_encoding_translation(void)
- {
- return MBSTRG(encoding_translation);
- }
- MBSTRING_API size_t php_mb_mbchar_bytes_ex(const char *s, const mbfl_encoding *enc)
- {
- if (enc != NULL) {
- if (enc->flag & MBFL_ENCTYPE_MBCS) {
- if (enc->mblen_table != NULL) {
- if (s != NULL) return enc->mblen_table[*(unsigned char *)s];
- }
- } else if (enc->flag & (MBFL_ENCTYPE_WCS2BE | MBFL_ENCTYPE_WCS2LE)) {
- return 2;
- } else if (enc->flag & (MBFL_ENCTYPE_WCS4BE | MBFL_ENCTYPE_WCS4LE)) {
- return 4;
- }
- }
- return 1;
- }
- MBSTRING_API size_t php_mb_mbchar_bytes(const char *s)
- {
- return php_mb_mbchar_bytes_ex(s, MBSTRG(internal_encoding));
- }
- MBSTRING_API char *php_mb_safe_strrchr_ex(const char *s, unsigned int c, size_t nbytes, const mbfl_encoding *enc)
- {
- register const char *p = s;
- char *last=NULL;
- if (nbytes == (size_t)-1) {
- size_t nb = 0;
- while (*p != '\0') {
- if (nb == 0) {
- if ((unsigned char)*p == (unsigned char)c) {
- last = (char *)p;
- }
- nb = php_mb_mbchar_bytes_ex(p, enc);
- if (nb == 0) {
- return NULL;
- }
- }
- --nb;
- ++p;
- }
- } else {
- register size_t bcnt = nbytes;
- register size_t nbytes_char;
- while (bcnt > 0) {
- if ((unsigned char)*p == (unsigned char)c) {
- last = (char *)p;
- }
- nbytes_char = php_mb_mbchar_bytes_ex(p, enc);
- if (bcnt < nbytes_char) {
- return NULL;
- }
- p += nbytes_char;
- bcnt -= nbytes_char;
- }
- }
- return last;
- }
- MBSTRING_API char *php_mb_safe_strrchr(const char *s, unsigned int c, size_t nbytes)
- {
- return php_mb_safe_strrchr_ex(s, c, nbytes, MBSTRG(internal_encoding));
- }
- MBSTRING_API size_t php_mb_stripos(int mode, const char *old_haystack, size_t old_haystack_len, const char *old_needle, size_t old_needle_len, zend_long offset, const char *from_encoding)
- {
- size_t n = (size_t) -1;
- mbfl_string haystack, needle;
- const mbfl_encoding *enc;
- enc = php_mb_get_encoding(from_encoding);
- if (!enc) {
- return (size_t) -1;
- }
- mbfl_string_init(&haystack);
- mbfl_string_init(&needle);
- haystack.no_language = MBSTRG(language);
- haystack.encoding = enc;
- needle.no_language = MBSTRG(language);
- needle.encoding = enc;
- do {
-
- size_t len = 0;
- haystack.val = (unsigned char *)mbstring_convert_case(PHP_UNICODE_CASE_FOLD_SIMPLE, (char *)old_haystack, old_haystack_len, &len, enc);
- haystack.len = len;
- if (!haystack.val) {
- break;
- }
- if (haystack.len == 0) {
- break;
- }
- needle.val = (unsigned char *)mbstring_convert_case(PHP_UNICODE_CASE_FOLD_SIMPLE, (char *)old_needle, old_needle_len, &len, enc);
- needle.len = len;
- if (!needle.val) {
- break;
- }
- if (needle.len == 0) {
- break;
- }
- if (offset != 0) {
- size_t haystack_char_len = mbfl_strlen(&haystack);
- if (mode) {
- if ((offset > 0 && (size_t)offset > haystack_char_len) ||
- (offset < 0 && (size_t)(-offset) > haystack_char_len)) {
- php_error_docref(NULL, E_WARNING, "Offset is greater than the length of haystack string");
- break;
- }
- } else {
- if (offset < 0) {
- offset += (zend_long)haystack_char_len;
- }
- if (offset < 0 || (size_t)offset > haystack_char_len) {
- php_error_docref(NULL, E_WARNING, "Offset not contained in string");
- break;
- }
- }
- }
- n = mbfl_strpos(&haystack, &needle, offset, mode);
- } while(0);
- if (haystack.val) {
- efree(haystack.val);
- }
- if (needle.val) {
- efree(needle.val);
- }
- return n;
- }
- static void php_mb_gpc_get_detect_order(const zend_encoding ***list, size_t *list_size)
- {
- *list = (const zend_encoding **)MBSTRG(http_input_list);
- *list_size = MBSTRG(http_input_list_size);
- }
- static void php_mb_gpc_set_input_encoding(const zend_encoding *encoding)
- {
- MBSTRG(http_input_identify) = (const mbfl_encoding*)encoding;
- }
- #endif
|