1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758 |
- #define _STDIO_UTILITY
- #define _GNU_SOURCE
- #include <string.h>
- #include <strings.h>
- #include <stdio.h>
- #include <limits.h>
- #include <ctype.h>
- #include <stdlib.h>
- #include <errno.h>
- #include <signal.h>
- #include <assert.h>
- #include <locale.h>
- #ifdef WANT_WIDE
- #include <wchar.h>
- #include <wctype.h>
- #define Wvoid wchar_t
- #define Wchar wchar_t
- #define Wuchar __uwchar_t
- #define Wint wchar_t
- #else
- #define Wvoid void
- #define Wchar char
- typedef unsigned char __string_uchar_t;
- #define Wuchar __string_uchar_t
- #define Wint int
- #endif
- #define _SYS_NERR 125
- #if defined(__mips__) || defined(__sparc__)
- #undef _SYS_NERR
- #define _SYS_NERR 126
- #endif
- #define _SYS_ERRMSG_MAXLEN 50
- extern const char _string_syserrmsgs[];
- #define _SYS_NSIG 32
- #define _SYS_SIGMSG_MAXLEN 25
- extern const char _string_syssigmsgs[];
- #if _SYS_ERRMSG_MAXLEN < __UIM_BUFLEN_INT + 14
- #define _STRERROR_BUFSIZE (__UIM_BUFLEN_INT + 14)
- #else
- #define _STRERROR_BUFSIZE _SYS_ERRMSG_MAXLEN
- #endif
- #if _SYS_SIGMSG_MAXLEN < __UIM_BUFLEN_INT + 14
- #define _STRSIGNAL_BUFSIZE (__UIM_BUFLEN_INT + 14)
- #else
- #define _STRSIGNAL_BUFSIZE _SYS_SIGMSG_MAXLEN
- #endif
- #ifdef L__string_syserrmsgs
- const char _string_syserrmsgs[] = {
- "Success\0"
- "Operation not permitted\0"
- "No such file or directory\0"
- "No such process\0"
- "Interrupted system call\0"
- "Input/output error\0"
- "No such device or address\0"
- "Argument list too long\0"
- "Exec format error\0"
- "Bad file descriptor\0"
- "No child processes\0"
- "Resource temporarily unavailable\0"
- "Cannot allocate memory\0"
- "Permission denied\0"
- "Bad address\0"
- "Block device required\0"
- "Device or resource busy\0"
- "File exists\0"
- "Invalid cross-device link\0"
- "No such device\0"
- "Not a directory\0"
- "Is a directory\0"
- "Invalid argument\0"
- "Too many open files in system\0"
- "Too many open files\0"
- "Inappropriate ioctl for device\0"
- "Text file busy\0"
- "File too large\0"
- "No space left on device\0"
- "Illegal seek\0"
- "Read-only file system\0"
- "Too many links\0"
- "Broken pipe\0"
- "Numerical argument out of domain\0"
- "Numerical result out of range\0"
- "Resource deadlock avoided\0"
- "File name too long\0"
- "No locks available\0"
- "Function not implemented\0"
- "Directory not empty\0"
- "Too many levels of symbolic links\0"
- "\0"
- "No message of desired type\0"
- "Identifier removed\0"
- "Channel number out of range\0"
- "Level 2 not synchronized\0"
- "Level 3 halted\0"
- "Level 3 reset\0"
- "Link number out of range\0"
- "Protocol driver not attached\0"
- "No CSI structure available\0"
- "Level 2 halted\0"
- "Invalid exchange\0"
- "Invalid request descriptor\0"
- "Exchange full\0"
- "No anode\0"
- "Invalid request code\0"
- "Invalid slot\0"
- "\0"
- "Bad font file format\0"
- "Device not a stream\0"
- "No data available\0"
- "Timer expired\0"
- "Out of streams resources\0"
- "Machine is not on the network\0"
- "Package not installed\0"
- "Object is remote\0"
- "Link has been severed\0"
- "Advertise error\0"
- "Srmount error\0"
- "Communication error on send\0"
- "Protocol error\0"
- "Multihop attempted\0"
- "RFS specific error\0"
- "Bad message\0"
- "Value too large for defined data type\0"
- "Name not unique on network\0"
- "File descriptor in bad state\0"
- "Remote address changed\0"
- "Can not access a needed shared library\0"
- "Accessing a corrupted shared library\0"
- ".lib section in a.out corrupted\0"
- "Attempting to link in too many shared libraries\0"
- "Cannot exec a shared library directly\0"
- "Invalid or incomplete multibyte or wide character\0"
- "Interrupted system call should be restarted\0"
- "Streams pipe error\0"
- "Too many users\0"
- "Socket operation on non-socket\0"
- "Destination address required\0"
- "Message too long\0"
- "Protocol wrong type for socket\0"
- "Protocol not available\0"
- "Protocol not supported\0"
- "Socket type not supported\0"
- "Operation not supported\0"
- "Protocol family not supported\0"
- "Address family not supported by protocol\0"
- "Address already in use\0"
- "Cannot assign requested address\0"
- "Network is down\0"
- "Network is unreachable\0"
- "Network dropped connection on reset\0"
- "Software caused connection abort\0"
- "Connection reset by peer\0"
- "No buffer space available\0"
- "Transport endpoint is already connected\0"
- "Transport endpoint is not connected\0"
- "Cannot send after transport endpoint shutdown\0"
- "Too many references: cannot splice\0"
- "Connection timed out\0"
- "Connection refused\0"
- "Host is down\0"
- "No route to host\0"
- "Operation already in progress\0"
- "Operation now in progress\0"
- "Stale NFS file handle\0"
- "Structure needs cleaning\0"
- "Not a XENIX named type file\0"
- "No XENIX semaphores available\0"
- "Is a named type file\0"
- "Remote I/O error\0"
- "Disk quota exceeded\0"
- "No medium found\0"
- "Wrong medium type"
- #if defined(__mips__) || defined(__sparc__)
- "\0"
- "File locking deadlock error"
- #endif
-
- };
- #endif
- #ifdef L_sys_errlist
- link_warning(_sys_errlist, "sys_nerr and sys_errlist are obsolete and uClibc support for them (in at least some configurations) will probably be unavailable in the near future.")
- const char *const sys_errlist[] = {
- [0] = _string_syserrmsgs + 0,
- [EPERM] = _string_syserrmsgs + 8,
- [ENOENT] = _string_syserrmsgs + 32,
- [ESRCH] = _string_syserrmsgs + 58,
- [EINTR] = _string_syserrmsgs + 74,
- [EIO] = _string_syserrmsgs + 98,
- [ENXIO] = _string_syserrmsgs + 117,
- [E2BIG] = _string_syserrmsgs + 143,
- [ENOEXEC] = _string_syserrmsgs + 166,
- [EBADF] = _string_syserrmsgs + 184,
- [ECHILD] = _string_syserrmsgs + 204,
- [EAGAIN] = _string_syserrmsgs + 223,
- [ENOMEM] = _string_syserrmsgs + 256,
- [EACCES] = _string_syserrmsgs + 279,
- [EFAULT] = _string_syserrmsgs + 297,
- [ENOTBLK] = _string_syserrmsgs + 309,
- [EBUSY] = _string_syserrmsgs + 331,
- [EEXIST] = _string_syserrmsgs + 355,
- [EXDEV] = _string_syserrmsgs + 367,
- [ENODEV] = _string_syserrmsgs + 393,
- [ENOTDIR] = _string_syserrmsgs + 408,
- [EISDIR] = _string_syserrmsgs + 424,
- [EINVAL] = _string_syserrmsgs + 439,
- [ENFILE] = _string_syserrmsgs + 456,
- [EMFILE] = _string_syserrmsgs + 486,
- [ENOTTY] = _string_syserrmsgs + 506,
- [ETXTBSY] = _string_syserrmsgs + 537,
- [EFBIG] = _string_syserrmsgs + 552,
- [ENOSPC] = _string_syserrmsgs + 567,
- [ESPIPE] = _string_syserrmsgs + 591,
- [EROFS] = _string_syserrmsgs + 604,
- [EMLINK] = _string_syserrmsgs + 626,
- [EPIPE] = _string_syserrmsgs + 641,
- [EDOM] = _string_syserrmsgs + 653,
- [ERANGE] = _string_syserrmsgs + 686,
- [EDEADLK] = _string_syserrmsgs + 716,
- [ENAMETOOLONG] = _string_syserrmsgs + 742,
- [ENOLCK] = _string_syserrmsgs + 761,
- [ENOSYS] = _string_syserrmsgs + 780,
- [ENOTEMPTY] = _string_syserrmsgs + 805,
- [ELOOP] = _string_syserrmsgs + 825,
-
- [ENOMSG] = _string_syserrmsgs + 860,
- [EIDRM] = _string_syserrmsgs + 887,
- [ECHRNG] = _string_syserrmsgs + 906,
- [EL2NSYNC] = _string_syserrmsgs + 934,
- [EL3HLT] = _string_syserrmsgs + 959,
- [EL3RST] = _string_syserrmsgs + 974,
- [ELNRNG] = _string_syserrmsgs + 988,
- [EUNATCH] = _string_syserrmsgs + 1013,
- [ENOCSI] = _string_syserrmsgs + 1042,
- [EL2HLT] = _string_syserrmsgs + 1069,
- [EBADE] = _string_syserrmsgs + 1084,
- [EBADR] = _string_syserrmsgs + 1101,
- [EXFULL] = _string_syserrmsgs + 1128,
- [ENOANO] = _string_syserrmsgs + 1142,
- [EBADRQC] = _string_syserrmsgs + 1151,
- [EBADSLT] = _string_syserrmsgs + 1172,
-
- [EBFONT] = _string_syserrmsgs + 1186,
- [ENOSTR] = _string_syserrmsgs + 1207,
- [ENODATA] = _string_syserrmsgs + 1227,
- [ETIME] = _string_syserrmsgs + 1245,
- [ENOSR] = _string_syserrmsgs + 1259,
- [ENONET] = _string_syserrmsgs + 1284,
- [ENOPKG] = _string_syserrmsgs + 1314,
- [EREMOTE] = _string_syserrmsgs + 1336,
- [ENOLINK] = _string_syserrmsgs + 1353,
- [EADV] = _string_syserrmsgs + 1375,
- [ESRMNT] = _string_syserrmsgs + 1391,
- [ECOMM] = _string_syserrmsgs + 1405,
- [EPROTO] = _string_syserrmsgs + 1433,
- [EMULTIHOP] = _string_syserrmsgs + 1448,
- [EDOTDOT] = _string_syserrmsgs + 1467,
- [EBADMSG] = _string_syserrmsgs + 1486,
- [EOVERFLOW] = _string_syserrmsgs + 1498,
- [ENOTUNIQ] = _string_syserrmsgs + 1536,
- [EBADFD] = _string_syserrmsgs + 1563,
- [EREMCHG] = _string_syserrmsgs + 1592,
- [ELIBACC] = _string_syserrmsgs + 1615,
- [ELIBBAD] = _string_syserrmsgs + 1654,
- [ELIBSCN] = _string_syserrmsgs + 1691,
- [ELIBMAX] = _string_syserrmsgs + 1723,
- [ELIBEXEC] = _string_syserrmsgs + 1771,
- [EILSEQ] = _string_syserrmsgs + 1809,
- [ERESTART] = _string_syserrmsgs + 1859,
- [ESTRPIPE] = _string_syserrmsgs + 1903,
- [EUSERS] = _string_syserrmsgs + 1922,
- [ENOTSOCK] = _string_syserrmsgs + 1937,
- [EDESTADDRREQ] = _string_syserrmsgs + 1968,
- [EMSGSIZE] = _string_syserrmsgs + 1997,
- [EPROTOTYPE] = _string_syserrmsgs + 2014,
- [ENOPROTOOPT] = _string_syserrmsgs + 2045,
- [EPROTONOSUPPORT] = _string_syserrmsgs + 2068,
- [ESOCKTNOSUPPORT] = _string_syserrmsgs + 2091,
- [EOPNOTSUPP] = _string_syserrmsgs + 2117,
- [EPFNOSUPPORT] = _string_syserrmsgs + 2141,
- [EAFNOSUPPORT] = _string_syserrmsgs + 2171,
- [EADDRINUSE] = _string_syserrmsgs + 2212,
- [EADDRNOTAVAIL] = _string_syserrmsgs + 2235,
- [ENETDOWN] = _string_syserrmsgs + 2267,
- [ENETUNREACH] = _string_syserrmsgs + 2283,
- [ENETRESET] = _string_syserrmsgs + 2306,
- [ECONNABORTED] = _string_syserrmsgs + 2342,
- [ECONNRESET] = _string_syserrmsgs + 2375,
- [ENOBUFS] = _string_syserrmsgs + 2400,
- [EISCONN] = _string_syserrmsgs + 2426,
- [ENOTCONN] = _string_syserrmsgs + 2466,
- [ESHUTDOWN] = _string_syserrmsgs + 2502,
- [ETOOMANYREFS] = _string_syserrmsgs + 2548,
- [ETIMEDOUT] = _string_syserrmsgs + 2583,
- [ECONNREFUSED] = _string_syserrmsgs + 2604,
- [EHOSTDOWN] = _string_syserrmsgs + 2623,
- [EHOSTUNREACH] = _string_syserrmsgs + 2636,
- [EALREADY] = _string_syserrmsgs + 2653,
- [EINPROGRESS] = _string_syserrmsgs + 2683,
- [ESTALE] = _string_syserrmsgs + 2709,
- [EUCLEAN] = _string_syserrmsgs + 2731,
- [ENOTNAM] = _string_syserrmsgs + 2756,
- [ENAVAIL] = _string_syserrmsgs + 2784,
- [EISNAM] = _string_syserrmsgs + 2814,
- [EREMOTEIO] = _string_syserrmsgs + 2835,
- [EDQUOT] = _string_syserrmsgs + 2852,
- [ENOMEDIUM] = _string_syserrmsgs + 2872,
- [EMEDIUMTYPE] = _string_syserrmsgs + 2888,
- #if EDEADLOCK != EDEADLK
- [EDEADLOCK] = _string_syserrmsgs + 2906,
- #endif
- #if EWOULDBLOCK != EAGAIN
- #error EWOULDBLOCK does not equal EAGAIN
- #endif
-
-
- #ifdef ECANCELED
- #endif
- #ifdef EINIT
- #endif
- #ifdef EREMDEV
- #endif
-
- #ifdef EPROCLIM
- #endif
- #ifdef ERREMOTE
- #endif
- };
- int sys_nerr = sizeof(sys_errlist)/sizeof(sys_errlist[0]);
- #endif
- #ifdef L_wmemcpy
- #define L_memcpy
- #define Wmemcpy wmemcpy
- #else
- #define Wmemcpy memcpy
- #endif
- #ifdef L_memcpy
- Wvoid *Wmemcpy(Wvoid * __restrict s1, const Wvoid * __restrict s2, size_t n)
- {
- register Wchar *r1 = s1;
- register const Wchar *r2 = s2;
- #ifdef __BCC__
- while (n--) {
- *r1++ = *r2++;
- }
- #else
- while (n) {
- *r1++ = *r2++;
- --n;
- }
- #endif
- return s1;
- }
- #endif
- #ifdef L_wmemmove
- #define L_memmove
- #define Wmemmove wmemmove
- #else
- #define Wmemmove memmove
- #endif
- #ifdef L_memmove
- Wvoid *Wmemmove(Wvoid *s1, const Wvoid *s2, size_t n)
- {
- #ifdef __BCC__
- register Wchar *s = (Wchar *) s1;
- register const Wchar *p = (const Wchar *) s2;
- if (p >= s) {
- while (n--) {
- *s++ = *p++;
- }
- } else {
- s += n;
- p += n;
- while (n--) {
- *--s = *--p;
- }
- }
- return s1;
- #else
- register Wchar *s = (Wchar *) s1;
- register const Wchar *p = (const Wchar *) s2;
- if (p >= s) {
- while (n) {
- *s++ = *p++;
- --n;
- }
- } else {
- while (n) {
- --n;
- s[n] = p[n];
- }
- }
- return s1;
- #endif
- }
- #endif
- #ifdef L_wcscpy
- #define L_strcpy
- #define Wstrcpy wcscpy
- #else
- #define Wstrcpy strcpy
- #endif
- #ifdef L_strcpy
- Wchar *Wstrcpy(Wchar * __restrict s1, const Wchar * __restrict s2)
- {
- register Wchar *s = s1;
- #ifdef __BCC__
- do {
- *s = *s2++;
- } while (*s++ != 0);
- #else
- while ( (*s++ = *s2++) != 0 );
- #endif
- return s1;
- }
- #endif
- #ifdef L_wcsncpy
- #define L_strncpy
- #define Wstrncpy wcsncpy
- #else
- #define Wstrncpy strncpy
- #endif
- #ifdef L_strncpy
- Wchar *Wstrncpy(Wchar * __restrict s1, register const Wchar * __restrict s2,
- size_t n)
- {
- register Wchar *s = s1;
- #ifdef __BCC__
- while (n--) {
- if ((*s = *s2) != 0) s2++;
- ++s;
- }
- #else
- while (n) {
- if ((*s = *s2) != 0) s2++;
- ++s;
- --n;
- }
- #endif
-
- return s1;
- }
- #endif
- #ifdef L_wcscat
- #define L_strcat
- #define Wstrcat wcscat
- #else
- #define Wstrcat strcat
- #endif
- #ifdef L_strcat
- Wchar *Wstrcat(Wchar * __restrict s1, register const Wchar * __restrict s2)
- {
- register Wchar *s = s1;
- while (*s++);
- --s;
- while ((*s++ = *s2++) != 0);
- return s1;
- }
- #endif
- #ifdef L_wcsncat
- #define L_strncat
- #define Wstrncat wcsncat
- #else
- #define Wstrncat strncat
- #endif
- #ifdef L_strncat
- Wchar *Wstrncat(Wchar * __restrict s1, register const Wchar * __restrict s2,
- size_t n)
- {
- register Wchar *s = s1;
- while (*s++);
- --s;
- #if __BCC__
- while (n-- && ((*s = *s2++) != 0)) ++s;
- #else
- while (n && ((*s = *s2++) != 0)) {
- --n;
- ++s;
- }
- #endif
- *s = 0;
- return s1;
- }
- #endif
- #ifdef L_wmemcmp
- #define L_memcmp
- #define Wmemcmp wmemcmp
- #else
- #define Wmemcmp memcmp
- #endif
- #ifdef L_memcmp
- #ifndef L_wmemcmp
- weak_alias(memcmp,bcmp);
- #endif
- int Wmemcmp(const Wvoid *s1, const Wvoid *s2, size_t n)
- {
- register const Wuchar *r1 = (const Wuchar *) s1;
- register const Wuchar *r2 = (const Wuchar *) s2;
- #ifdef WANT_WIDE
- while (n && (*r1 == *r2)) {
- ++r1;
- ++r2;
- --n;
- }
- return (n == 0) ? 0 : ((*r1 < *r2) ? -1 : 1);
- #else
- int r = 0;
- while (n-- && ((r = ((int)(*r1++)) - *r2++) == 0));
- return r;
- #endif
- }
- #endif
- #ifdef L_wcscmp
- #define L_strcmp
- #define Wstrcmp wcscmp
- #else
- #define Wstrcmp strcmp
- #endif
- #ifdef L_strcmp
- #ifdef __LOCALE_C_ONLY
- #ifdef L_wcscmp
- link_warning(wcscmp,"the 'wcscmp' function supports only C|POSIX locales")
- weak_alias(wcscmp,wcscoll);
- #else
- link_warning(strcmp,"the 'strcmp' function supports only C|POSIX locales")
- weak_alias(strcmp,strcoll);
- #endif
- #endif
- int Wstrcmp(register const Wchar *s1, register const Wchar *s2)
- {
- #ifdef WANT_WIDE
- while (*((Wuchar *)s1) == *((Wuchar *)s2)) {
- if (!*s1++) {
- return 0;
- }
- ++s2;
- }
- return (*((Wuchar *)s1) < *((Wuchar *)s2)) ? -1 : 1;
- #else
- int r;
- while (((r = ((int)(*((Wuchar *)s1))) - *((Wuchar *)s2++))
- == 0) && *s1++);
-
- return r;
- #endif
- }
- #endif
- #ifdef L_wcsncmp
- #define L_strncmp
- #define Wstrncmp wcsncmp
- #else
- #define Wstrncmp strncmp
- #endif
- #ifdef L_strncmp
- int Wstrncmp(register const Wchar *s1, register const Wchar *s2, size_t n)
- {
- #ifdef WANT_WIDE
- while (n && (*((Wuchar *)s1) == *((Wuchar *)s2))) {
- if (!*s1++) {
- return 0;
- }
- ++s2;
- --n;
- }
- return (n == 0) ? 0 : ((*((Wuchar *)s1) < *((Wuchar *)s2)) ? -1 : 1);
- #else
- int r = 0;
- while (n--
- && ((r = ((int)(*((unsigned char *)s1))) - *((unsigned char *)s2++))
- == 0)
- && *s1++);
- return r;
- #endif
- }
- #endif
- #ifdef L_wmemchr
- #define L_memchr
- #define Wmemchr wmemchr
- #else
- #define Wmemchr memchr
- #endif
- #ifdef L_memchr
- Wvoid *Wmemchr(const Wvoid *s, Wint c, size_t n)
- {
- register const Wuchar *r = (const Wuchar *) s;
- #ifdef __BCC__
-
- register const char *np = (const char *) n;
- #else
- #define np n
- #endif
- while (np) {
- if (*r == ((Wuchar)c)) {
- return (Wvoid *) r;
- }
- ++r;
- --np;
- }
- return NULL;
- }
- #undef np
- #endif
- #ifdef L_wcschr
- #define L_strchr
- #define Wstrchr wcschr
- #else
- #define Wstrchr strchr
- #endif
- #ifdef L_strchr
- #ifndef L_wcschr
- weak_alias(strchr,index);
- #endif
- Wchar *Wstrchr(register const Wchar *s, Wint c)
- {
- do {
- if (*s == ((Wchar)c)) {
- return (Wchar *) s;
- }
- } while (*s++);
- return NULL;
- }
- #endif
- #ifdef L_wcscspn
- #define L_strcspn
- #define Wstrcspn wcscspn
- #else
- #define Wstrcspn strcspn
- #endif
- #ifdef L_strcspn
- size_t Wstrcspn(const Wchar *s1, const Wchar *s2)
- {
- register const Wchar *s;
- register const Wchar *p;
- for ( s=s1 ; *s ; s++ ) {
- for ( p=s2 ; *p ; p++ ) {
- if (*p == *s) goto done;
- }
- }
- done:
- return s - s1;
- }
- #endif
- #ifdef L_wcspbrk
- #define L_strpbrk
- #define Wstrpbrk wcspbrk
- #else
- #define Wstrpbrk strpbrk
- #endif
- #ifdef L_strpbrk
- Wchar *Wstrpbrk(const Wchar *s1, const Wchar *s2)
- {
- register const Wchar *s;
- register const Wchar *p;
- for ( s=s1 ; *s ; s++ ) {
- for ( p=s2 ; *p ; p++ ) {
- if (*p == *s) return (Wchar *) s;
- }
- }
- return NULL;
- }
- #endif
- #ifdef L_wcsrchr
- #define L_strrchr
- #define Wstrrchr wcsrchr
- #else
- #define Wstrrchr strrchr
- #endif
- #ifdef L_strrchr
- #ifndef L_wcsrchr
- weak_alias(strrchr,rindex);
- #endif
- Wchar *Wstrrchr(register const Wchar *s, Wint c)
- {
- register const Wchar *p;
- p = NULL;
- do {
- if (*s == (Wchar) c) {
- p = s;
- }
- } while (*s++);
- return (Wchar *) p;
- }
- #endif
- #ifdef L_wcsspn
- #define L_strspn
- #define Wstrspn wcsspn
- #else
- #define Wstrspn strspn
- #endif
- #ifdef L_strspn
- size_t Wstrspn(const Wchar *s1, const Wchar *s2)
- {
- register const Wchar *s = s1;
- register const Wchar *p = s2;
- while (*p) {
- if (*p++ == *s) {
- ++s;
- p = s2;
- }
- }
- return s - s1;
- }
- #endif
- #ifdef L_wcsstr
- #define L_strstr
- #define Wstrstr wcsstr
- #else
- #define Wstrstr strstr
- #endif
- #ifdef L_strstr
- #ifdef L_wcsstr
- weak_alias(wcsstr,wcswcs);
- #endif
- Wchar *Wstrstr(const Wchar *s1, const Wchar *s2)
- {
- register const Wchar *s = s1;
- register const Wchar *p = s2;
- do {
- if (!*p) {
- return (Wchar *) s1;;
- }
- if (*p == *s) {
- ++p;
- ++s;
- } else {
- p = s2;
- if (!*s) {
- return NULL;
- }
- s = ++s1;
- }
- } while (1);
- }
- #endif
- #undef Wstrspn
- #undef Wstrpbrk
- #ifdef L_wcstok
- #define L_strtok_r
- #define Wstrtok_r wcstok
- #define Wstrspn wcsspn
- #define Wstrpbrk wcspbrk
- #else
- #define Wstrtok_r strtok_r
- #define Wstrspn strspn
- #define Wstrpbrk strpbrk
- #endif
- #ifdef L_strtok_r
- Wchar *Wstrtok_r(Wchar * __restrict s1, const Wchar * __restrict s2,
- Wchar ** __restrict next_start)
- {
- register Wchar *s;
- register Wchar *p;
- #if 1
- if (((s = s1) != NULL) || ((s = *next_start) != NULL)) {
- if (*(s += Wstrspn(s, s2))) {
- if ((p = Wstrpbrk(s, s2)) != NULL) {
- *p++ = 0;
- }
- } else {
- p = s = NULL;
- }
- *next_start = p;
- }
- return s;
- #else
- if (!(s = s1)) {
- s = *next_start;
- }
- if (s && *(s += Wstrspn(s, s2))) {
- if (*(p = s + Wstrcspn(s, s2))) {
- *p++ = 0;
- }
- *next_start = p;
- return s;
- }
- return NULL;
- #endif
- }
- #endif
- #ifdef L_strtok
- #define Wstrtok strtok
- #define Wstrtok_r strtok_r
- Wchar *Wstrtok(Wchar * __restrict s1, const Wchar * __restrict s2)
- {
- static Wchar *next_start;
- return Wstrtok_r(s1, s2, &next_start);
- }
- #endif
- #ifdef L_wmemset
- #define L_memset
- #define Wmemset wmemset
- #else
- #define Wmemset memset
- #endif
- #ifdef L_memset
- Wvoid *Wmemset(Wvoid *s, Wint c, size_t n)
- {
- register Wuchar *p = (Wuchar *) s;
- #ifdef __BCC__
-
- register const char *np = (const char *) n;
- #else
- #define np n
- #endif
- while (np) {
- *p++ = (Wuchar) c;
- --np;
- }
- return s;
- }
- #undef np
- #endif
- #ifdef L_wcslen
- #define L_strlen
- #define Wstrlen wcslen
- #else
- #define Wstrlen strlen
- #endif
- #ifdef L_strlen
- size_t Wstrlen(const Wchar *s)
- {
- register const Wchar *p;
- for (p=s ; *p ; p++);
- return p - s;
- }
- #endif
- #ifdef L_ffs
- int ffs(int i)
- {
- #if 1
-
- char n = 1;
- #if UINT_MAX == 0xffffU
-
- #elif UINT_MAX == 0xffffffffU
- if (!(i & 0xffff)) {
- n += 16;
- i >>= 16;
- }
- #else
- #error ffs needs rewriting!
- #endif
- if (!(i & 0xff)) {
- n += 8;
- i >>= 8;
- }
- if (!(i & 0x0f)) {
- n += 4;
- i >>= 4;
- }
- if (!(i & 0x03)) {
- n += 2;
- i >>= 2;
- }
- return (i) ? (n + ((i+1) & 0x01)) : 0;
- #else
-
- int n;
- for (n = 0 ; i ; ++n) {
- i >>= 1;
- }
-
- return n;
- #endif
- }
- #endif
- #ifdef L_wcscasecmp
- #define L_strcasecmp
- #define Wstrcasecmp wcscasecmp
- #else
- #define Wstrcasecmp strcasecmp
- #endif
- #ifdef L_strcasecmp
- int Wstrcasecmp(register const Wchar *s1, register const Wchar *s2)
- {
- #ifdef WANT_WIDE
- while ((*s1 == *s2) || (towlower(*s1) == towlower(*s2))) {
- if (!*s1++) {
- return 0;
- }
- ++s2;
- }
- return (((Wuchar)towlower(*s1)) < ((Wuchar)towlower(*s2))) ? -1 : 1;
-
- #else
- int r = 0;
- while ( ((s1 == s2) ||
- !(r = ((int)( tolower(*((Wuchar *)s1))))
- - tolower(*((Wuchar *)s2))))
- && (++s2, *s1++));
- return r;
- #endif
- }
- #endif
- #ifdef L_wcsncasecmp
- #define L_strncasecmp
- #define Wstrncasecmp wcsncasecmp
- #else
- #define Wstrncasecmp strncasecmp
- #endif
- #ifdef L_strncasecmp
- int Wstrncasecmp(register const Wchar *s1, register const Wchar *s2, size_t n)
- {
- #ifdef WANT_WIDE
- while (n && ((*s1 == *s2) || (towlower(*s1) == towlower(*s2)))) {
- if (!*s1++) {
- return 0;
- }
- ++s2;
- --n;
- }
- return (n == 0)
- ? 0
- : ((((Wuchar)towlower(*s1)) < ((Wuchar)towlower(*s2))) ? -1 : 1);
-
- #else
- int r = 0;
- while ( n
- && ((s1 == s2) ||
- !(r = ((int)( tolower(*((unsigned char *)s1))))
- - tolower(*((unsigned char *)s2))))
- && (--n, ++s2, *s1++));
- return r;
- #endif
- }
- #endif
- #ifdef L_wcsnlen
- #define L_strnlen
- #define Wstrnlen wcsnlen
- #else
- #define Wstrnlen strnlen
- #endif
- #ifdef L_strnlen
- size_t Wstrnlen(const Wchar *s, size_t max)
- {
- register const Wchar *p = s;
- #ifdef __BCC__
-
- register const char *maxp = (const char *) max;
- #else
- #define maxp max
- #endif
- while (maxp && *p) {
- ++p;
- --maxp;
- }
- return p - s;
- }
- #undef maxp
- #endif
- #ifdef L_memccpy
- void *memccpy(void * __restrict s1, const void * __restrict s2, int c, size_t n)
- {
- register char *r1 = s1;
- register const char *r2 = s2;
- while (n-- && (((unsigned char)(*r1++ = *r2++)) != ((unsigned char) c)));
- return (n == (size_t) -1) ? NULL : r1;
- }
- #endif
- #undef Wstrlen
- #undef Wstrcpy
- #ifdef L_wcsdup
- #define L_strdup
- #define Wstrdup wcsdup
- #define Wstrlen wcslen
- #define Wstrcpy wcscpy
- #else
- #define Wstrdup strdup
- #define Wstrlen strlen
- #define Wstrcpy strcpy
- #endif
- #ifdef L_strdup
- Wchar *Wstrdup(register const Wchar *s1)
- {
- register Wchar *s;
- if ((s = malloc((Wstrlen(s1) + 1) * sizeof(Wchar))) != NULL) {
- Wstrcpy(s, s1);
- }
- return s;
- }
- #endif
- #ifdef L_strerror
- char *strerror(int errnum)
- {
- static char buf[_SYS_ERRMSG_MAXLEN];
- _susv3_strerror_r(errnum, buf, sizeof(buf));
- return buf;
- }
- #endif
- #ifdef L__susv3_strerror_r
- #if defined(__alpha__) || defined(__mips__) || defined(__sparc__)
- static const unsigned char estridx[] = {
- 0,
- EPERM,
- ENOENT,
- ESRCH,
- EINTR,
- EIO,
- ENXIO,
- E2BIG,
- ENOEXEC,
- EBADF,
- ECHILD,
- EAGAIN,
- ENOMEM,
- EACCES,
- EFAULT,
- ENOTBLK,
- EBUSY,
- EEXIST,
- EXDEV,
- ENODEV,
- ENOTDIR,
- EISDIR,
- EINVAL,
- ENFILE,
- EMFILE,
- ENOTTY,
- ETXTBSY,
- EFBIG,
- ENOSPC,
- ESPIPE,
- EROFS,
- EMLINK,
- EPIPE,
- EDOM,
- ERANGE,
- EDEADLK,
- ENAMETOOLONG,
- ENOLCK,
- ENOSYS,
- ENOTEMPTY,
- ELOOP,
- 0,
- ENOMSG,
- EIDRM,
- ECHRNG,
- EL2NSYNC,
- EL3HLT,
- EL3RST,
- ELNRNG,
- EUNATCH,
- ENOCSI,
- EL2HLT,
- EBADE,
- EBADR,
- EXFULL,
- ENOANO,
- EBADRQC,
- EBADSLT,
- 0,
- EBFONT,
- ENOSTR,
- ENODATA,
- ETIME,
- ENOSR,
- ENONET,
- ENOPKG,
- EREMOTE,
- ENOLINK,
- EADV,
- ESRMNT,
- ECOMM,
- EPROTO,
- EMULTIHOP,
- EDOTDOT,
- EBADMSG,
- EOVERFLOW,
- ENOTUNIQ,
- EBADFD,
- EREMCHG,
- ELIBACC,
- ELIBBAD,
- ELIBSCN,
- ELIBMAX,
- ELIBEXEC,
- EILSEQ,
- ERESTART,
- ESTRPIPE,
- EUSERS,
- ENOTSOCK,
- EDESTADDRREQ,
- EMSGSIZE,
- EPROTOTYPE,
- ENOPROTOOPT,
- EPROTONOSUPPORT,
- ESOCKTNOSUPPORT,
- EOPNOTSUPP,
- EPFNOSUPPORT,
- EAFNOSUPPORT,
- EADDRINUSE,
- EADDRNOTAVAIL,
- ENETDOWN,
- ENETUNREACH,
- ENETRESET,
- ECONNABORTED,
- ECONNRESET,
- ENOBUFS,
- EISCONN,
- ENOTCONN,
- ESHUTDOWN,
- ETOOMANYREFS,
- ETIMEDOUT,
- ECONNREFUSED,
- EHOSTDOWN,
- EHOSTUNREACH,
- EALREADY,
- EINPROGRESS,
- ESTALE,
- EUCLEAN,
- ENOTNAM,
- ENAVAIL,
- EISNAM,
- EREMOTEIO,
- #ifdef __mips__
- 0,
- #else
- EDQUOT,
- #endif
- ENOMEDIUM,
- EMEDIUMTYPE,
- #if defined(__mips__) || defined(__sparc__)
- EDEADLOCK,
- #endif
- };
- #endif
- int _susv3_strerror_r(int errnum, char *strerrbuf, size_t buflen)
- {
- register char *s;
- int i, retval;
- char buf[_SYS_ERRMSG_MAXLEN];
- static const char unknown[14] = {
- 'U', 'n', 'k', 'n', 'o', 'w', 'n', ' ', 'e', 'r', 'r', 'o', 'r', ' '
- };
- retval = EINVAL;
- #if defined(__alpha__) || defined(__mips__) || defined(__sparc__)
-
- for (i = 0 ; i < sizeof(estridx)/sizeof(estridx[0]) ; i++) {
- if (estridx[i] == errnum) {
- goto GOT_ESTRIDX;
- }
- }
- i = INT_MAX;
- #ifdef __mips__
- if (errnum == EDQUOT) {
- i = 122;
- }
- #endif
- GOT_ESTRIDX:
- #else
-
- i = errnum;
- #endif
- if (((unsigned int) i) < _SYS_NERR) {
-
- for (s = (char *) _string_syserrmsgs ; i ; ++s) {
- if (!*s) {
- --i;
- }
- }
- if (*s) {
- retval = 0;
- goto GOT_MESG;
- }
- }
- s = _int10tostr(buf+sizeof(buf)-1, errnum) - sizeof(unknown);
- memcpy(s, unknown, sizeof(unknown));
- GOT_MESG:
- if (!strerrbuf) {
- buflen = 0;
- }
- i = strlen(s) + 1;
- if (i > buflen) {
- i = buflen;
- retval = ERANGE;
- }
- if (i) {
- memcpy(strerrbuf, s, i);
- strerrbuf[i-1] = 0;
- }
- if (retval) {
- __set_errno(retval);
- }
- return retval;
- }
- #endif
- #ifdef L__glibc_strerror_r
- weak_alias(_glibc_strerror_r,__strerror_r);
- char *_glibc_strerror_r(int errnum, char *strerrbuf, size_t buflen)
- {
- _susv3_strerror_r(errnum, strerrbuf, buflen);
- return strerrbuf;
- }
- #endif
- #ifdef L_wmempcpy
- #define L_mempcpy
- #define Wmempcpy wmempcpy
- #else
- #define Wmempcpy mempcpy
- #endif
- #ifdef L_mempcpy
- #ifndef L_wmempcpy
- weak_alias(mempcpy,__mempcpy);
- #endif
- Wvoid *Wmempcpy(Wvoid * __restrict s1, const Wvoid * __restrict s2, size_t n)
- {
- register Wchar *r1 = s1;
- register const Wchar *r2 = s2;
- #ifdef __BCC__
- while (n--) {
- *r1++ = *r2++;
- }
- #else
- while (n) {
- *r1++ = *r2++;
- --n;
- }
- #endif
- return r1;
- }
- #endif
- #ifdef L_memrchr
- void *memrchr(const void *s, int c, size_t n)
- {
- register const unsigned char *r;
- #ifdef __BCC__
-
- register const char *np = (const char *) n;
- #else
- #define np n
- #endif
-
- r = ((unsigned char *)s) + ((size_t) np);
- while (np) {
- if (*--r == ((unsigned char)c)) {
- return (void *) r;
- }
- --np;
- }
- return NULL;
- }
- #undef np
- #endif
- #ifdef L_wcpcpy
- #define L_stpcpy
- #define Wstpcpy wcpcpy
- #else
- #define Wstpcpy stpcpy
- #endif
- #ifdef L_stpcpy
- Wchar *Wstpcpy(register Wchar * __restrict s1, const Wchar * __restrict s2)
- {
- #ifdef __BCC__
- do {
- *s1 = *s2++;
- } while (*s1++ != 0);
- #else
- while ( (*s1++ = *s2++) != 0 );
- #endif
- return s1 - 1;
- }
- #endif
- #ifdef L_wcpncpy
- #define L_stpncpy
- #define Wstpncpy wcpncpy
- #else
- #define Wstpncpy stpncpy
- #endif
- #ifdef L_stpncpy
- Wchar *Wstpncpy(register Wchar * __restrict s1,
- register const Wchar * __restrict s2,
- size_t n)
- {
- Wchar *s = s1;
- const Wchar *p = s2;
- #ifdef __BCC__
- while (n--) {
- if ((*s = *s2) != 0) s2++;
- ++s;
- }
- return s1 + (s2 - p);
- #else
- while (n) {
- if ((*s = *s2) != 0) s2++;
- ++s;
- --n;
- }
- return s1 + (s2 - p);
- #endif
- }
- #endif
- #ifdef L_bzero
- void bzero(void *s, size_t n)
- {
- register unsigned char *p = s;
- #ifdef __BCC__
-
- register const char *np = (const char *) n;
- #else
- #define np n
- #endif
- while (np) {
- *p++ = 0;
- --np;
- }
- }
- #undef np
- #endif
- #ifdef L_bcopy
- void bcopy(const void *s2, void *s1, size_t n)
- {
- #if 1
- memmove(s1, s2, n);
- #else
- #ifdef __BCC__
- register char *s;
- register const char *p;
- s = s1;
- p = s2;
- if (p >= s) {
- while (n--) {
- *s++ = *p++;
- }
- } else {
- s += n;
- p += n;
- while (n--) {
- *--s = *--p;
- }
- }
- #else
- register char *s;
- register const char *p;
- s = s1;
- p = s2;
- if (p >= s) {
- while (n) {
- *s++ = *p++;
- --n;
- }
- } else {
- while (n) {
- --n;
- s[n] = p[n];
- }
- }
- #endif
- #endif
- }
- #endif
- #ifdef L_strcasestr
- char *strcasestr(const char *s1, const char *s2)
- {
- register const char *s = s1;
- register const char *p = s2;
- #if 1
- do {
- if (!*p) {
- return (char *) s1;;
- }
- if ((*p == *s)
- || (tolower(*((unsigned char *)p)) == tolower(*((unsigned char *)s)))
- ) {
- ++p;
- ++s;
- } else {
- p = s2;
- if (!*s) {
- return NULL;
- }
- s = ++s1;
- }
- } while (1);
- #else
- while (*p && *s) {
- if ((*p == *s)
- || (tolower(*((unsigned char *)p)) == tolower(*((unsigned char *)s)))
- ) {
- ++p;
- ++s;
- } else {
- p = s2;
- s = ++s1;
- }
- }
- return (*p) ? NULL : (char *) s1;
- #endif
- }
- #endif
- #ifdef L_strndup
- char *strndup(register const char *s1, size_t n)
- {
- register char *s;
- n = strnlen(s1,n);
- if ((s = malloc(n + 1)) != NULL) {
- memcpy(s, s1, n);
- s[n] = 0;
- }
- return s;
- }
- #endif
- #ifdef L_strsep
- char *strsep(char ** __restrict s1, const char * __restrict s2)
- {
- register char *s = *s1;
- register char *p;
- #if 1
- p = NULL;
- if (s && *s && (p = strpbrk(s, s2))) {
- *p++ = 0;
- }
- #else
- if (s && *s && *(p = s + strcspn(s, s2))) {
- *p++ = 0;
- } else {
- p = NULL;
- }
- #endif
- *s1 = p;
- return s;
- }
- #endif
- #ifdef L_wcschrnul
- #define L_strchrnul
- #define __Wstrchrnul __wcschrnul
- #define Wstrchrnul wcschrnul
- #else
- #define __Wstrchrnul __strchrnul
- #define Wstrchrnul strchrnul
- #endif
- #ifdef L_strchrnul
- extern Wchar *__Wstrchrnul(register const Wchar *s, Wint c);
- weak_alias(__Wstrchrnul, Wstrchrnul);
- Wchar *__Wstrchrnul(register const Wchar *s, Wint c)
- {
- --s;
- while (*++s && (*s != ((Wchar)c)));
- return (Wchar *) s;
- }
- #endif
- #ifdef L_rawmemchr
- void *rawmemchr(const void *s, int c)
- {
- register const unsigned char *r = s;
- while (*r != ((unsigned char)c)) ++r;
- return (void *) r;
- }
- #endif
- #ifdef L_basename
- char *basename(const char *path)
- {
- register const char *s;
- register const char *p;
- p = s = path;
- while (*s) {
- if (*s++ == '/') {
- p = s;
- }
- }
- return (char *) p;
- }
- #endif
- #ifdef L___xpg_basename
- char *__xpg_basename(register char *path)
- {
- static const char null_or_empty[] = ".";
- char *first;
- register char *last;
- first = (char *) null_or_empty;
- if (path && *path) {
- first = path;
- last = path - 1;
- do {
- if ((*path != '/') && (path > ++last)) {
- last = first = path;
- }
- } while (*++path);
- if (*first == '/') {
- last = first;
- }
- last[1] = 0;
- }
- return first;
- }
- #endif
- #ifdef L_dirname
- char *dirname(char *path)
- {
- static const char null_or_empty_or_noslash[] = ".";
- register char *s;
- register char *last;
- char *first;
- last = s = path;
- if (s != NULL) {
- LOOP:
- while (*s && (*s != '/')) ++s;
- first = s;
- while (*s == '/') ++s;
- if (*s) {
- last = first;
- goto LOOP;
- }
- if (last == path) {
- if (*last != '/') {
- goto DOT;
- }
- if ((*++last == '/') && (last[1] == 0)) {
- ++last;
- }
- }
- *last = 0;
- return path;
- }
- DOT:
- return (char *) null_or_empty_or_noslash;
- }
- #endif
- #ifdef L_strlcat
- size_t strlcat(register char *__restrict dst,
- register const char *__restrict src,
- size_t n)
- {
- size_t len;
- char dummy[1];
- len = 0;
- while (1) {
- if (len >= n) {
- dst = dummy;
- break;
- }
- if (!*dst) {
- break;
- }
- ++dst;
- ++len;
- }
- while ((*dst = *src) != 0) {
- if (++len < n) {
- ++dst;
- }
- ++src;
- }
- return len;
- }
- #endif
- #ifdef WANT_WIDE
- extern size_t __wcslcpy(wchar_t *__restrict dst,
- const wchar_t *__restrict src,
- size_t n);
- #endif
- #ifdef L___wcslcpy
- #define L_strlcpy
- #define Wstrlcpy __wcslcpy
- #ifdef __LOCALE_C_ONLY
- weak_alias(__wcslcpy,wcsxfrm);
- #endif
- #endif
- #ifdef L_strlcpy
- #ifndef L___wcslcpy
- #define Wstrlcpy strlcpy
- #ifdef __LOCALE_C_ONLY
- weak_alias(strlcpy,strxfrm);
- #endif
- #endif
- size_t Wstrlcpy(register Wchar *__restrict dst,
- register const Wchar *__restrict src,
- size_t n)
- {
- const Wchar *src0 = src;
- Wchar dummy[1];
- if (!n) {
- dst = dummy;
- } else {
- --n;
- }
- while ((*dst = *src) != 0) {
- if (n) {
- --n;
- ++dst;
- }
- ++src;
- }
- return src - src0;
- }
- #endif
- #ifdef L__string_syssigmsgs
- const char _string_syssigmsgs[] = {
- "\0"
- "Hangup\0"
- "Interrupt\0"
- "Quit\0"
- "Illegal instruction\0"
- "Trace/breakpoint trap\0"
- "Aborted\0"
- "Bus error\0"
- "Floating point exception\0"
- "Killed\0"
- "User defined signal 1\0"
- "Segmentation fault\0"
- "User defined signal 2\0"
- "Broken pipe\0"
- "Alarm clock\0"
- "Terminated\0"
- "Stack fault\0"
- "Child exited\0"
- "Continued\0"
- "Stopped (signal)\0"
- "Stopped\0"
- "Stopped (tty input)\0"
- "Stopped (tty output)\0"
- "Urgent I/O condition\0"
- "CPU time limit exceeded\0"
- "File size limit exceeded\0"
- "Virtual timer expired\0"
- "Profiling timer expired\0"
- "Window changed\0"
- "I/O possible\0"
- "Power failure\0"
- "Bad system call"
- };
- #endif
- #ifdef L_sys_siglist
- const char *const sys_siglist[_NSIG] = {
- NULL,
- _string_syssigmsgs + 1,
- _string_syssigmsgs + 8,
- _string_syssigmsgs + 18,
- _string_syssigmsgs + 23,
- _string_syssigmsgs + 43,
- _string_syssigmsgs + 65,
- _string_syssigmsgs + 73,
- _string_syssigmsgs + 83,
- _string_syssigmsgs + 108,
- _string_syssigmsgs + 115,
- _string_syssigmsgs + 137,
- _string_syssigmsgs + 156,
- _string_syssigmsgs + 178,
- _string_syssigmsgs + 190,
- _string_syssigmsgs + 202,
- _string_syssigmsgs + 213,
- _string_syssigmsgs + 225,
- _string_syssigmsgs + 238,
- _string_syssigmsgs + 248,
- _string_syssigmsgs + 265,
- _string_syssigmsgs + 273,
- _string_syssigmsgs + 293,
- _string_syssigmsgs + 314,
- _string_syssigmsgs + 335,
- _string_syssigmsgs + 359,
- _string_syssigmsgs + 384,
- _string_syssigmsgs + 406,
- _string_syssigmsgs + 430,
- _string_syssigmsgs + 445,
- _string_syssigmsgs + 458,
- _string_syssigmsgs + 472,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- };
- #endif
- #ifdef L_strsignal
- char *strsignal(int signum)
- {
- register char *s;
- int i;
- static char buf[_STRSIGNAL_BUFSIZE];
- static const char unknown[15] = {
- 'U', 'n', 'k', 'n', 'o', 'w', 'n', ' ', 's', 'i', 'g', 'n', 'a', 'l', ' '
- };
- if (((unsigned int) signum) < _SYS_NSIG) {
-
- for (s = (char *) _string_syssigmsgs, i = signum ; i ; ++s) {
- if (!*s) {
- --i;
- }
- }
- if (*s) {
- goto DONE;
- }
- }
- s = _int10tostr(buf+sizeof(buf)-1, signum) - sizeof(unknown);
- memcpy(s, unknown, sizeof(unknown));
- DONE:
- return s;
- }
- #endif
- #ifdef L_psignal
- void psignal(int signum, register const char *message)
- {
-
- register const char *sep;
- sep = ": ";
- if (!(message && *message)) {
- message = (sep += 2);
- }
- #if 1
- fprintf(stderr, "%s%s%s\n", message, sep, strsignal(signum));
- #else
-
- __STDIO_THREADLOCK(stderr);
- _stdio_fdout(STDERR_FILENO, message, sep, strsignal(signum));
- __STDIO_THREADUNLOCK(stderr);
- #endif
- }
- #endif
- #ifndef __LOCALE_C_ONLY
- #ifdef L_strxfrm
- #ifndef WANT_WIDE
- #error WANT_WIDE should be defined for L_strxfrm
- #endif
- #ifdef L_wcsxfrm
- #error L_wcsxfrm already defined for L_strxfrm
- #endif
- #define wcscoll strcoll
- #define L_wcsxfrm
- #undef WANT_WIDE
- #undef Wvoid
- #undef Wchar
- #undef Wuchar
- #undef Wint
- #define Wchar char
- #endif
- #ifdef L_wcsxfrm
- #define CUR_COLLATE (&__global_locale.collate)
- #define MAX_PENDING 8
- typedef struct {
- const Wchar *s;
- const Wchar *eob;
- __uwchar_t weight;
- __uwchar_t ui_weight;
- int colitem;
- int weightidx;
- int rule;
- size_t position;
-
- __uwchar_t *cip;
- __uwchar_t ci_pending[MAX_PENDING];
- char *back_buf;
- char *bbe;
- char *bp;
- char ibb[128];
- size_t bb_size;
- int ru_pushed;
- } col_state_t;
- #define WEIGHT_MASK 0x3fffU
- #define RULE_MASK 0xc000U
- #define RULE_FORWARD (1 << 14)
- #define RULE_POSITION (1 << 15)
- #define UI_IDX (WEIGHT_MASK-6)
- #define POSIT_IDX (WEIGHT_MASK-5)
- #define RANGE_IDX (WEIGHT_MASK-4)
- #define UNDEF_IDX (WEIGHT_MASK-3)
- #define INVAL_IDX (WEIGHT_MASK-2)
- #define DITTO_IDX (WEIGHT_MASK-1)
- #undef TRACE
- #if 0
- #define TRACE(X) printf##X
- #else
- #define TRACE(X) ((void)0)
- #endif
- static int lookup(wchar_t wc)
- {
- unsigned int sc, n, i0, i1;
- if (((__uwchar_t) wc) > 0xffffU) {
- return 0;
- }
- sc = wc & CUR_COLLATE->ti_mask;
- wc >>= CUR_COLLATE->ti_shift;
- n = wc & CUR_COLLATE->ii_mask;
- wc >>= CUR_COLLATE->ii_shift;
- i0 = CUR_COLLATE->wcs2colidt_tbl[wc];
- i0 <<= CUR_COLLATE->ii_shift;
- i1 = CUR_COLLATE->wcs2colidt_tbl[CUR_COLLATE->ii_len + i0 + n];
- i1 <<= CUR_COLLATE->ti_shift;
- return CUR_COLLATE->wcs2colidt_tbl[CUR_COLLATE->ii_len + CUR_COLLATE->ti_len + i1 + sc];
- }
- static void init_col_state(col_state_t *cs, const Wchar *wcs)
- {
- memset(cs, 0, sizeof(col_state_t));
- cs->s = wcs;
- cs->bp = cs->back_buf = cs->ibb;
- cs->bb_size = 128;
- cs->bbe = cs->back_buf + (cs->bb_size -1);
- }
- static void next_weight(col_state_t *cs, int pass)
- {
- int r, w, ru, ri, popping_backup_stack;
- ssize_t n;
- const uint16_t *p;
- #ifdef WANT_WIDE
- #define WC (*cs->s)
- #define N (1)
- #else
- mbstate_t mbstate;
- wchar_t WC;
- size_t n0, nx;
- #define N n0
- mbstate.mask = 0;
- #endif
- do {
- if (cs->ru_pushed) {
- ru = cs->ru_pushed;
- TRACE(("ru_pushed = %d\n", ru));
- cs->ru_pushed = 0;
- goto POSITION_SKIP;
- }
- #ifdef __UCLIBC_MJN3_ONLY__
- #warning should we walk pendings backwards?
- #endif
- if (cs->cip) {
- if ((r = *(cs->cip++)) == 0) {
- cs->cip = NULL;
- continue;
- }
- cs->weightidx = r & WEIGHT_MASK;
- assert(cs->weightidx);
- } else {
- TRACE(("clearing popping flag\n"));
- popping_backup_stack = 0;
- IGNORE_LOOP:
-
- if (*cs->bp) {
- POP_BACKUP:
- popping_backup_stack = 1;
- TRACE(("setting popping flag\n"));
- n = 0;
- if (*cs->bp > 0) {
- cs->s -= 1;
- if ((*cs->bp -= 1) == 0) {
- cs->bp -= 1;
- }
- } else {
- cs->s += *cs->bp;
- cs->bp -= 1;
- }
- } else if (!*cs->s) {
- cs->weight = 0;
- return;
- } else {
- cs->position += 1;
- }
- BACK_LOOP:
- #ifdef WANT_WIDE
- n = 1;
- cs->colitem = r = lookup(*cs->s);
- #else
- n = n0 = mbrtowc(&WC, cs->s, SIZE_MAX, &mbstate);
- if (n < 0) {
- __set_errno(EILSEQ);
- cs->weight = 0;
- return;
- }
- cs->colitem = r = lookup(WC);
- #endif
- TRACE((" r=%d WC=%#lx\n", r, (unsigned long)(WC)));
- if (r > CUR_COLLATE->max_col_index) {
- p = CUR_COLLATE->multistart_tbl;
- p += p[r-CUR_COLLATE->max_col_index -1];
- do {
- n = N;
- r = *p++;
- do {
- if (!*p) {
- cs->colitem = r;
- TRACE((" found multi %d\n", n));
- goto FOUND;
- }
- #ifdef WANT_WIDE
-
- if (!cs->s[n] || (lookup(cs->s[n]) != *p)) {
- do {} while (*p++);
- break;
- }
- ++p;
- ++n;
- #else
- if (cs->s[n]) {
- nx = mbrtowc(&WC, cs->s + n, SIZE_MAX, &mbstate);
- if (nx < 0) {
- __set_errno(EILSEQ);
- cs->weight = 0;
- return;
- }
- }
- if (!cs->s[n] || (lookup(WC) != *p)) {
- do {} while (*p++);
- break;
- }
- ++p;
- n += nx;
- #endif
- } while (1);
- } while (1);
- } else if (r == 0) {
- if ((CUR_COLLATE->range_count)
- #ifdef __UCLIBC_MJN3_ONLY__
- #warning .. need to introduce range as a collating item?
- #endif
- && (((__uwchar_t)(WC - CUR_COLLATE->range_low)) <= CUR_COLLATE->range_count)
- ) {
-
- TRACE((" found range\n"));
- ru = CUR_COLLATE->ruletable[CUR_COLLATE->range_rule_offset*CUR_COLLATE->MAX_WEIGHTS + pass];
- assert((ru & WEIGHT_MASK) != DITTO_IDX);
- if ((ru & WEIGHT_MASK) == WEIGHT_MASK) {
- ru = (ru & RULE_MASK) | RANGE_IDX;
- cs->weight = CUR_COLLATE->range_base_weight + (WC - CUR_COLLATE->range_low);
- }
- goto RANGE_SKIP_TO;
- } else if (((__uwchar_t)(WC)) <= 0x7fffffffUL) {
- UNDEFINED:
-
- ri = CUR_COLLATE->undefined_idx;
- assert(ri != 0);
- TRACE((" found explicit UNDEFINED\n"));
- #ifdef __UCLIBC_MJN3_ONLY__
- #warning right now single weight locales do not support ..
- #endif
- if (CUR_COLLATE->num_weights == 1) {
- TRACE((" single weight UNDEFINED\n"));
- cs->weightidx = RANGE_IDX;
- cs->weight = ri;
- cs->s += n;
- goto PROCESS_WEIGHT;
- }
- ri = CUR_COLLATE->index2ruleidx[ri - 1];
- ru = CUR_COLLATE->ruletable[ri * CUR_COLLATE->MAX_WEIGHTS + pass];
- assert((ru & WEIGHT_MASK) != WEIGHT_MASK);
- if ((ru & WEIGHT_MASK) == DITTO_IDX) {
- cs->colitem = CUR_COLLATE->undefined_idx;
- }
- goto RANGE_SKIP_TO;
- } else {
- TRACE((" found illegal\n"));
- __set_errno(EINVAL);
-
- if (pass > 0) {
- cs->s += n;
- goto IGNORE_LOOP;
- }
- ru = (RULE_FORWARD | RANGE_IDX);
- cs->weight = 0xffffU;
- goto RANGE_SKIP_TO;
- }
- } else if (CUR_COLLATE->num_weights == 1) {
- TRACE((" single weight\n"));
- cs->weightidx = RANGE_IDX;
- cs->weight = cs->colitem;
- cs->s += n;
- goto PROCESS_WEIGHT;
- } else {
- TRACE((" normal\n"));
- }
-
- FOUND:
- ri = CUR_COLLATE->index2ruleidx[cs->colitem - 1];
- TRACE((" ri=%d ", ri));
- #ifdef __UCLIBC_MJN3_ONLY__
- #warning make sure this is correct
- #endif
- if (!ri) {
- TRACE(("NOT IN THIS LOCALE\n"));
- goto UNDEFINED;
- }
- ru = CUR_COLLATE->ruletable[ri * CUR_COLLATE->MAX_WEIGHTS + pass];
- RANGE_SKIP_TO:
- #ifdef __UCLIBC_MJN3_ONLY__
- #warning ignoreables probably should not interrupt backwards processing, but this is wrong
- #endif
- TRACE((" rule = %#x weight = %#x popping = %d s = %p eob = %p\n",
- ru & RULE_MASK, ru & WEIGHT_MASK, popping_backup_stack,
- cs->s, cs->eob));
-
- if (!popping_backup_stack) {
- if (!(ru & RULE_MASK)) {
- TRACE(("backwards\n"));
- assert(cs->bp <= cs->bbe);
- if (cs->bp == cs->bbe) {
- if (cs->back_buf == cs->ibb) {
- cs->bp = malloc(cs->bb_size + 128);
- if (!cs->bp) {
- __set_errno(ENOMEM);
- #ifdef __UCLIBC_MJN3_ONLY__
- #warning what to do here?
- #endif
- cs->weight = 0;
- return;
- }
- memcpy(cs->bp, cs->back_buf, cs->bb_size);
- } else {
- cs->bp = realloc(cs->back_buf, cs->bb_size + 128);
- if (!cs->bp) {
- __set_errno(ENOMEM);
- #ifdef __UCLIBC_MJN3_ONLY__
- #warning what to do here?
- #endif
- cs->weight = 0;
- return;
- }
- }
- cs->bb_size += 128;
- cs->bbe = cs->bp + (cs->bbe - cs->back_buf);
- cs->back_buf = cs->bp;
- cs->bp = cs->bbe;
- }
- if (n==1) {
- if (*cs->bp && (((unsigned char)(*cs->bp)) < CHAR_MAX)) {
- *cs->bp += 1;
- } else {
- if (!cs->bp) {
- cs->bp = cs->back_buf;
- } else {
- assert(cs->bp < cs->bbe);
- ++cs->bp;
- }
- *cs->bp = 1;
- }
- } else {
- assert(n>1);
- assert(cs->bp < cs->bbe);
- *++cs->bp = -n;
- }
- cs->s += n;
- if (*cs->s) {
- goto BACK_LOOP;
- }
-
- cs->eob = cs->s;
- TRACE(("popping\n"));
- goto POP_BACKUP;
- } else if (*cs->bp) {
-
- assert(!cs->cip);
- cs->eob = cs->s;
- TRACE(("popping\n"));
- goto POP_BACKUP;
- } else {
- TRACE(("forwards\n"));
- if ((ru & (RULE_POSITION|WEIGHT_MASK)) > RULE_POSITION) {
- assert(ru & WEIGHT_MASK);
- cs->ru_pushed = ru;
- cs->weight = cs->position;
- #ifdef __UCLIBC_MJN3_ONLY__
- #warning devel code
- #endif
- cs->position = 0;
- cs->s += n;
- cs->weightidx = RANGE_IDX;
- goto PROCESS_WEIGHT;
- }
- }
- } else {
- TRACE(("popping (continued)\n"));
- if (!*cs->bp) {
- cs->s = cs->eob;
- }
- cs->s -= n;
- }
- cs->s += n;
- POSITION_SKIP:
- cs->weightidx = ru & WEIGHT_MASK;
- cs->rule = ru & RULE_MASK;
- }
- #ifdef __UCLIBC_MJN3_ONLY__
- #warning for pending we only want the weight... _not_ the rule
- #endif
- if (!cs->weightidx) {
- continue;
- }
- PROCESS_WEIGHT:
- assert(cs->weightidx);
- if (((unsigned int)(cs->weightidx - UI_IDX)) <= (INVAL_IDX-UI_IDX)) {
- if (cs->weightidx == UI_IDX) {
- cs->weight = cs->ui_weight;
- }
- return;
- }
- assert(cs->weightidx != WEIGHT_MASK);
- if (cs->weightidx == DITTO_IDX) {
- TRACE(("doing ditto\n"));
- w = CUR_COLLATE->index2weight[cs->colitem -1];
- } else if (cs->weightidx <= CUR_COLLATE->max_col_index) {
- TRACE(("doing normal\n"));
- w = CUR_COLLATE->index2weight[cs->weightidx -1];
- } else {
- TRACE(("doing string\n"));
- assert(!(cs->weightidx & RULE_MASK));
-
- p = CUR_COLLATE->weightstr + (cs->weightidx - (CUR_COLLATE->max_col_index + 2));
- if (*p & WEIGHT_MASK) {
- r = 0;
- do {
- assert(r < MAX_PENDING);
- cs->ci_pending[r++] = *p++;
- } while (*p & WEIGHT_MASK);
- cs->cip = cs->ci_pending;
- }
- continue;
- }
- cs->weight = w;
- return;
- } while (1);
- }
- int wcscoll (const Wchar *s0, const Wchar *s1)
- {
- col_state_t ws[2];
- int pass;
- if (!CUR_COLLATE->num_weights) {
- #ifdef WANT_WIDE
- return wcscmp(s0, s1);
- #else
- return strcmp(s0, s1);
- #endif
- }
- pass = 0;
- do {
- init_col_state(ws, s0);
- init_col_state(ws+1, s1);
- do {
-
- next_weight(ws, pass);
- next_weight(ws+1, pass);
- TRACE(("w0=%lu w1=%lu\n",
- (unsigned long) ws[0].weight,
- (unsigned long) ws[1].weight));
- if (ws[0].weight != ws[1].weight) {
- return ws[0].weight - ws[1].weight;
- }
- } while (ws[0].weight);
- } while (++pass < CUR_COLLATE->num_weights);
- return 0;
- }
- #ifdef WANT_WIDE
- size_t wcsxfrm(wchar_t *__restrict ws1, const wchar_t *__restrict ws2, size_t n)
- {
- col_state_t cs;
- size_t count;
- int pass;
- if (!CUR_COLLATE->num_weights) {
- return __wcslcpy(ws1, ws2, n);
- }
- #ifdef __UCLIBC_MJN3_ONLY__
- #warning handle empty string as a special case
- #endif
- count = pass = 0;
- do {
- init_col_state(&cs, ws2);
- do {
- next_weight(&cs, pass);
- TRACE(("weight=%lu (%#lx)\n", (unsigned long) cs.weight, (unsigned long) cs.weight));
- if (count < n) {
- ws1[count] = cs.weight +1;
- }
- ++count;
- TRACE(("--------------------------------------------\n"));
- } while (cs.weight);
- if (count <= n) {
- ws1[count-1] = 1;
- }
- TRACE(("-------------------- pass %d --------------------\n", pass));
- } while (++pass < CUR_COLLATE->num_weights);
- if (count <= n) {
- ws1[count-1] = 0;
- }
- return count-1;
- }
- #else
- static const unsigned long bound[] = {
- 1UL << 7,
- 1UL << 11,
- 1UL << 16,
- 1UL << 21,
- 1UL << 26,
- };
- static unsigned char first[] = {
- 0x0, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc
- };
- static size_t store(unsigned char *s, size_t count, size_t n, __uwchar_t weight)
- {
- int i, r;
- i = 0;
- do {
- if (weight < bound[i]) {
- break;
- }
- } while (++i < sizeof(bound)/sizeof(bound[0]));
- r = i+1;
- if (i + count < n) {
- s += count;
- s[0] = first[i];
- while (i) {
- s[i] = 0x80 | (weight & 0x3f);
- weight >>= 6;
- --i;
- }
- s[0] |= weight;
- }
- return r;
- }
- size_t strxfrm(char *__restrict ws1, const char *__restrict ws2, size_t n)
- {
- col_state_t cs;
- size_t count, inc;
- int pass;
- if (!CUR_COLLATE->num_weights) {
- return strlcpy(ws1, ws2, n);
- }
- #ifdef __UCLIBC_MJN3_ONLY__
- #warning handle empty string as a special case
- #endif
- inc = count = pass = 0;
- do {
- init_col_state(&cs, ws2);
- do {
- next_weight(&cs, pass);
- TRACE(("weight=%lu (%#lx)\n", (unsigned long) cs.weight, (unsigned long) cs.weight));
- inc = store((unsigned char *)ws1, count, n, cs.weight + 1);
- count += inc;
- TRACE(("--------------------------------------------\n"));
- } while (cs.weight);
-
- assert(inc == 1);
- if (count <= n) {
- ws1[count-1] = 1;
- }
- TRACE(("-------------------- pass %d --------------------\n", pass));
- } while (++pass < CUR_COLLATE->num_weights);
- if (count <= n) {
- ws1[count-1] = 0;
- }
- return count-1;
- }
- #endif
- #endif
- #endif
|