musl_openbsd_386.go (122871B)
1 // Code generated by 'ccgo -export-externs X -export-fields F -hide __syscall0,__syscall1,__syscall2,__syscall3,__syscall4,__syscall5,__syscall6,getnameinfo,gethostbyaddr_r, -nostdinc -nostdlib -o ../musl_openbsd_386.go -pkgname libc -static-locals-prefix _s -Iarch/i386 -Iarch/generic -Iobj/src/internal -Isrc/include -Isrc/internal -Iobj/include -Iinclude copyright.c ../openbsd/ctype_.c src/ctype/isalnum.c src/ctype/isalpha.c src/ctype/isdigit.c src/ctype/islower.c src/ctype/isprint.c src/ctype/isspace.c src/ctype/isupper.c src/ctype/isxdigit.c src/internal/floatscan.c src/internal/intscan.c src/internal/shgetc.c src/math/copysignl.c src/math/fabsl.c src/math/fmodl.c src/math/rint.c src/math/scalbn.c src/math/scalbnl.c src/network/freeaddrinfo.c src/network/getaddrinfo.c src/network/gethostbyaddr.c src/network/gethostbyaddr_r.c src/network/gethostbyname.c src/network/gethostbyname2.c src/network/gethostbyname2_r.c src/network/getnameinfo.c src/network/h_errno.c src/network/inet_aton.c src/network/inet_ntop.c src/network/inet_pton.c src/network/lookup_ipliteral.c src/network/lookup_name.c src/network/lookup_serv.c src/stdio/__toread.c src/stdio/__uflow.c src/stdlib/bsearch.c src/stdlib/strtod.c src/stdlib/strtol.c src/string/strdup.c src/string/strnlen.c src/string/strspn.c', DO NOT EDIT. 2 3 package libc 4 5 import ( 6 "math" 7 "reflect" 8 "sync/atomic" 9 "unsafe" 10 ) 11 12 var _ = math.Pi 13 var _ reflect.Kind 14 var _ atomic.Value 15 var _ unsafe.Pointer 16 17 // musl as a whole is licensed under the following standard MIT license: 18 // 19 // ---------------------------------------------------------------------- 20 // Copyright © 2005-2020 Rich Felker, et al. 21 // 22 // Permission is hereby granted, free of charge, to any person obtaining 23 // a copy of this software and associated documentation files (the 24 // "Software"), to deal in the Software without restriction, including 25 // without limitation the rights to use, copy, modify, merge, publish, 26 // distribute, sublicense, and/or sell copies of the Software, and to 27 // permit persons to whom the Software is furnished to do so, subject to 28 // the following conditions: 29 // 30 // The above copyright notice and this permission notice shall be 31 // included in all copies or substantial portions of the Software. 32 // 33 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 34 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 35 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 36 // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 37 // CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 38 // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 39 // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 40 // ---------------------------------------------------------------------- 41 // 42 // Authors/contributors include: 43 // 44 // A. Wilcox 45 // Ada Worcester 46 // Alex Dowad 47 // Alex Suykov 48 // Alexander Monakov 49 // Andre McCurdy 50 // Andrew Kelley 51 // Anthony G. Basile 52 // Aric Belsito 53 // Arvid Picciani 54 // Bartosz Brachaczek 55 // Benjamin Peterson 56 // Bobby Bingham 57 // Boris Brezillon 58 // Brent Cook 59 // Chris Spiegel 60 // Clément Vasseur 61 // Daniel Micay 62 // Daniel Sabogal 63 // Daurnimator 64 // David Carlier 65 // David Edelsohn 66 // Denys Vlasenko 67 // Dmitry Ivanov 68 // Dmitry V. Levin 69 // Drew DeVault 70 // Emil Renner Berthing 71 // Fangrui Song 72 // Felix Fietkau 73 // Felix Janda 74 // Gianluca Anzolin 75 // Hauke Mehrtens 76 // He X 77 // Hiltjo Posthuma 78 // Isaac Dunham 79 // Jaydeep Patil 80 // Jens Gustedt 81 // Jeremy Huntwork 82 // Jo-Philipp Wich 83 // Joakim Sindholt 84 // John Spencer 85 // Julien Ramseier 86 // Justin Cormack 87 // Kaarle Ritvanen 88 // Khem Raj 89 // Kylie McClain 90 // Leah Neukirchen 91 // Luca Barbato 92 // Luka Perkov 93 // M Farkas-Dyck (Strake) 94 // Mahesh Bodapati 95 // Markus Wichmann 96 // Masanori Ogino 97 // Michael Clark 98 // Michael Forney 99 // Mikhail Kremnyov 100 // Natanael Copa 101 // Nicholas J. Kain 102 // orc 103 // Pascal Cuoq 104 // Patrick Oppenlander 105 // Petr Hosek 106 // Petr Skocik 107 // Pierre Carrier 108 // Reini Urban 109 // Rich Felker 110 // Richard Pennington 111 // Ryan Fairfax 112 // Samuel Holland 113 // Segev Finer 114 // Shiz 115 // sin 116 // Solar Designer 117 // Stefan Kristiansson 118 // Stefan O'Rear 119 // Szabolcs Nagy 120 // Timo Teräs 121 // Trutz Behn 122 // Valentin Ochs 123 // Will Dietz 124 // William Haddon 125 // William Pitcock 126 // 127 // Portions of this software are derived from third-party works licensed 128 // under terms compatible with the above MIT license: 129 // 130 // The TRE regular expression implementation (src/regex/reg* and 131 // src/regex/tre*) is Copyright © 2001-2008 Ville Laurikari and licensed 132 // under a 2-clause BSD license (license text in the source files). The 133 // included version has been heavily modified by Rich Felker in 2012, in 134 // the interests of size, simplicity, and namespace cleanliness. 135 // 136 // Much of the math library code (src/math/* and src/complex/*) is 137 // Copyright © 1993,2004 Sun Microsystems or 138 // Copyright © 2003-2011 David Schultz or 139 // Copyright © 2003-2009 Steven G. Kargl or 140 // Copyright © 2003-2009 Bruce D. Evans or 141 // Copyright © 2008 Stephen L. Moshier or 142 // Copyright © 2017-2018 Arm Limited 143 // and labelled as such in comments in the individual source files. All 144 // have been licensed under extremely permissive terms. 145 // 146 // The ARM memcpy code (src/string/arm/memcpy.S) is Copyright © 2008 147 // The Android Open Source Project and is licensed under a two-clause BSD 148 // license. It was taken from Bionic libc, used on Android. 149 // 150 // The AArch64 memcpy and memset code (src/string/aarch64/*) are 151 // Copyright © 1999-2019, Arm Limited. 152 // 153 // The implementation of DES for crypt (src/crypt/crypt_des.c) is 154 // Copyright © 1994 David Burren. It is licensed under a BSD license. 155 // 156 // The implementation of blowfish crypt (src/crypt/crypt_blowfish.c) was 157 // originally written by Solar Designer and placed into the public 158 // domain. The code also comes with a fallback permissive license for use 159 // in jurisdictions that may not recognize the public domain. 160 // 161 // The smoothsort implementation (src/stdlib/qsort.c) is Copyright © 2011 162 // Valentin Ochs and is licensed under an MIT-style license. 163 // 164 // The x86_64 port was written by Nicholas J. Kain and is licensed under 165 // the standard MIT terms. 166 // 167 // The mips and microblaze ports were originally written by Richard 168 // Pennington for use in the ellcc project. The original code was adapted 169 // by Rich Felker for build system and code conventions during upstream 170 // integration. It is licensed under the standard MIT terms. 171 // 172 // The mips64 port was contributed by Imagination Technologies and is 173 // licensed under the standard MIT terms. 174 // 175 // The powerpc port was also originally written by Richard Pennington, 176 // and later supplemented and integrated by John Spencer. It is licensed 177 // under the standard MIT terms. 178 // 179 // All other files which have no copyright comments are original works 180 // produced specifically for use as part of this library, written either 181 // by Rich Felker, the main author of the library, or by one or more 182 // contibutors listed above. Details on authorship of individual files 183 // can be found in the git version control history of the project. The 184 // omission of copyright and license comments in each file is in the 185 // interest of source tree size. 186 // 187 // In addition, permission is hereby granted for all public header files 188 // (include/* and arch/*/bits/*) and crt files intended to be linked into 189 // applications (crt/*, ldso/dlstart.c, and arch/*/crt_arch.h) to omit 190 // the copyright notice and permission notice otherwise required by the 191 // license, and to use these files without any requirement of 192 // attribution. These files include substantial contributions from: 193 // 194 // Bobby Bingham 195 // John Spencer 196 // Nicholas J. Kain 197 // Rich Felker 198 // Richard Pennington 199 // Stefan Kristiansson 200 // Szabolcs Nagy 201 // 202 // all of whom have explicitly granted such permission. 203 // 204 // This file previously contained text expressing a belief that most of 205 // the files covered by the above exception were sufficiently trivial not 206 // to be subject to copyright, resulting in confusion over whether it 207 // negated the permissions granted in the license. In the spirit of 208 // permissive licensing, and of not having licensing issues being an 209 // obstacle to adoption, that text has been removed. 210 const ( /* copyright.c:194:1: */ 211 __musl__copyright__ = 0 212 ) 213 214 const ( /* nameser.h:117:1: */ 215 ns_uop_delete = 0 216 ns_uop_add = 1 217 ns_uop_max = 2 218 ) 219 220 const ( /* nameser.h:147:1: */ 221 ns_t_invalid = 0 222 ns_t_a = 1 223 ns_t_ns = 2 224 ns_t_md = 3 225 ns_t_mf = 4 226 ns_t_cname = 5 227 ns_t_soa = 6 228 ns_t_mb = 7 229 ns_t_mg = 8 230 ns_t_mr = 9 231 ns_t_null = 10 232 ns_t_wks = 11 233 ns_t_ptr = 12 234 ns_t_hinfo = 13 235 ns_t_minfo = 14 236 ns_t_mx = 15 237 ns_t_txt = 16 238 ns_t_rp = 17 239 ns_t_afsdb = 18 240 ns_t_x25 = 19 241 ns_t_isdn = 20 242 ns_t_rt = 21 243 ns_t_nsap = 22 244 ns_t_nsap_ptr = 23 245 ns_t_sig = 24 246 ns_t_key = 25 247 ns_t_px = 26 248 ns_t_gpos = 27 249 ns_t_aaaa = 28 250 ns_t_loc = 29 251 ns_t_nxt = 30 252 ns_t_eid = 31 253 ns_t_nimloc = 32 254 ns_t_srv = 33 255 ns_t_atma = 34 256 ns_t_naptr = 35 257 ns_t_kx = 36 258 ns_t_cert = 37 259 ns_t_a6 = 38 260 ns_t_dname = 39 261 ns_t_sink = 40 262 ns_t_opt = 41 263 ns_t_apl = 42 264 ns_t_tkey = 249 265 ns_t_tsig = 250 266 ns_t_ixfr = 251 267 ns_t_axfr = 252 268 ns_t_mailb = 253 269 ns_t_maila = 254 270 ns_t_any = 255 271 ns_t_zxfr = 256 272 ns_t_max = 65536 273 ) 274 275 const ( /* nameser.h:210:1: */ 276 ns_c_invalid = 0 277 ns_c_in = 1 278 ns_c_2 = 2 279 ns_c_chaos = 3 280 ns_c_hs = 4 281 ns_c_none = 254 282 ns_c_any = 255 283 ns_c_max = 65536 284 ) 285 286 const ( /* nameser.h:221:1: */ 287 ns_kt_rsa = 1 288 ns_kt_dh = 2 289 ns_kt_dsa = 3 290 ns_kt_private = 254 291 ) 292 293 const ( /* nameser.h:228:1: */ 294 cert_t_pkix = 1 295 cert_t_spki = 2 296 cert_t_pgp = 3 297 cert_t_url = 253 298 cert_t_oid = 254 299 ) 300 301 const ( /* nameser.h:28:1: */ 302 ns_s_qd = 0 303 ns_s_zn = 0 304 ns_s_an = 1 305 ns_s_pr = 1 306 ns_s_ns = 2 307 ns_s_ud = 2 308 ns_s_ar = 3 309 ns_s_max = 4 310 ) 311 312 const ( /* nameser.h:75:1: */ 313 ns_f_qr = 0 314 ns_f_opcode = 1 315 ns_f_aa = 2 316 ns_f_tc = 3 317 ns_f_rd = 4 318 ns_f_ra = 5 319 ns_f_z = 6 320 ns_f_ad = 7 321 ns_f_cd = 8 322 ns_f_rcode = 9 323 ns_f_max = 10 324 ) 325 326 const ( /* nameser.h:89:1: */ 327 ns_o_query = 0 328 ns_o_iquery = 1 329 ns_o_status = 2 330 ns_o_notify = 4 331 ns_o_update = 5 332 ns_o_max = 6 333 ) 334 335 const ( /* nameser.h:98:1: */ 336 ns_r_noerror = 0 337 ns_r_formerr = 1 338 ns_r_servfail = 2 339 ns_r_nxdomain = 3 340 ns_r_notimpl = 4 341 ns_r_refused = 5 342 ns_r_yxdomain = 6 343 ns_r_yxrrset = 7 344 ns_r_nxrrset = 8 345 ns_r_notauth = 9 346 ns_r_notzone = 10 347 ns_r_max = 11 348 ns_r_badvers = 16 349 ns_r_badsig = 16 350 ns_r_badkey = 17 351 ns_r_badtime = 18 352 ) 353 354 type ptrdiff_t = int32 /* <builtin>:3:26 */ 355 356 type size_t = uint32 /* <builtin>:9:23 */ 357 358 type wchar_t = int32 /* <builtin>:15:24 */ 359 360 // # 1 "lib/libc/gen/ctype_.c" 361 // # 1 "<built-in>" 362 // # 1 "<command-line>" 363 // # 1 "lib/libc/gen/ctype_.c" 364 // # 36 "lib/libc/gen/ctype_.c" 365 // # 1 "./include/ctype.h" 1 366 // # 43 "./include/ctype.h" 367 // # 1 "./sys/sys/cdefs.h" 1 368 // # 41 "./sys/sys/cdefs.h" 369 // # 1 "./machine/cdefs.h" 1 370 // # 42 "./sys/sys/cdefs.h" 2 371 // # 44 "./include/ctype.h" 2 372 // # 57 "./include/ctype.h" 373 // typedef void *locale_t; 374 // 375 // 376 // 377 // 378 // 379 // extern const char *_ctype_; 380 // extern const short *_tolower_tab_; 381 // extern const short *_toupper_tab_; 382 // 383 // 384 // int isalnum(int); 385 // int isalpha(int); 386 // int iscntrl(int); 387 // int isdigit(int); 388 // int isgraph(int); 389 // int islower(int); 390 // int isprint(int); 391 // int ispunct(int); 392 // int isspace(int); 393 // int isupper(int); 394 // int isxdigit(int); 395 // int tolower(int); 396 // int toupper(int); 397 // 398 // 399 // 400 // int isblank(int); 401 // 402 // 403 // 404 // int isascii(int); 405 // int toascii(int); 406 // int _tolower(int); 407 // int _toupper(int); 408 // 409 // 410 // 411 // int isalnum_l(int, locale_t); 412 // int isalpha_l(int, locale_t); 413 // int isblank_l(int, locale_t); 414 // int iscntrl_l(int, locale_t); 415 // int isdigit_l(int, locale_t); 416 // int isgraph_l(int, locale_t); 417 // int islower_l(int, locale_t); 418 // int isprint_l(int, locale_t); 419 // int ispunct_l(int, locale_t); 420 // int isspace_l(int, locale_t); 421 // int isupper_l(int, locale_t); 422 // int isxdigit_l(int, locale_t); 423 // int tolower_l(int, locale_t); 424 // int toupper_l(int, locale_t); 425 // 426 // 427 // 428 // 429 // 430 // 431 // extern __inline __attribute__((__gnu_inline__)) int isalnum(int _c) 432 // { 433 // return (_c == -1 ? 0 : ((_ctype_ + 1)[(unsigned char)_c] & (0x01|0x02|0x04))); 434 // } 435 // 436 // extern __inline __attribute__((__gnu_inline__)) int isalpha(int _c) 437 // { 438 // return (_c == -1 ? 0 : ((_ctype_ + 1)[(unsigned char)_c] & (0x01|0x02))); 439 // } 440 // 441 // extern __inline __attribute__((__gnu_inline__)) int iscntrl(int _c) 442 // { 443 // return (_c == -1 ? 0 : ((_ctype_ + 1)[(unsigned char)_c] & 0x20)); 444 // } 445 // 446 // extern __inline __attribute__((__gnu_inline__)) int isdigit(int _c) 447 // { 448 // return (_c == -1 ? 0 : ((_ctype_ + 1)[(unsigned char)_c] & 0x04)); 449 // } 450 // 451 // extern __inline __attribute__((__gnu_inline__)) int isgraph(int _c) 452 // { 453 // return (_c == -1 ? 0 : ((_ctype_ + 1)[(unsigned char)_c] & (0x10|0x01|0x02|0x04))); 454 // } 455 // 456 // extern __inline __attribute__((__gnu_inline__)) int islower(int _c) 457 // { 458 // return (_c == -1 ? 0 : ((_ctype_ + 1)[(unsigned char)_c] & 0x02)); 459 // } 460 // 461 // extern __inline __attribute__((__gnu_inline__)) int isprint(int _c) 462 // { 463 // return (_c == -1 ? 0 : ((_ctype_ + 1)[(unsigned char)_c] & (0x10|0x01|0x02|0x04|0x80))); 464 // } 465 // 466 // extern __inline __attribute__((__gnu_inline__)) int ispunct(int _c) 467 // { 468 // return (_c == -1 ? 0 : ((_ctype_ + 1)[(unsigned char)_c] & 0x10)); 469 // } 470 // 471 // extern __inline __attribute__((__gnu_inline__)) int isspace(int _c) 472 // { 473 // return (_c == -1 ? 0 : ((_ctype_ + 1)[(unsigned char)_c] & 0x08)); 474 // } 475 // 476 // extern __inline __attribute__((__gnu_inline__)) int isupper(int _c) 477 // { 478 // return (_c == -1 ? 0 : ((_ctype_ + 1)[(unsigned char)_c] & 0x01)); 479 // } 480 // 481 // extern __inline __attribute__((__gnu_inline__)) int isxdigit(int _c) 482 // { 483 // return (_c == -1 ? 0 : ((_ctype_ + 1)[(unsigned char)_c] & (0x04|0x40))); 484 // } 485 // 486 // extern __inline __attribute__((__gnu_inline__)) int tolower(int _c) 487 // { 488 // if ((unsigned int)_c > 255) 489 // return (_c); 490 // return ((_tolower_tab_ + 1)[_c]); 491 // } 492 // 493 // extern __inline __attribute__((__gnu_inline__)) int toupper(int _c) 494 // { 495 // if ((unsigned int)_c > 255) 496 // return (_c); 497 // return ((_toupper_tab_ + 1)[_c]); 498 // } 499 // 500 // 501 502 // extern __inline __attribute__((__gnu_inline__)) 503 func Xisblank(tls *TLS, _c int32) int32 { /* ctype_.c:144:5: */ 504 return Bool32(_c == ' ' || _c == '\t') 505 } 506 507 // extern __inline __attribute__((__gnu_inline__)) int isascii(int _c) 508 // { 509 // return ((unsigned int)_c <= 0177); 510 // } 511 // 512 // extern __inline __attribute__((__gnu_inline__)) int toascii(int _c) 513 // { 514 // return (_c & 0177); 515 // } 516 // 517 // extern __inline __attribute__((__gnu_inline__)) int _tolower(int _c) 518 // { 519 // return (_c - 'A' + 'a'); 520 // } 521 // 522 // extern __inline __attribute__((__gnu_inline__)) int _toupper(int _c) 523 // { 524 // return (_c - 'a' + 'A'); 525 // } 526 // 527 // 528 // 529 // extern __inline __attribute__((__gnu_inline__)) int 530 // isalnum_l(int _c, locale_t _l __attribute__((__unused__))) 531 // { 532 // return isalnum(_c); 533 // } 534 // 535 // extern __inline __attribute__((__gnu_inline__)) int 536 // isalpha_l(int _c, locale_t _l __attribute__((__unused__))) 537 // { 538 // return isalpha(_c); 539 // } 540 // 541 // extern __inline __attribute__((__gnu_inline__)) int 542 // isblank_l(int _c, locale_t _l __attribute__((__unused__))) 543 // { 544 // return isblank(_c); 545 // } 546 // 547 // extern __inline __attribute__((__gnu_inline__)) int 548 // iscntrl_l(int _c, locale_t _l __attribute__((__unused__))) 549 // { 550 // return iscntrl(_c); 551 // } 552 // 553 // extern __inline __attribute__((__gnu_inline__)) int 554 // isdigit_l(int _c, locale_t _l __attribute__((__unused__))) 555 // { 556 // return isdigit(_c); 557 // } 558 // 559 // extern __inline __attribute__((__gnu_inline__)) int 560 // isgraph_l(int _c, locale_t _l __attribute__((__unused__))) 561 // { 562 // return isgraph(_c); 563 // } 564 // 565 // extern __inline __attribute__((__gnu_inline__)) int 566 // islower_l(int _c, locale_t _l __attribute__((__unused__))) 567 // { 568 // return islower(_c); 569 // } 570 // 571 // extern __inline __attribute__((__gnu_inline__)) int 572 // isprint_l(int _c, locale_t _l __attribute__((__unused__))) 573 // { 574 // return isprint(_c); 575 // } 576 // 577 // extern __inline __attribute__((__gnu_inline__)) int 578 // ispunct_l(int _c, locale_t _l __attribute__((__unused__))) 579 // { 580 // return ispunct(_c); 581 // } 582 // 583 // extern __inline __attribute__((__gnu_inline__)) int 584 // isspace_l(int _c, locale_t _l __attribute__((__unused__))) 585 // { 586 // return isspace(_c); 587 // } 588 // 589 // extern __inline __attribute__((__gnu_inline__)) int 590 // isupper_l(int _c, locale_t _l __attribute__((__unused__))) 591 // { 592 // return isupper(_c); 593 // } 594 // 595 // extern __inline __attribute__((__gnu_inline__)) int 596 // isxdigit_l(int _c, locale_t _l __attribute__((__unused__))) 597 // { 598 // return isxdigit(_c); 599 // } 600 // 601 // extern __inline __attribute__((__gnu_inline__)) int 602 // tolower_l(int _c, locale_t _l __attribute__((__unused__))) 603 // { 604 // return tolower(_c); 605 // } 606 // 607 // extern __inline __attribute__((__gnu_inline__)) int 608 // toupper_l(int _c, locale_t _l __attribute__((__unused__))) 609 // { 610 // return toupper(_c); 611 // } 612 // 613 // 614 // 615 // 616 // 617 // # 37 "lib/libc/gen/ctype_.c" 2 618 // # 1 "./lib/libc/include/ctype_private.h" 1 619 // 620 // 621 // 622 // 623 // 624 // # 5 "./lib/libc/include/ctype_private.h" 625 // #pragma GCC visibility push(hidden) 626 // # 5 "./lib/libc/include/ctype_private.h" 627 // 628 // extern const char _C_ctype_[]; 629 // extern const short _C_toupper_[]; 630 // extern const short _C_tolower_[]; 631 // 632 // # 9 "./lib/libc/include/ctype_private.h" 633 // #pragma GCC visibility pop 634 // # 9 "./lib/libc/include/ctype_private.h" 635 // 636 // # 38 "lib/libc/gen/ctype_.c" 2 637 638 var X_C_ctype_ = [257]int8{ 639 int8(0), 640 int8(0x20), int8(0x20), int8(0x20), int8(0x20), int8(0x20), int8(0x20), int8(0x20), int8(0x20), 641 int8(0x20), int8(0x20 | 0x08), int8(0x20 | 0x08), int8(0x20 | 0x08), int8(0x20 | 0x08), int8(0x20 | 0x08), int8(0x20), int8(0x20), 642 int8(0x20), int8(0x20), int8(0x20), int8(0x20), int8(0x20), int8(0x20), int8(0x20), int8(0x20), 643 int8(0x20), int8(0x20), int8(0x20), int8(0x20), int8(0x20), int8(0x20), int8(0x20), int8(0x20), 644 int8(0x08 | int32(Int8FromInt32(0x80))), int8(0x10), int8(0x10), int8(0x10), int8(0x10), int8(0x10), int8(0x10), int8(0x10), 645 int8(0x10), int8(0x10), int8(0x10), int8(0x10), int8(0x10), int8(0x10), int8(0x10), int8(0x10), 646 int8(0x04), int8(0x04), int8(0x04), int8(0x04), int8(0x04), int8(0x04), int8(0x04), int8(0x04), 647 int8(0x04), int8(0x04), int8(0x10), int8(0x10), int8(0x10), int8(0x10), int8(0x10), int8(0x10), 648 int8(0x10), int8(0x01 | 0x40), int8(0x01 | 0x40), int8(0x01 | 0x40), int8(0x01 | 0x40), int8(0x01 | 0x40), int8(0x01 | 0x40), int8(0x01), 649 int8(0x01), int8(0x01), int8(0x01), int8(0x01), int8(0x01), int8(0x01), int8(0x01), int8(0x01), 650 int8(0x01), int8(0x01), int8(0x01), int8(0x01), int8(0x01), int8(0x01), int8(0x01), int8(0x01), 651 int8(0x01), int8(0x01), int8(0x01), int8(0x10), int8(0x10), int8(0x10), int8(0x10), int8(0x10), 652 int8(0x10), int8(0x02 | 0x40), int8(0x02 | 0x40), int8(0x02 | 0x40), int8(0x02 | 0x40), int8(0x02 | 0x40), int8(0x02 | 0x40), int8(0x02), 653 int8(0x02), int8(0x02), int8(0x02), int8(0x02), int8(0x02), int8(0x02), int8(0x02), int8(0x02), 654 int8(0x02), int8(0x02), int8(0x02), int8(0x02), int8(0x02), int8(0x02), int8(0x02), int8(0x02), 655 int8(0x02), int8(0x02), int8(0x02), int8(0x10), int8(0x10), int8(0x10), int8(0x10), int8(0x20), 656 657 int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), 658 int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), 659 int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), 660 int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), 661 int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), 662 int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), 663 int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), 664 int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), 665 int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), 666 int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), 667 int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), 668 int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), 669 int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), 670 int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), 671 int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), 672 int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), int8(0), 673 } /* ctype_.c:282:12 */ 674 675 var X_ctype_ uintptr = 0 /* ctype_.c:319:12 */ 676 677 func __isspace(tls *TLS, _c int32) int32 { /* ctype.h:26:21: */ 678 return Bool32(_c == ' ' || uint32(_c)-uint32('\t') < uint32(5)) 679 } 680 681 type locale_t = uintptr /* alltypes.h:366:32 */ 682 683 func Xisalnum(tls *TLS, c int32) int32 { /* isalnum.c:3:5: */ 684 return Bool32(func() int32 { 685 if 0 != 0 { 686 return Xisalpha(tls, c) 687 } 688 return Bool32(uint32(c)|uint32(32)-uint32('a') < uint32(26)) 689 }() != 0 || func() int32 { 690 if 0 != 0 { 691 return Xisdigit(tls, c) 692 } 693 return Bool32(uint32(c)-uint32('0') < uint32(10)) 694 }() != 0) 695 } 696 697 func X__isalnum_l(tls *TLS, c int32, l locale_t) int32 { /* isalnum.c:8:5: */ 698 return Xisalnum(tls, c) 699 } 700 701 func Xisalpha(tls *TLS, c int32) int32 { /* isalpha.c:4:5: */ 702 return Bool32(uint32(c)|uint32(32)-uint32('a') < uint32(26)) 703 } 704 705 func X__isalpha_l(tls *TLS, c int32, l locale_t) int32 { /* isalpha.c:9:5: */ 706 return Xisalpha(tls, c) 707 } 708 709 func Xisdigit(tls *TLS, c int32) int32 { /* isdigit.c:4:5: */ 710 return Bool32(uint32(c)-uint32('0') < uint32(10)) 711 } 712 713 func X__isdigit_l(tls *TLS, c int32, l locale_t) int32 { /* isdigit.c:9:5: */ 714 return Xisdigit(tls, c) 715 } 716 717 func Xislower(tls *TLS, c int32) int32 { /* islower.c:4:5: */ 718 return Bool32(uint32(c)-uint32('a') < uint32(26)) 719 } 720 721 func X__islower_l(tls *TLS, c int32, l locale_t) int32 { /* islower.c:9:5: */ 722 return Xislower(tls, c) 723 } 724 725 func Xisprint(tls *TLS, c int32) int32 { /* isprint.c:4:5: */ 726 return Bool32(uint32(c)-uint32(0x20) < uint32(0x5f)) 727 } 728 729 func X__isprint_l(tls *TLS, c int32, l locale_t) int32 { /* isprint.c:9:5: */ 730 return Xisprint(tls, c) 731 } 732 733 func Xisspace(tls *TLS, c int32) int32 { /* isspace.c:4:5: */ 734 return Bool32(c == ' ' || uint32(c)-uint32('\t') < uint32(5)) 735 } 736 737 func X__isspace_l(tls *TLS, c int32, l locale_t) int32 { /* isspace.c:9:5: */ 738 return Xisspace(tls, c) 739 } 740 741 func Xisupper(tls *TLS, c int32) int32 { /* isupper.c:4:5: */ 742 return Bool32(uint32(c)-uint32('A') < uint32(26)) 743 } 744 745 func X__isupper_l(tls *TLS, c int32, l locale_t) int32 { /* isupper.c:9:5: */ 746 return Xisupper(tls, c) 747 } 748 749 func Xisxdigit(tls *TLS, c int32) int32 { /* isxdigit.c:3:5: */ 750 return Bool32(func() int32 { 751 if 0 != 0 { 752 return Xisdigit(tls, c) 753 } 754 return Bool32(uint32(c)-uint32('0') < uint32(10)) 755 }() != 0 || uint32(c)|uint32(32)-uint32('a') < uint32(6)) 756 } 757 758 func X__isxdigit_l(tls *TLS, c int32, l locale_t) int32 { /* isxdigit.c:8:5: */ 759 return Xisxdigit(tls, c) 760 } 761 762 type uintptr_t = uint32 /* alltypes.h:78:24 */ 763 764 type intptr_t = int32 /* alltypes.h:93:15 */ 765 766 type int8_t = int8 /* alltypes.h:119:25 */ 767 768 type int16_t = int16 /* alltypes.h:124:25 */ 769 770 type int32_t = int32 /* alltypes.h:129:25 */ 771 772 type int64_t = int64 /* alltypes.h:134:25 */ 773 774 type intmax_t = int64 /* alltypes.h:139:25 */ 775 776 type uint8_t = uint8 /* alltypes.h:144:25 */ 777 778 type uint16_t = uint16 /* alltypes.h:149:25 */ 779 780 type uint32_t = uint32 /* alltypes.h:154:25 */ 781 782 type uint64_t = uint64 /* alltypes.h:159:25 */ 783 784 type uintmax_t = uint64 /* alltypes.h:169:25 */ 785 786 type int_fast8_t = int8_t /* stdint.h:22:16 */ 787 type int_fast64_t = int64_t /* stdint.h:23:17 */ 788 789 type int_least8_t = int8_t /* stdint.h:25:17 */ 790 type int_least16_t = int16_t /* stdint.h:26:17 */ 791 type int_least32_t = int32_t /* stdint.h:27:17 */ 792 type int_least64_t = int64_t /* stdint.h:28:17 */ 793 794 type uint_fast8_t = uint8_t /* stdint.h:30:17 */ 795 type uint_fast64_t = uint64_t /* stdint.h:31:18 */ 796 797 type uint_least8_t = uint8_t /* stdint.h:33:18 */ 798 type uint_least16_t = uint16_t /* stdint.h:34:18 */ 799 type uint_least32_t = uint32_t /* stdint.h:35:18 */ 800 type uint_least64_t = uint64_t /* stdint.h:36:18 */ 801 802 type int_fast16_t = int32_t /* stdint.h:1:17 */ 803 type int_fast32_t = int32_t /* stdint.h:2:17 */ 804 type uint_fast16_t = uint32_t /* stdint.h:3:18 */ 805 type uint_fast32_t = uint32_t /* stdint.h:4:18 */ 806 807 type ssize_t = int32 /* alltypes.h:88:15 */ 808 809 type off_t = int64 /* alltypes.h:185:16 */ 810 811 type _IO_FILE = struct { 812 Fflags uint32 813 Frpos uintptr 814 Frend uintptr 815 Fclose uintptr 816 Fwend uintptr 817 Fwpos uintptr 818 Fmustbezero_1 uintptr 819 Fwbase uintptr 820 Fread uintptr 821 Fwrite uintptr 822 Fseek uintptr 823 Fbuf uintptr 824 Fbuf_size size_t 825 Fprev uintptr 826 Fnext uintptr 827 Ffd int32 828 Fpipe_pid int32 829 Flockcount int32 830 Fmode int32 831 Flock int32 832 Flbf int32 833 Fcookie uintptr 834 Foff off_t 835 Fgetln_buf uintptr 836 Fmustbezero_2 uintptr 837 Fshend uintptr 838 Fshlim off_t 839 Fshcnt off_t 840 Fprev_locked uintptr 841 Fnext_locked uintptr 842 Flocale uintptr 843 } /* alltypes.h:343:9 */ 844 845 type FILE = _IO_FILE /* alltypes.h:343:25 */ 846 847 type va_list = uintptr /* alltypes.h:349:27 */ 848 849 type _G_fpos64_t = struct { 850 F__ccgo_pad1 [0]uint32 851 F__opaque [16]int8 852 } /* stdio.h:54:9 */ 853 854 type fpos_t = _G_fpos64_t /* stdio.h:58:3 */ 855 856 type float_t = float64 /* alltypes.h:38:21 */ 857 858 type double_t = float64 /* alltypes.h:43:21 */ 859 860 func __FLOAT_BITS(tls *TLS, __f float32) uint32 { /* math.h:55:26: */ 861 bp := tls.Alloc(4) 862 defer tls.Free(4) 863 864 // var __u struct {F__f float32;} at bp, 4 865 866 *(*float32)(unsafe.Pointer(bp)) = __f 867 return *(*uint32)(unsafe.Pointer(bp)) 868 } 869 870 func __DOUBLE_BITS(tls *TLS, __f float64) uint64 { /* math.h:61:36: */ 871 bp := tls.Alloc(8) 872 defer tls.Free(8) 873 874 // var __u struct {F__f float64;} at bp, 8 875 876 *(*float64)(unsafe.Pointer(bp)) = __f 877 return *(*uint64)(unsafe.Pointer(bp)) 878 } 879 880 type syscall_arg_t = int32 /* syscall.h:22:14 */ 881 882 func scanexp(tls *TLS, f uintptr, pok int32) int64 { /* floatscan.c:37:18: */ 883 var c int32 884 var x int32 885 var y int64 886 var neg int32 = 0 887 888 c = func() int32 { 889 if (*FILE)(unsafe.Pointer(f)).Frpos != (*FILE)(unsafe.Pointer(f)).Fshend { 890 return int32(*(*uint8)(unsafe.Pointer(PostIncUintptr(&(*FILE)(unsafe.Pointer(f)).Frpos, 1)))) 891 } 892 return X__shgetc(tls, f) 893 }() 894 if c == '+' || c == '-' { 895 neg = Bool32(c == '-') 896 c = func() int32 { 897 if (*FILE)(unsafe.Pointer(f)).Frpos != (*FILE)(unsafe.Pointer(f)).Fshend { 898 return int32(*(*uint8)(unsafe.Pointer(PostIncUintptr(&(*FILE)(unsafe.Pointer(f)).Frpos, 1)))) 899 } 900 return X__shgetc(tls, f) 901 }() 902 if uint32(c-'0') >= 10 && pok != 0 { 903 if (*FILE)(unsafe.Pointer(f)).Fshlim >= int64(0) { 904 (*FILE)(unsafe.Pointer(f)).Frpos-- 905 } else { 906 } 907 } 908 } 909 if uint32(c-'0') >= 10 { 910 if (*FILE)(unsafe.Pointer(f)).Fshlim >= int64(0) { 911 (*FILE)(unsafe.Pointer(f)).Frpos-- 912 } else { 913 } 914 return -0x7fffffffffffffff - int64(1) 915 } 916 for x = 0; uint32(c-'0') < 10 && x < 0x7fffffff/10; c = func() int32 { 917 if (*FILE)(unsafe.Pointer(f)).Frpos != (*FILE)(unsafe.Pointer(f)).Fshend { 918 return int32(*(*uint8)(unsafe.Pointer(PostIncUintptr(&(*FILE)(unsafe.Pointer(f)).Frpos, 1)))) 919 } 920 return X__shgetc(tls, f) 921 }() { 922 x = 10*x + c - '0' 923 } 924 for y = int64(x); uint32(c-'0') < 10 && y < 0x7fffffffffffffff/int64(100); c = func() int32 { 925 if (*FILE)(unsafe.Pointer(f)).Frpos != (*FILE)(unsafe.Pointer(f)).Fshend { 926 return int32(*(*uint8)(unsafe.Pointer(PostIncUintptr(&(*FILE)(unsafe.Pointer(f)).Frpos, 1)))) 927 } 928 return X__shgetc(tls, f) 929 }() { 930 y = int64(10)*y + int64(c) - int64('0') 931 } 932 for ; uint32(c-'0') < 10; c = func() int32 { 933 if (*FILE)(unsafe.Pointer(f)).Frpos != (*FILE)(unsafe.Pointer(f)).Fshend { 934 return int32(*(*uint8)(unsafe.Pointer(PostIncUintptr(&(*FILE)(unsafe.Pointer(f)).Frpos, 1)))) 935 } 936 return X__shgetc(tls, f) 937 }() { 938 } 939 if (*FILE)(unsafe.Pointer(f)).Fshlim >= int64(0) { 940 (*FILE)(unsafe.Pointer(f)).Frpos-- 941 } else { 942 } 943 if neg != 0 { 944 return -y 945 } 946 return y 947 } 948 949 func decfloat(tls *TLS, f uintptr, c int32, bits int32, emin int32, sign int32, pok int32) float64 { /* floatscan.c:64:20: */ 950 bp := tls.Alloc(512) 951 defer tls.Free(512) 952 953 // var x [128]uint32_t at bp, 512 954 955 var i int32 956 var j int32 957 var k int32 958 var a int32 959 var z int32 960 var lrp int64 = int64(0) 961 var dc int64 = int64(0) 962 var e10 int64 = int64(0) 963 var lnz int32 = 0 964 var gotdig int32 = 0 965 var gotrad int32 = 0 966 var rp int32 967 var e2 int32 968 var emax int32 = -emin - bits + 3 969 var denormal int32 = 0 970 var y float64 971 var frac float64 = float64(0) 972 var bias float64 = float64(0) 973 974 j = 0 975 k = 0 976 977 // Don't let leading zeros consume buffer space 978 for ; c == '0'; c = func() int32 { 979 if (*FILE)(unsafe.Pointer(f)).Frpos != (*FILE)(unsafe.Pointer(f)).Fshend { 980 return int32(*(*uint8)(unsafe.Pointer(PostIncUintptr(&(*FILE)(unsafe.Pointer(f)).Frpos, 1)))) 981 } 982 return X__shgetc(tls, f) 983 }() { 984 gotdig = 1 985 } 986 if c == '.' { 987 gotrad = 1 988 for c = func() int32 { 989 if (*FILE)(unsafe.Pointer(f)).Frpos != (*FILE)(unsafe.Pointer(f)).Fshend { 990 return int32(*(*uint8)(unsafe.Pointer(PostIncUintptr(&(*FILE)(unsafe.Pointer(f)).Frpos, 1)))) 991 } 992 return X__shgetc(tls, f) 993 }(); c == '0'; c = func() int32 { 994 if (*FILE)(unsafe.Pointer(f)).Frpos != (*FILE)(unsafe.Pointer(f)).Fshend { 995 return int32(*(*uint8)(unsafe.Pointer(PostIncUintptr(&(*FILE)(unsafe.Pointer(f)).Frpos, 1)))) 996 } 997 return X__shgetc(tls, f) 998 }() { 999 gotdig = 1 1000 lrp-- 1001 } 1002 } 1003 1004 *(*uint32_t)(unsafe.Pointer(bp)) = uint32_t(0) 1005 for ; uint32(c-'0') < 10 || c == '.'; c = func() int32 { 1006 if (*FILE)(unsafe.Pointer(f)).Frpos != (*FILE)(unsafe.Pointer(f)).Fshend { 1007 return int32(*(*uint8)(unsafe.Pointer(PostIncUintptr(&(*FILE)(unsafe.Pointer(f)).Frpos, 1)))) 1008 } 1009 return X__shgetc(tls, f) 1010 }() { 1011 if c == '.' { 1012 if gotrad != 0 { 1013 break 1014 } 1015 gotrad = 1 1016 lrp = dc 1017 } else if k < 128-3 { 1018 dc++ 1019 if c != '0' { 1020 lnz = int32(dc) 1021 } 1022 if j != 0 { 1023 *(*uint32_t)(unsafe.Pointer(bp + uintptr(k)*4)) = *(*uint32_t)(unsafe.Pointer(bp + uintptr(k)*4))*uint32_t(10) + uint32_t(c) - uint32_t('0') 1024 } else { 1025 *(*uint32_t)(unsafe.Pointer(bp + uintptr(k)*4)) = uint32_t(c - '0') 1026 } 1027 if PreIncInt32(&j, 1) == 9 { 1028 k++ 1029 j = 0 1030 } 1031 gotdig = 1 1032 } else { 1033 dc++ 1034 if c != '0' { 1035 lnz = (128 - 4) * 9 1036 *(*uint32_t)(unsafe.Pointer(bp + 124*4)) |= uint32_t(1) 1037 } 1038 } 1039 } 1040 if !(gotrad != 0) { 1041 lrp = dc 1042 } 1043 1044 if gotdig != 0 && c|32 == 'e' { 1045 e10 = scanexp(tls, f, pok) 1046 if e10 == -0x7fffffffffffffff-int64(1) { 1047 if pok != 0 { 1048 if (*FILE)(unsafe.Pointer(f)).Fshlim >= int64(0) { 1049 (*FILE)(unsafe.Pointer(f)).Frpos-- 1050 } else { 1051 } 1052 } else { 1053 X__shlim(tls, f, int64(0)) 1054 return float64(0) 1055 } 1056 e10 = int64(0) 1057 } 1058 lrp = lrp + e10 1059 } else if c >= 0 { 1060 if (*FILE)(unsafe.Pointer(f)).Fshlim >= int64(0) { 1061 (*FILE)(unsafe.Pointer(f)).Frpos-- 1062 } else { 1063 } 1064 } 1065 if !(gotdig != 0) { 1066 *(*int32)(unsafe.Pointer(X___errno_location(tls))) = 22 1067 X__shlim(tls, f, int64(0)) 1068 return float64(0) 1069 } 1070 1071 // Handle zero specially to avoid nasty special cases later 1072 if !(int32(*(*uint32_t)(unsafe.Pointer(bp))) != 0) { 1073 return float64(sign) * 0.0 1074 } 1075 1076 // Optimize small integers (w/no exponent) and over/under-flow 1077 if lrp == dc && dc < int64(10) && (bits > 30 || *(*uint32_t)(unsafe.Pointer(bp))>>bits == uint32_t(0)) { 1078 return float64(sign) * float64(*(*uint32_t)(unsafe.Pointer(bp))) 1079 } 1080 if lrp > int64(-emin/2) { 1081 *(*int32)(unsafe.Pointer(X___errno_location(tls))) = 34 1082 return float64(sign) * 1.79769313486231570815e+308 * 1.79769313486231570815e+308 1083 } 1084 if lrp < int64(emin-2*53) { 1085 *(*int32)(unsafe.Pointer(X___errno_location(tls))) = 34 1086 return float64(sign) * 2.22507385850720138309e-308 * 2.22507385850720138309e-308 1087 } 1088 1089 // Align incomplete final B1B digit 1090 if j != 0 { 1091 for ; j < 9; j++ { 1092 *(*uint32_t)(unsafe.Pointer(bp + uintptr(k)*4)) *= uint32_t(10) 1093 } 1094 k++ 1095 j = 0 1096 } 1097 1098 a = 0 1099 z = k 1100 e2 = 0 1101 rp = int32(lrp) 1102 1103 // Optimize small to mid-size integers (even in exp. notation) 1104 if lnz < 9 && lnz <= rp && rp < 18 { 1105 if rp == 9 { 1106 return float64(sign) * float64(*(*uint32_t)(unsafe.Pointer(bp))) 1107 } 1108 if rp < 9 { 1109 return float64(sign) * float64(*(*uint32_t)(unsafe.Pointer(bp))) / float64(_sp10s[8-rp]) 1110 } 1111 var bitlim int32 = bits - 3*(rp-9) 1112 if bitlim > 30 || *(*uint32_t)(unsafe.Pointer(bp))>>bitlim == uint32_t(0) { 1113 return float64(sign) * float64(*(*uint32_t)(unsafe.Pointer(bp))) * float64(_sp10s[rp-10]) 1114 } 1115 } 1116 1117 // Drop trailing zeros 1118 for ; !(int32(*(*uint32_t)(unsafe.Pointer(bp + uintptr(z-1)*4))) != 0); z-- { 1119 } 1120 1121 // Align radix point to B1B digit boundary 1122 if rp%9 != 0 { 1123 var rpm9 int32 1124 if rp >= 0 { 1125 rpm9 = rp % 9 1126 } else { 1127 rpm9 = rp%9 + 9 1128 } 1129 var p10 int32 = _sp10s[8-rpm9] 1130 var carry uint32_t = uint32_t(0) 1131 for k = a; k != z; k++ { 1132 var tmp uint32_t = *(*uint32_t)(unsafe.Pointer(bp + uintptr(k)*4)) % uint32_t(p10) 1133 *(*uint32_t)(unsafe.Pointer(bp + uintptr(k)*4)) = *(*uint32_t)(unsafe.Pointer(bp + uintptr(k)*4))/uint32_t(p10) + carry 1134 carry = uint32_t(1000000000/p10) * tmp 1135 if k == a && !(int32(*(*uint32_t)(unsafe.Pointer(bp + uintptr(k)*4))) != 0) { 1136 a = (a + 1) & (128 - 1) 1137 rp = rp - 9 1138 } 1139 } 1140 if carry != 0 { 1141 *(*uint32_t)(unsafe.Pointer(bp + uintptr(PostIncInt32(&z, 1))*4)) = carry 1142 } 1143 rp = rp + (9 - rpm9) 1144 } 1145 1146 // Upscale until desired number of bits are left of radix point 1147 for rp < 9*2 || rp == 9*2 && *(*uint32_t)(unsafe.Pointer(bp + uintptr(a)*4)) < _sth[0] { 1148 var carry uint32_t = uint32_t(0) 1149 e2 = e2 - 29 1150 for k = (z - 1) & (128 - 1); ; k = (k - 1) & (128 - 1) { 1151 var tmp uint64_t = uint64_t(*(*uint32_t)(unsafe.Pointer(bp + uintptr(k)*4)))<<29 + uint64_t(carry) 1152 if tmp > uint64(1000000000) { 1153 carry = uint32_t(tmp / uint64(1000000000)) 1154 *(*uint32_t)(unsafe.Pointer(bp + uintptr(k)*4)) = uint32_t(tmp % uint64(1000000000)) 1155 } else { 1156 carry = uint32_t(0) 1157 *(*uint32_t)(unsafe.Pointer(bp + uintptr(k)*4)) = uint32_t(tmp) 1158 } 1159 if k == (z-1)&(128-1) && k != a && !(int32(*(*uint32_t)(unsafe.Pointer(bp + uintptr(k)*4))) != 0) { 1160 z = k 1161 } 1162 if k == a { 1163 break 1164 } 1165 } 1166 if carry != 0 { 1167 rp = rp + 9 1168 a = (a - 1) & (128 - 1) 1169 if a == z { 1170 z = (z - 1) & (128 - 1) 1171 *(*uint32_t)(unsafe.Pointer(bp + uintptr((z-1)&(128-1))*4)) |= *(*uint32_t)(unsafe.Pointer(bp + uintptr(z)*4)) 1172 } 1173 *(*uint32_t)(unsafe.Pointer(bp + uintptr(a)*4)) = carry 1174 } 1175 } 1176 1177 // Downscale until exactly number of bits are left of radix point 1178 for { 1179 var carry uint32_t = uint32_t(0) 1180 var sh int32 = 1 1181 for i = 0; i < 2; i++ { 1182 k = (a + i) & (128 - 1) 1183 if k == z || *(*uint32_t)(unsafe.Pointer(bp + uintptr(k)*4)) < _sth[i] { 1184 i = 2 1185 break 1186 } 1187 if *(*uint32_t)(unsafe.Pointer(bp + uintptr((a+i)&(128-1))*4)) > _sth[i] { 1188 break 1189 } 1190 } 1191 if i == 2 && rp == 9*2 { 1192 break 1193 } 1194 // FIXME: find a way to compute optimal sh 1195 if rp > 9+9*2 { 1196 sh = 9 1197 } 1198 e2 = e2 + sh 1199 for k = a; k != z; k = (k + 1) & (128 - 1) { 1200 var tmp uint32_t = *(*uint32_t)(unsafe.Pointer(bp + uintptr(k)*4)) & uint32_t(int32(1)<<sh-1) 1201 *(*uint32_t)(unsafe.Pointer(bp + uintptr(k)*4)) = *(*uint32_t)(unsafe.Pointer(bp + uintptr(k)*4))>>sh + carry 1202 carry = uint32_t(int32(1000000000)>>sh) * tmp 1203 if k == a && !(int32(*(*uint32_t)(unsafe.Pointer(bp + uintptr(k)*4))) != 0) { 1204 a = (a + 1) & (128 - 1) 1205 i-- 1206 rp = rp - 9 1207 } 1208 } 1209 if carry != 0 { 1210 if (z+1)&(128-1) != a { 1211 *(*uint32_t)(unsafe.Pointer(bp + uintptr(z)*4)) = carry 1212 z = (z + 1) & (128 - 1) 1213 } else { 1214 *(*uint32_t)(unsafe.Pointer(bp + uintptr((z-1)&(128-1))*4)) |= uint32_t(1) 1215 } 1216 } 1217 } 1218 1219 // Assemble desired bits into floating point variable 1220 for y = float64(AssignInt32(&i, 0)); i < 2; i++ { 1221 if (a+i)&(128-1) == z { 1222 *(*uint32_t)(unsafe.Pointer(bp + uintptr(AssignInt32(&z, (z+1)&(128-1))-1)*4)) = uint32_t(0) 1223 } 1224 y = 1000000000.0*y + float64(*(*uint32_t)(unsafe.Pointer(bp + uintptr((a+i)&(128-1))*4))) 1225 } 1226 1227 y = y * float64(sign) 1228 1229 // Limit precision for denormal results 1230 if bits > 53+e2-emin { 1231 bits = 53 + e2 - emin 1232 if bits < 0 { 1233 bits = 0 1234 } 1235 denormal = 1 1236 } 1237 1238 // Calculate bias term to force rounding, move out lower bits 1239 if bits < 53 { 1240 bias = Xcopysignl(tls, Xscalbn(tls, float64(1), 2*53-bits-1), y) 1241 frac = Xfmodl(tls, y, Xscalbn(tls, float64(1), 53-bits)) 1242 y = y - frac 1243 y = y + bias 1244 } 1245 1246 // Process tail of decimal input so it can affect rounding 1247 if (a+i)&(128-1) != z { 1248 var t uint32_t = *(*uint32_t)(unsafe.Pointer(bp + uintptr((a+i)&(128-1))*4)) 1249 if t < uint32_t(500000000) && (t != 0 || (a+i+1)&(128-1) != z) { 1250 frac = frac + 0.25*float64(sign) 1251 } else if t > uint32_t(500000000) { 1252 frac = frac + 0.75*float64(sign) 1253 } else if t == uint32_t(500000000) { 1254 if (a+i+1)&(128-1) == z { 1255 frac = frac + 0.5*float64(sign) 1256 } else { 1257 frac = frac + 0.75*float64(sign) 1258 } 1259 } 1260 if 53-bits >= 2 && !(Xfmodl(tls, frac, float64(1)) != 0) { 1261 frac += 1 1262 } 1263 } 1264 1265 y = y + frac 1266 y = y - bias 1267 1268 if (e2+53)&0x7fffffff > emax-5 { 1269 if Xfabsl(tls, y) >= float64(float64(2))/2.22044604925031308085e-16 { 1270 if denormal != 0 && bits == 53+e2-emin { 1271 denormal = 0 1272 } 1273 y = y * 0.5 1274 e2++ 1275 } 1276 if e2+53 > emax || denormal != 0 && frac != 0 { 1277 *(*int32)(unsafe.Pointer(X___errno_location(tls))) = 34 1278 } 1279 } 1280 1281 return Xscalbnl(tls, y, e2) 1282 } 1283 1284 var _sth = [2]uint32_t{uint32_t(9007199), uint32_t(254740991)} /* floatscan.c:67:24 */ 1285 var _sp10s = [8]int32{10, 100, 1000, 10000, 1286 100000, 1000000, 10000000, 100000000} /* floatscan.c:80:19 */ 1287 1288 func hexfloat(tls *TLS, f uintptr, bits int32, emin int32, sign int32, pok int32) float64 { /* floatscan.c:315:20: */ 1289 var x uint32_t = uint32_t(0) 1290 var y float64 = float64(0) 1291 var scale float64 = float64(1) 1292 var bias float64 = float64(0) 1293 var gottail int32 = 0 1294 var gotrad int32 = 0 1295 var gotdig int32 = 0 1296 var rp int64 = int64(0) 1297 var dc int64 = int64(0) 1298 var e2 int64 = int64(0) 1299 var d int32 1300 var c int32 1301 1302 c = func() int32 { 1303 if (*FILE)(unsafe.Pointer(f)).Frpos != (*FILE)(unsafe.Pointer(f)).Fshend { 1304 return int32(*(*uint8)(unsafe.Pointer(PostIncUintptr(&(*FILE)(unsafe.Pointer(f)).Frpos, 1)))) 1305 } 1306 return X__shgetc(tls, f) 1307 }() 1308 1309 // Skip leading zeros 1310 for ; c == '0'; c = func() int32 { 1311 if (*FILE)(unsafe.Pointer(f)).Frpos != (*FILE)(unsafe.Pointer(f)).Fshend { 1312 return int32(*(*uint8)(unsafe.Pointer(PostIncUintptr(&(*FILE)(unsafe.Pointer(f)).Frpos, 1)))) 1313 } 1314 return X__shgetc(tls, f) 1315 }() { 1316 gotdig = 1 1317 } 1318 1319 if c == '.' { 1320 gotrad = 1 1321 c = func() int32 { 1322 if (*FILE)(unsafe.Pointer(f)).Frpos != (*FILE)(unsafe.Pointer(f)).Fshend { 1323 return int32(*(*uint8)(unsafe.Pointer(PostIncUintptr(&(*FILE)(unsafe.Pointer(f)).Frpos, 1)))) 1324 } 1325 return X__shgetc(tls, f) 1326 }() 1327 // Count zeros after the radix point before significand 1328 rp = int64(0) 1329 __1: 1330 if !(c == '0') { 1331 goto __3 1332 } 1333 gotdig = 1 1334 goto __2 1335 __2: 1336 c = func() int32 { 1337 if (*FILE)(unsafe.Pointer(f)).Frpos != (*FILE)(unsafe.Pointer(f)).Fshend { 1338 return int32(*(*uint8)(unsafe.Pointer(PostIncUintptr(&(*FILE)(unsafe.Pointer(f)).Frpos, 1)))) 1339 } 1340 return X__shgetc(tls, f) 1341 }() 1342 rp-- 1343 goto __1 1344 goto __3 1345 __3: 1346 } 1347 1348 for ; uint32(c-'0') < 10 || uint32(c|32-'a') < 6 || c == '.'; c = func() int32 { 1349 if (*FILE)(unsafe.Pointer(f)).Frpos != (*FILE)(unsafe.Pointer(f)).Fshend { 1350 return int32(*(*uint8)(unsafe.Pointer(PostIncUintptr(&(*FILE)(unsafe.Pointer(f)).Frpos, 1)))) 1351 } 1352 return X__shgetc(tls, f) 1353 }() { 1354 if c == '.' { 1355 if gotrad != 0 { 1356 break 1357 } 1358 rp = dc 1359 gotrad = 1 1360 } else { 1361 gotdig = 1 1362 if c > '9' { 1363 d = c | 32 + 10 - 'a' 1364 } else { 1365 d = c - '0' 1366 } 1367 if dc < int64(8) { 1368 x = x*uint32_t(16) + uint32_t(d) 1369 } else if dc < int64(53/4+1) { 1370 y = y + float64(d)*AssignDivFloat64(&scale, float64(16)) 1371 } else if d != 0 && !(gottail != 0) { 1372 y = y + 0.5*scale 1373 gottail = 1 1374 } 1375 dc++ 1376 } 1377 } 1378 if !(gotdig != 0) { 1379 if (*FILE)(unsafe.Pointer(f)).Fshlim >= int64(0) { 1380 (*FILE)(unsafe.Pointer(f)).Frpos-- 1381 } else { 1382 } 1383 if pok != 0 { 1384 if (*FILE)(unsafe.Pointer(f)).Fshlim >= int64(0) { 1385 (*FILE)(unsafe.Pointer(f)).Frpos-- 1386 } else { 1387 } 1388 if gotrad != 0 { 1389 if (*FILE)(unsafe.Pointer(f)).Fshlim >= int64(0) { 1390 (*FILE)(unsafe.Pointer(f)).Frpos-- 1391 } else { 1392 } 1393 } 1394 } else { 1395 X__shlim(tls, f, int64(0)) 1396 } 1397 return float64(sign) * 0.0 1398 } 1399 if !(gotrad != 0) { 1400 rp = dc 1401 } 1402 for dc < int64(8) { 1403 x = x * uint32_t(16) 1404 dc++ 1405 } 1406 if c|32 == 'p' { 1407 e2 = scanexp(tls, f, pok) 1408 if e2 == -0x7fffffffffffffff-int64(1) { 1409 if pok != 0 { 1410 if (*FILE)(unsafe.Pointer(f)).Fshlim >= int64(0) { 1411 (*FILE)(unsafe.Pointer(f)).Frpos-- 1412 } else { 1413 } 1414 } else { 1415 X__shlim(tls, f, int64(0)) 1416 return float64(0) 1417 } 1418 e2 = int64(0) 1419 } 1420 } else { 1421 if (*FILE)(unsafe.Pointer(f)).Fshlim >= int64(0) { 1422 (*FILE)(unsafe.Pointer(f)).Frpos-- 1423 } else { 1424 } 1425 } 1426 e2 = e2 + (int64(4)*rp - int64(32)) 1427 1428 if !(x != 0) { 1429 return float64(sign) * 0.0 1430 } 1431 if e2 > int64(-emin) { 1432 *(*int32)(unsafe.Pointer(X___errno_location(tls))) = 34 1433 return float64(sign) * 1.79769313486231570815e+308 * 1.79769313486231570815e+308 1434 } 1435 if e2 < int64(emin-2*53) { 1436 *(*int32)(unsafe.Pointer(X___errno_location(tls))) = 34 1437 return float64(sign) * 2.22507385850720138309e-308 * 2.22507385850720138309e-308 1438 } 1439 1440 for x < 0x80000000 { 1441 if y >= 0.5 { 1442 x = x + (x + uint32_t(1)) 1443 y = y + (y - float64(1)) 1444 } else { 1445 x = x + x 1446 y = y + y 1447 } 1448 e2-- 1449 } 1450 1451 if int64(bits) > int64(32)+e2-int64(emin) { 1452 bits = int32(int64(32) + e2 - int64(emin)) 1453 if bits < 0 { 1454 bits = 0 1455 } 1456 } 1457 1458 if bits < 53 { 1459 bias = Xcopysignl(tls, Xscalbn(tls, float64(1), 32+53-bits-1), float64(sign)) 1460 } 1461 1462 if bits < 32 && y != 0 && !(x&uint32_t(1) != 0) { 1463 x++ 1464 y = float64(0) 1465 } 1466 1467 y = bias + float64(sign)*float64(x) + float64(sign)*y 1468 y = y - bias 1469 1470 if !(y != 0) { 1471 *(*int32)(unsafe.Pointer(X___errno_location(tls))) = 34 1472 } 1473 1474 return Xscalbnl(tls, y, int32(e2)) 1475 } 1476 1477 func X__floatscan(tls *TLS, f uintptr, prec int32, pok int32) float64 { /* floatscan.c:427:13: */ 1478 var sign int32 = 1 1479 var i size_t 1480 var bits int32 1481 var emin int32 1482 var c int32 1483 1484 switch prec { 1485 case 0: 1486 bits = 24 1487 emin = -125 - bits 1488 break 1489 case 1: 1490 bits = 53 1491 emin = -1021 - bits 1492 break 1493 case 2: 1494 bits = 53 1495 emin = -1021 - bits 1496 break 1497 default: 1498 return float64(0) 1499 } 1500 1501 for __isspace(tls, AssignInt32(&c, func() int32 { 1502 if (*FILE)(unsafe.Pointer(f)).Frpos != (*FILE)(unsafe.Pointer(f)).Fshend { 1503 return int32(*(*uint8)(unsafe.Pointer(PostIncUintptr(&(*FILE)(unsafe.Pointer(f)).Frpos, 1)))) 1504 } 1505 return X__shgetc(tls, f) 1506 }())) != 0 { 1507 } 1508 1509 if c == '+' || c == '-' { 1510 sign = sign - 2*Bool32(c == '-') 1511 c = func() int32 { 1512 if (*FILE)(unsafe.Pointer(f)).Frpos != (*FILE)(unsafe.Pointer(f)).Fshend { 1513 return int32(*(*uint8)(unsafe.Pointer(PostIncUintptr(&(*FILE)(unsafe.Pointer(f)).Frpos, 1)))) 1514 } 1515 return X__shgetc(tls, f) 1516 }() 1517 } 1518 1519 for i = size_t(0); i < size_t(8) && c|32 == int32(*(*int8)(unsafe.Pointer(ts /* "infinity" */ + uintptr(i)))); i++ { 1520 if i < size_t(7) { 1521 c = func() int32 { 1522 if (*FILE)(unsafe.Pointer(f)).Frpos != (*FILE)(unsafe.Pointer(f)).Fshend { 1523 return int32(*(*uint8)(unsafe.Pointer(PostIncUintptr(&(*FILE)(unsafe.Pointer(f)).Frpos, 1)))) 1524 } 1525 return X__shgetc(tls, f) 1526 }() 1527 } 1528 } 1529 if i == size_t(3) || i == size_t(8) || i > size_t(3) && pok != 0 { 1530 if i != size_t(8) { 1531 if (*FILE)(unsafe.Pointer(f)).Fshlim >= int64(0) { 1532 (*FILE)(unsafe.Pointer(f)).Frpos-- 1533 } else { 1534 } 1535 if pok != 0 { 1536 for ; i > size_t(3); i-- { 1537 if (*FILE)(unsafe.Pointer(f)).Fshlim >= int64(0) { 1538 (*FILE)(unsafe.Pointer(f)).Frpos-- 1539 } else { 1540 } 1541 } 1542 } 1543 } 1544 return float64(float32(sign) * X__builtin_inff(tls)) 1545 } 1546 if !(i != 0) { 1547 for i = size_t(0); i < size_t(3) && c|32 == int32(*(*int8)(unsafe.Pointer(ts + 9 /* "nan" */ + uintptr(i)))); i++ { 1548 if i < size_t(2) { 1549 c = func() int32 { 1550 if (*FILE)(unsafe.Pointer(f)).Frpos != (*FILE)(unsafe.Pointer(f)).Fshend { 1551 return int32(*(*uint8)(unsafe.Pointer(PostIncUintptr(&(*FILE)(unsafe.Pointer(f)).Frpos, 1)))) 1552 } 1553 return X__shgetc(tls, f) 1554 }() 1555 } 1556 } 1557 } 1558 if i == size_t(3) { 1559 if func() int32 { 1560 if (*FILE)(unsafe.Pointer(f)).Frpos != (*FILE)(unsafe.Pointer(f)).Fshend { 1561 return int32(*(*uint8)(unsafe.Pointer(PostIncUintptr(&(*FILE)(unsafe.Pointer(f)).Frpos, 1)))) 1562 } 1563 return X__shgetc(tls, f) 1564 }() != '(' { 1565 if (*FILE)(unsafe.Pointer(f)).Fshlim >= int64(0) { 1566 (*FILE)(unsafe.Pointer(f)).Frpos-- 1567 } else { 1568 } 1569 return float64(X__builtin_nanf(tls, ts+13)) 1570 } 1571 for i = size_t(1); ; i++ { 1572 c = func() int32 { 1573 if (*FILE)(unsafe.Pointer(f)).Frpos != (*FILE)(unsafe.Pointer(f)).Fshend { 1574 return int32(*(*uint8)(unsafe.Pointer(PostIncUintptr(&(*FILE)(unsafe.Pointer(f)).Frpos, 1)))) 1575 } 1576 return X__shgetc(tls, f) 1577 }() 1578 if uint32(c-'0') < 10 || uint32(c-'A') < 26 || uint32(c-'a') < 26 || c == '_' { 1579 continue 1580 } 1581 if c == ')' { 1582 return float64(X__builtin_nanf(tls, ts+13)) 1583 } 1584 if (*FILE)(unsafe.Pointer(f)).Fshlim >= int64(0) { 1585 (*FILE)(unsafe.Pointer(f)).Frpos-- 1586 } else { 1587 } 1588 if !(pok != 0) { 1589 *(*int32)(unsafe.Pointer(X___errno_location(tls))) = 22 1590 X__shlim(tls, f, int64(0)) 1591 return float64(0) 1592 } 1593 for PostDecUint32(&i, 1) != 0 { 1594 if (*FILE)(unsafe.Pointer(f)).Fshlim >= int64(0) { 1595 (*FILE)(unsafe.Pointer(f)).Frpos-- 1596 } else { 1597 } 1598 } 1599 return float64(X__builtin_nanf(tls, ts+13)) 1600 } 1601 return float64(X__builtin_nanf(tls, ts+13)) 1602 } 1603 1604 if i != 0 { 1605 if (*FILE)(unsafe.Pointer(f)).Fshlim >= int64(0) { 1606 (*FILE)(unsafe.Pointer(f)).Frpos-- 1607 } else { 1608 } 1609 *(*int32)(unsafe.Pointer(X___errno_location(tls))) = 22 1610 X__shlim(tls, f, int64(0)) 1611 return float64(0) 1612 } 1613 1614 if c == '0' { 1615 c = func() int32 { 1616 if (*FILE)(unsafe.Pointer(f)).Frpos != (*FILE)(unsafe.Pointer(f)).Fshend { 1617 return int32(*(*uint8)(unsafe.Pointer(PostIncUintptr(&(*FILE)(unsafe.Pointer(f)).Frpos, 1)))) 1618 } 1619 return X__shgetc(tls, f) 1620 }() 1621 if c|32 == 'x' { 1622 return hexfloat(tls, f, bits, emin, sign, pok) 1623 } 1624 if (*FILE)(unsafe.Pointer(f)).Fshlim >= int64(0) { 1625 (*FILE)(unsafe.Pointer(f)).Frpos-- 1626 } else { 1627 } 1628 c = '0' 1629 } 1630 1631 return decfloat(tls, f, c, bits, emin, sign, pok) 1632 } 1633 1634 // Lookup table for digit values. -1==255>=36 -> invalid 1635 var table = [257]uint8{Uint8FromInt32(-1), 1636 Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), 1637 Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), 1638 Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), 1639 uint8(0), uint8(1), uint8(2), uint8(3), uint8(4), uint8(5), uint8(6), uint8(7), uint8(8), uint8(9), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), 1640 Uint8FromInt32(-1), uint8(10), uint8(11), uint8(12), uint8(13), uint8(14), uint8(15), uint8(16), uint8(17), uint8(18), uint8(19), uint8(20), uint8(21), uint8(22), uint8(23), uint8(24), 1641 uint8(25), uint8(26), uint8(27), uint8(28), uint8(29), uint8(30), uint8(31), uint8(32), uint8(33), uint8(34), uint8(35), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), 1642 Uint8FromInt32(-1), uint8(10), uint8(11), uint8(12), uint8(13), uint8(14), uint8(15), uint8(16), uint8(17), uint8(18), uint8(19), uint8(20), uint8(21), uint8(22), uint8(23), uint8(24), 1643 uint8(25), uint8(26), uint8(27), uint8(28), uint8(29), uint8(30), uint8(31), uint8(32), uint8(33), uint8(34), uint8(35), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), 1644 Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), 1645 Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), 1646 Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), 1647 Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), 1648 Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), 1649 Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), 1650 Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), 1651 Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), Uint8FromInt32(-1), 1652 } /* intscan.c:7:28 */ 1653 1654 func X__intscan(tls *TLS, f uintptr, base uint32, pok int32, lim uint64) uint64 { /* intscan.c:26:20: */ 1655 var val uintptr 1656 var c int32 1657 var neg int32 1658 var x uint32 1659 var y uint64 1660 var bs int32 1661 val = uintptr(unsafe.Pointer(&table)) + uintptr(1) 1662 neg = 0 1663 if !(base > uint32(36) || base == uint32(1)) { 1664 goto __1 1665 } 1666 *(*int32)(unsafe.Pointer(X___errno_location(tls))) = 22 1667 return uint64(0) 1668 __1: 1669 ; 1670 __2: 1671 if !(__isspace(tls, AssignInt32(&c, func() int32 { 1672 if (*FILE)(unsafe.Pointer(f)).Frpos != (*FILE)(unsafe.Pointer(f)).Fshend { 1673 return int32(*(*uint8)(unsafe.Pointer(PostIncUintptr(&(*FILE)(unsafe.Pointer(f)).Frpos, 1)))) 1674 } 1675 return X__shgetc(tls, f) 1676 }())) != 0) { 1677 goto __3 1678 } 1679 goto __2 1680 __3: 1681 ; 1682 if !(c == '+' || c == '-') { 1683 goto __4 1684 } 1685 neg = -Bool32(c == '-') 1686 c = func() int32 { 1687 if (*FILE)(unsafe.Pointer(f)).Frpos != (*FILE)(unsafe.Pointer(f)).Fshend { 1688 return int32(*(*uint8)(unsafe.Pointer(PostIncUintptr(&(*FILE)(unsafe.Pointer(f)).Frpos, 1)))) 1689 } 1690 return X__shgetc(tls, f) 1691 }() 1692 __4: 1693 ; 1694 if !((base == uint32(0) || base == uint32(16)) && c == '0') { 1695 goto __5 1696 } 1697 c = func() int32 { 1698 if (*FILE)(unsafe.Pointer(f)).Frpos != (*FILE)(unsafe.Pointer(f)).Fshend { 1699 return int32(*(*uint8)(unsafe.Pointer(PostIncUintptr(&(*FILE)(unsafe.Pointer(f)).Frpos, 1)))) 1700 } 1701 return X__shgetc(tls, f) 1702 }() 1703 if !(c|32 == 'x') { 1704 goto __7 1705 } 1706 c = func() int32 { 1707 if (*FILE)(unsafe.Pointer(f)).Frpos != (*FILE)(unsafe.Pointer(f)).Fshend { 1708 return int32(*(*uint8)(unsafe.Pointer(PostIncUintptr(&(*FILE)(unsafe.Pointer(f)).Frpos, 1)))) 1709 } 1710 return X__shgetc(tls, f) 1711 }() 1712 if !(int32(*(*uint8)(unsafe.Pointer(val + uintptr(c)))) >= 16) { 1713 goto __9 1714 } 1715 if (*FILE)(unsafe.Pointer(f)).Fshlim >= int64(0) { 1716 (*FILE)(unsafe.Pointer(f)).Frpos-- 1717 } else { 1718 } 1719 if !(pok != 0) { 1720 goto __10 1721 } 1722 if (*FILE)(unsafe.Pointer(f)).Fshlim >= int64(0) { 1723 (*FILE)(unsafe.Pointer(f)).Frpos-- 1724 } else { 1725 } 1726 goto __11 1727 __10: 1728 X__shlim(tls, f, int64(0)) 1729 __11: 1730 ; 1731 return uint64(0) 1732 __9: 1733 ; 1734 base = uint32(16) 1735 goto __8 1736 __7: 1737 if !(base == uint32(0)) { 1738 goto __12 1739 } 1740 base = uint32(8) 1741 __12: 1742 ; 1743 __8: 1744 ; 1745 goto __6 1746 __5: 1747 if !(base == uint32(0)) { 1748 goto __13 1749 } 1750 base = uint32(10) 1751 __13: 1752 ; 1753 if !(uint32(*(*uint8)(unsafe.Pointer(val + uintptr(c)))) >= base) { 1754 goto __14 1755 } 1756 if (*FILE)(unsafe.Pointer(f)).Fshlim >= int64(0) { 1757 (*FILE)(unsafe.Pointer(f)).Frpos-- 1758 } else { 1759 } 1760 X__shlim(tls, f, int64(0)) 1761 *(*int32)(unsafe.Pointer(X___errno_location(tls))) = 22 1762 return uint64(0) 1763 __14: 1764 ; 1765 __6: 1766 ; 1767 if !(base == uint32(10)) { 1768 goto __15 1769 } 1770 x = uint32(0) 1771 __17: 1772 if !(uint32(c-'0') < 10 && x <= 0xffffffff/uint32(10)-uint32(1)) { 1773 goto __19 1774 } 1775 x = x*uint32(10) + uint32(c-'0') 1776 goto __18 1777 __18: 1778 c = func() int32 { 1779 if (*FILE)(unsafe.Pointer(f)).Frpos != (*FILE)(unsafe.Pointer(f)).Fshend { 1780 return int32(*(*uint8)(unsafe.Pointer(PostIncUintptr(&(*FILE)(unsafe.Pointer(f)).Frpos, 1)))) 1781 } 1782 return X__shgetc(tls, f) 1783 }() 1784 goto __17 1785 goto __19 1786 __19: 1787 ; 1788 y = uint64(x) 1789 __20: 1790 if !(uint32(c-'0') < 10 && y <= (2*uint64(0x7fffffffffffffff)+uint64(1))/uint64(10) && uint64(10)*y <= 2*uint64(0x7fffffffffffffff)+uint64(1)-uint64(c-'0')) { 1791 goto __22 1792 } 1793 y = y*uint64(10) + uint64(c-'0') 1794 goto __21 1795 __21: 1796 c = func() int32 { 1797 if (*FILE)(unsafe.Pointer(f)).Frpos != (*FILE)(unsafe.Pointer(f)).Fshend { 1798 return int32(*(*uint8)(unsafe.Pointer(PostIncUintptr(&(*FILE)(unsafe.Pointer(f)).Frpos, 1)))) 1799 } 1800 return X__shgetc(tls, f) 1801 }() 1802 goto __20 1803 goto __22 1804 __22: 1805 ; 1806 if !(uint32(c-'0') >= 10) { 1807 goto __23 1808 } 1809 goto done 1810 __23: 1811 ; 1812 goto __16 1813 __15: 1814 if !!(base&(base-uint32(1)) != 0) { 1815 goto __24 1816 } 1817 bs = int32(*(*int8)(unsafe.Pointer(ts + 14 + uintptr(uint32(0x17)*base>>5&uint32(7))))) 1818 x = uint32(0) 1819 __26: 1820 if !(uint32(*(*uint8)(unsafe.Pointer(val + uintptr(c)))) < base && x <= 0xffffffff/uint32(32)) { 1821 goto __28 1822 } 1823 x = x<<bs | uint32(*(*uint8)(unsafe.Pointer(val + uintptr(c)))) 1824 goto __27 1825 __27: 1826 c = func() int32 { 1827 if (*FILE)(unsafe.Pointer(f)).Frpos != (*FILE)(unsafe.Pointer(f)).Fshend { 1828 return int32(*(*uint8)(unsafe.Pointer(PostIncUintptr(&(*FILE)(unsafe.Pointer(f)).Frpos, 1)))) 1829 } 1830 return X__shgetc(tls, f) 1831 }() 1832 goto __26 1833 goto __28 1834 __28: 1835 ; 1836 y = uint64(x) 1837 __29: 1838 if !(uint32(*(*uint8)(unsafe.Pointer(val + uintptr(c)))) < base && y <= uint64(2*uint64(0x7fffffffffffffff)+uint64(1))>>bs) { 1839 goto __31 1840 } 1841 y = y<<bs | uint64(*(*uint8)(unsafe.Pointer(val + uintptr(c)))) 1842 goto __30 1843 __30: 1844 c = func() int32 { 1845 if (*FILE)(unsafe.Pointer(f)).Frpos != (*FILE)(unsafe.Pointer(f)).Fshend { 1846 return int32(*(*uint8)(unsafe.Pointer(PostIncUintptr(&(*FILE)(unsafe.Pointer(f)).Frpos, 1)))) 1847 } 1848 return X__shgetc(tls, f) 1849 }() 1850 goto __29 1851 goto __31 1852 __31: 1853 ; 1854 goto __25 1855 __24: 1856 x = uint32(0) 1857 __32: 1858 if !(uint32(*(*uint8)(unsafe.Pointer(val + uintptr(c)))) < base && x <= 0xffffffff/uint32(36)-uint32(1)) { 1859 goto __34 1860 } 1861 x = x*base + uint32(*(*uint8)(unsafe.Pointer(val + uintptr(c)))) 1862 goto __33 1863 __33: 1864 c = func() int32 { 1865 if (*FILE)(unsafe.Pointer(f)).Frpos != (*FILE)(unsafe.Pointer(f)).Fshend { 1866 return int32(*(*uint8)(unsafe.Pointer(PostIncUintptr(&(*FILE)(unsafe.Pointer(f)).Frpos, 1)))) 1867 } 1868 return X__shgetc(tls, f) 1869 }() 1870 goto __32 1871 goto __34 1872 __34: 1873 ; 1874 y = uint64(x) 1875 __35: 1876 if !(uint32(*(*uint8)(unsafe.Pointer(val + uintptr(c)))) < base && y <= (2*uint64(0x7fffffffffffffff)+uint64(1))/uint64(base) && uint64(base)*y <= 2*uint64(0x7fffffffffffffff)+uint64(1)-uint64(*(*uint8)(unsafe.Pointer(val + uintptr(c))))) { 1877 goto __37 1878 } 1879 y = y*uint64(base) + uint64(*(*uint8)(unsafe.Pointer(val + uintptr(c)))) 1880 goto __36 1881 __36: 1882 c = func() int32 { 1883 if (*FILE)(unsafe.Pointer(f)).Frpos != (*FILE)(unsafe.Pointer(f)).Fshend { 1884 return int32(*(*uint8)(unsafe.Pointer(PostIncUintptr(&(*FILE)(unsafe.Pointer(f)).Frpos, 1)))) 1885 } 1886 return X__shgetc(tls, f) 1887 }() 1888 goto __35 1889 goto __37 1890 __37: 1891 ; 1892 __25: 1893 ; 1894 __16: 1895 ; 1896 if !(uint32(*(*uint8)(unsafe.Pointer(val + uintptr(c)))) < base) { 1897 goto __38 1898 } 1899 __39: 1900 if !(uint32(*(*uint8)(unsafe.Pointer(val + uintptr(c)))) < base) { 1901 goto __41 1902 } 1903 goto __40 1904 __40: 1905 c = func() int32 { 1906 if (*FILE)(unsafe.Pointer(f)).Frpos != (*FILE)(unsafe.Pointer(f)).Fshend { 1907 return int32(*(*uint8)(unsafe.Pointer(PostIncUintptr(&(*FILE)(unsafe.Pointer(f)).Frpos, 1)))) 1908 } 1909 return X__shgetc(tls, f) 1910 }() 1911 goto __39 1912 goto __41 1913 __41: 1914 ; 1915 *(*int32)(unsafe.Pointer(X___errno_location(tls))) = 34 1916 y = lim 1917 if !(lim&uint64(1) != 0) { 1918 goto __42 1919 } 1920 neg = 0 1921 __42: 1922 ; 1923 __38: 1924 ; 1925 done: 1926 if (*FILE)(unsafe.Pointer(f)).Fshlim >= int64(0) { 1927 (*FILE)(unsafe.Pointer(f)).Frpos-- 1928 } else { 1929 } 1930 if !(y >= lim) { 1931 goto __43 1932 } 1933 if !(!(lim&uint64(1) != 0) && !(neg != 0)) { 1934 goto __44 1935 } 1936 *(*int32)(unsafe.Pointer(X___errno_location(tls))) = 34 1937 return lim - uint64(1) 1938 goto __45 1939 __44: 1940 if !(y > lim) { 1941 goto __46 1942 } 1943 *(*int32)(unsafe.Pointer(X___errno_location(tls))) = 34 1944 return lim 1945 __46: 1946 ; 1947 __45: 1948 ; 1949 __43: 1950 ; 1951 return y ^ uint64(neg) - uint64(neg) 1952 } 1953 1954 // The shcnt field stores the number of bytes read so far, offset by 1955 // the value of buf-rpos at the last function call (__shlim or __shgetc), 1956 // so that between calls the inline shcnt macro can add rpos-buf to get 1957 // the actual count. 1958 1959 func X__shlim(tls *TLS, f uintptr, lim off_t) { /* shgetc.c:8:6: */ 1960 (*FILE)(unsafe.Pointer(f)).Fshlim = lim 1961 (*FILE)(unsafe.Pointer(f)).Fshcnt = off_t((int32((*FILE)(unsafe.Pointer(f)).Fbuf) - int32((*FILE)(unsafe.Pointer(f)).Frpos)) / 1) 1962 // If lim is nonzero, rend must be a valid pointer. 1963 if lim != 0 && off_t((int32((*FILE)(unsafe.Pointer(f)).Frend)-int32((*FILE)(unsafe.Pointer(f)).Frpos))/1) > lim { 1964 (*FILE)(unsafe.Pointer(f)).Fshend = (*FILE)(unsafe.Pointer(f)).Frpos + uintptr(lim) 1965 } else { 1966 (*FILE)(unsafe.Pointer(f)).Fshend = (*FILE)(unsafe.Pointer(f)).Frend 1967 } 1968 } 1969 1970 func X__shgetc(tls *TLS, f uintptr) int32 { /* shgetc.c:19:5: */ 1971 var c int32 1972 var cnt off_t = (*FILE)(unsafe.Pointer(f)).Fshcnt + off_t((int32((*FILE)(unsafe.Pointer(f)).Frpos)-int32((*FILE)(unsafe.Pointer(f)).Fbuf))/1) 1973 if (*FILE)(unsafe.Pointer(f)).Fshlim != 0 && cnt >= (*FILE)(unsafe.Pointer(f)).Fshlim || AssignInt32(&c, X__uflow(tls, f)) < 0 { 1974 (*FILE)(unsafe.Pointer(f)).Fshcnt = off_t((int32((*FILE)(unsafe.Pointer(f)).Fbuf)-int32((*FILE)(unsafe.Pointer(f)).Frpos))/1) + cnt 1975 (*FILE)(unsafe.Pointer(f)).Fshend = (*FILE)(unsafe.Pointer(f)).Frpos 1976 (*FILE)(unsafe.Pointer(f)).Fshlim = int64(-1) 1977 return -1 1978 } 1979 cnt++ 1980 if (*FILE)(unsafe.Pointer(f)).Fshlim != 0 && off_t((int32((*FILE)(unsafe.Pointer(f)).Frend)-int32((*FILE)(unsafe.Pointer(f)).Frpos))/1) > (*FILE)(unsafe.Pointer(f)).Fshlim-cnt { 1981 (*FILE)(unsafe.Pointer(f)).Fshend = (*FILE)(unsafe.Pointer(f)).Frpos + uintptr((*FILE)(unsafe.Pointer(f)).Fshlim-cnt) 1982 } else { 1983 (*FILE)(unsafe.Pointer(f)).Fshend = (*FILE)(unsafe.Pointer(f)).Frend 1984 } 1985 (*FILE)(unsafe.Pointer(f)).Fshcnt = off_t((int32((*FILE)(unsafe.Pointer(f)).Fbuf)-int32((*FILE)(unsafe.Pointer(f)).Frpos))/1) + cnt 1986 if (*FILE)(unsafe.Pointer(f)).Frpos <= (*FILE)(unsafe.Pointer(f)).Fbuf { 1987 *(*uint8)(unsafe.Pointer((*FILE)(unsafe.Pointer(f)).Frpos + UintptrFromInt32(-1))) = uint8(c) 1988 } 1989 return c 1990 } 1991 1992 func __bswap32(tls *TLS, __x uint32_t) uint32_t { /* endian.h:24:26: */ 1993 return __x>>24 | __x>>8&uint32_t(0xff00) | __x<<8&uint32_t(0xff0000) | __x<<24 1994 } 1995 1996 func Xcopysignl(tls *TLS, x float64, y float64) float64 { /* copysignl.c:4:13: */ 1997 return Xcopysign(tls, x, y) 1998 } 1999 2000 func Xfabsl(tls *TLS, x float64) float64 { /* fabsl.c:3:13: */ 2001 return Xfabs(tls, x) 2002 } 2003 2004 func Xfmodl(tls *TLS, x float64, y float64) float64 { /* fmodl.c:4:13: */ 2005 return Xfmod(tls, x, y) 2006 } 2007 2008 var toint double_t = float64(float64(1)) / 2.22044604925031308085e-16 /* rint.c:10:23 */ 2009 2010 func Xrint(tls *TLS, x float64) float64 { /* rint.c:12:8: */ 2011 bp := tls.Alloc(8) 2012 defer tls.Free(8) 2013 2014 *(*struct{ Ff float64 })(unsafe.Pointer(bp)) = func() (r struct{ Ff float64 }) { 2015 *(*float64)(unsafe.Pointer(uintptr(unsafe.Pointer(&r)) + 0)) = x 2016 return r 2017 }() 2018 var e int32 = int32(*(*uint64_t)(unsafe.Pointer(bp)) >> 52 & uint64(0x7ff)) 2019 var s int32 = int32(*(*uint64_t)(unsafe.Pointer(bp)) >> 63) 2020 var y double_t 2021 2022 if e >= 0x3ff+52 { 2023 return x 2024 } 2025 if s != 0 { 2026 y = x - toint + toint 2027 } else { 2028 y = x + toint - toint 2029 } 2030 if y == float64(0) { 2031 if s != 0 { 2032 return -Float64FromFloat64(0.0) 2033 } 2034 return float64(0) 2035 } 2036 return y 2037 } 2038 2039 func Xscalbn(tls *TLS, x float64, n int32) float64 { /* scalbn.c:4:8: */ 2040 bp := tls.Alloc(8) 2041 defer tls.Free(8) 2042 2043 // var u struct {Ff float64;} at bp, 8 2044 2045 var y double_t = x 2046 2047 if n > 1023 { 2048 y = y * 0x1p1023 2049 n = n - 1023 2050 if n > 1023 { 2051 y = y * 0x1p1023 2052 n = n - 1023 2053 if n > 1023 { 2054 n = 1023 2055 } 2056 } 2057 } else if n < -1022 { 2058 // make sure final n < -53 to avoid double 2059 // rounding in the subnormal range 2060 y = y * (float64(0x1p-1022) * 0x1p53) 2061 n = n + (1022 - 53) 2062 if n < -1022 { 2063 y = y * (float64(0x1p-1022) * 0x1p53) 2064 n = n + (1022 - 53) 2065 if n < -1022 { 2066 n = -1022 2067 } 2068 } 2069 } 2070 *(*uint64_t)(unsafe.Pointer(bp)) = uint64_t(0x3ff+n) << 52 2071 x = y * *(*float64)(unsafe.Pointer(bp)) 2072 return x 2073 } 2074 2075 func Xscalbnl(tls *TLS, x float64, n int32) float64 { /* scalbnl.c:4:13: */ 2076 return Xscalbn(tls, x, n) 2077 } 2078 2079 type div_t = struct { 2080 Fquot int32 2081 Frem int32 2082 } /* stdlib.h:62:35 */ 2083 type ldiv_t = struct { 2084 Fquot int32 2085 Frem int32 2086 } /* stdlib.h:63:36 */ 2087 type lldiv_t = struct { 2088 Fquot int64 2089 Frem int64 2090 } /* stdlib.h:64:41 */ 2091 2092 type max_align_t = struct { 2093 F__ll int64 2094 F__ld float64 2095 } /* alltypes.h:51:66 */ 2096 2097 type imaxdiv_t = struct { 2098 Fquot intmax_t 2099 Frem intmax_t 2100 } /* inttypes.h:14:40 */ 2101 2102 type pid_t = int32 /* alltypes.h:258:13 */ 2103 2104 type uid_t = uint32 /* alltypes.h:268:18 */ 2105 2106 type gid_t = uint32 /* alltypes.h:273:18 */ 2107 2108 type iovec = struct { 2109 Fiov_base uintptr 2110 Fiov_len size_t 2111 } /* alltypes.h:378:1 */ 2112 2113 type socklen_t = uint32 /* alltypes.h:384:18 */ 2114 2115 type sa_family_t = uint16 /* alltypes.h:389:24 */ 2116 2117 type msghdr = struct { 2118 Fmsg_name uintptr 2119 Fmsg_namelen socklen_t 2120 Fmsg_iov uintptr 2121 Fmsg_iovlen int32 2122 Fmsg_control uintptr 2123 Fmsg_controllen socklen_t 2124 Fmsg_flags int32 2125 } /* socket.h:22:1 */ 2126 2127 type cmsghdr = struct { 2128 Fcmsg_len socklen_t 2129 Fcmsg_level int32 2130 Fcmsg_type int32 2131 } /* socket.h:44:1 */ 2132 2133 type linger = struct { 2134 Fl_onoff int32 2135 Fl_linger int32 2136 } /* socket.h:74:1 */ 2137 2138 type sockaddr = struct { 2139 Fsa_family sa_family_t 2140 Fsa_data [14]int8 2141 } /* socket.h:367:1 */ 2142 2143 type sockaddr_storage = struct { 2144 Fss_family sa_family_t 2145 F__ss_padding [122]int8 2146 F__ss_align uint32 2147 } /* socket.h:372:1 */ 2148 2149 type in_port_t = uint16_t /* in.h:12:18 */ 2150 type in_addr_t = uint32_t /* in.h:13:18 */ 2151 type in_addr = struct{ Fs_addr in_addr_t } /* in.h:14:1 */ 2152 2153 type sockaddr_in = struct { 2154 Fsin_family sa_family_t 2155 Fsin_port in_port_t 2156 Fsin_addr struct{ Fs_addr in_addr_t } 2157 Fsin_zero [8]uint8_t 2158 } /* in.h:16:1 */ 2159 2160 type in6_addr = struct { 2161 F__in6_union struct { 2162 F__ccgo_pad1 [0]uint32 2163 F__s6_addr [16]uint8_t 2164 } 2165 } /* in.h:23:1 */ 2166 2167 type sockaddr_in6 = struct { 2168 Fsin6_family sa_family_t 2169 Fsin6_port in_port_t 2170 Fsin6_flowinfo uint32_t 2171 Fsin6_addr struct { 2172 F__in6_union struct { 2173 F__ccgo_pad1 [0]uint32 2174 F__s6_addr [16]uint8_t 2175 } 2176 } 2177 Fsin6_scope_id uint32_t 2178 } /* in.h:34:1 */ 2179 2180 type ipv6_mreq = struct { 2181 Fipv6mr_multiaddr struct { 2182 F__in6_union struct { 2183 F__ccgo_pad1 [0]uint32 2184 F__s6_addr [16]uint8_t 2185 } 2186 } 2187 Fipv6mr_interface uint32 2188 } /* in.h:42:1 */ 2189 2190 type ip_opts = struct { 2191 Fip_dst struct{ Fs_addr in_addr_t } 2192 Fip_opts [40]int8 2193 } /* in.h:229:1 */ 2194 2195 type ip_mreq = struct { 2196 Fimr_multiaddr struct{ Fs_addr in_addr_t } 2197 Fimr_interface struct{ Fs_addr in_addr_t } 2198 } /* in.h:247:1 */ 2199 2200 type ip_mreqn = struct { 2201 Fimr_multiaddr struct{ Fs_addr in_addr_t } 2202 Fimr_address struct{ Fs_addr in_addr_t } 2203 Fimr_ifindex int32 2204 } /* in.h:252:1 */ 2205 2206 type ip_mreq_source = struct { 2207 Fimr_multiaddr struct{ Fs_addr in_addr_t } 2208 Fimr_interface struct{ Fs_addr in_addr_t } 2209 Fimr_sourceaddr struct{ Fs_addr in_addr_t } 2210 } /* in.h:258:1 */ 2211 2212 type ip_msfilter = struct { 2213 Fimsf_multiaddr struct{ Fs_addr in_addr_t } 2214 Fimsf_interface struct{ Fs_addr in_addr_t } 2215 Fimsf_fmode uint32_t 2216 Fimsf_numsrc uint32_t 2217 Fimsf_slist [1]struct{ Fs_addr in_addr_t } 2218 } /* in.h:264:1 */ 2219 2220 type group_req = struct { 2221 Fgr_interface uint32_t 2222 Fgr_group struct { 2223 Fss_family sa_family_t 2224 F__ss_padding [122]int8 2225 F__ss_align uint32 2226 } 2227 } /* in.h:275:1 */ 2228 2229 type group_source_req = struct { 2230 Fgsr_interface uint32_t 2231 Fgsr_group struct { 2232 Fss_family sa_family_t 2233 F__ss_padding [122]int8 2234 F__ss_align uint32 2235 } 2236 Fgsr_source struct { 2237 Fss_family sa_family_t 2238 F__ss_padding [122]int8 2239 F__ss_align uint32 2240 } 2241 } /* in.h:280:1 */ 2242 2243 type group_filter = struct { 2244 Fgf_interface uint32_t 2245 Fgf_group struct { 2246 Fss_family sa_family_t 2247 F__ss_padding [122]int8 2248 F__ss_align uint32 2249 } 2250 Fgf_fmode uint32_t 2251 Fgf_numsrc uint32_t 2252 Fgf_slist [1]struct { 2253 Fss_family sa_family_t 2254 F__ss_padding [122]int8 2255 F__ss_align uint32 2256 } 2257 } /* in.h:286:1 */ 2258 2259 type in_pktinfo = struct { 2260 Fipi_ifindex int32 2261 Fipi_spec_dst struct{ Fs_addr in_addr_t } 2262 Fipi_addr struct{ Fs_addr in_addr_t } 2263 } /* in.h:297:1 */ 2264 2265 type in6_pktinfo = struct { 2266 Fipi6_addr struct { 2267 F__in6_union struct { 2268 F__ccgo_pad1 [0]uint32 2269 F__s6_addr [16]uint8_t 2270 } 2271 } 2272 Fipi6_ifindex uint32 2273 } /* in.h:303:1 */ 2274 2275 type ip6_mtuinfo = struct { 2276 Fip6m_addr struct { 2277 Fsin6_family sa_family_t 2278 Fsin6_port in_port_t 2279 Fsin6_flowinfo uint32_t 2280 Fsin6_addr struct { 2281 F__in6_union struct { 2282 F__ccgo_pad1 [0]uint32 2283 F__s6_addr [16]uint8_t 2284 } 2285 } 2286 Fsin6_scope_id uint32_t 2287 } 2288 Fip6m_mtu uint32_t 2289 } /* in.h:308:1 */ 2290 2291 type addrinfo = struct { 2292 Fai_flags int32 2293 Fai_family int32 2294 Fai_socktype int32 2295 Fai_protocol int32 2296 Fai_addrlen socklen_t 2297 Fai_addr uintptr 2298 Fai_canonname uintptr 2299 Fai_next uintptr 2300 } /* netdb.h:16:1 */ 2301 2302 // Legacy functions follow (marked OBsolete in SUS) 2303 2304 type netent = struct { 2305 Fn_name uintptr 2306 Fn_aliases uintptr 2307 Fn_addrtype int32 2308 Fn_net uint32_t 2309 } /* netdb.h:62:1 */ 2310 2311 type hostent = struct { 2312 Fh_name uintptr 2313 Fh_aliases uintptr 2314 Fh_addrtype int32 2315 Fh_length int32 2316 Fh_addr_list uintptr 2317 } /* netdb.h:69:1 */ 2318 2319 type servent = struct { 2320 Fs_name uintptr 2321 Fs_aliases uintptr 2322 Fs_port int32 2323 Fs_proto uintptr 2324 } /* netdb.h:78:1 */ 2325 2326 type protoent = struct { 2327 Fp_name uintptr 2328 Fp_aliases uintptr 2329 Fp_proto int32 2330 } /* netdb.h:85:1 */ 2331 2332 type aibuf = struct { 2333 Fai struct { 2334 Fai_flags int32 2335 Fai_family int32 2336 Fai_socktype int32 2337 Fai_protocol int32 2338 Fai_addrlen socklen_t 2339 Fai_addr uintptr 2340 Fai_canonname uintptr 2341 Fai_next uintptr 2342 } 2343 Fsa struct { 2344 Fsin struct { 2345 Fsin_family sa_family_t 2346 Fsin_port in_port_t 2347 Fsin_addr struct{ Fs_addr in_addr_t } 2348 Fsin_zero [8]uint8_t 2349 } 2350 F__ccgo_pad1 [12]byte 2351 } 2352 Flock [1]int32 2353 Fslot int16 2354 Fref int16 2355 } /* lookup.h:10:1 */ 2356 2357 type sa = struct { 2358 Fsin struct { 2359 Fsin_family sa_family_t 2360 Fsin_port in_port_t 2361 Fsin_addr struct{ Fs_addr in_addr_t } 2362 Fsin_zero [8]uint8_t 2363 } 2364 F__ccgo_pad1 [12]byte 2365 } /* lookup.h:10:1 */ 2366 2367 type address = struct { 2368 Ffamily int32 2369 Fscopeid uint32 2370 Faddr [16]uint8_t 2371 Fsortkey int32 2372 } /* lookup.h:20:1 */ 2373 2374 type service = struct { 2375 Fport uint16_t 2376 Fproto uint8 2377 Fsocktype uint8 2378 } /* lookup.h:27:1 */ 2379 2380 type resolvconf = struct { 2381 Fns [3]struct { 2382 Ffamily int32 2383 Fscopeid uint32 2384 Faddr [16]uint8_t 2385 Fsortkey int32 2386 } 2387 Fnns uint32 2388 Fattempts uint32 2389 Fndots uint32 2390 Ftimeout uint32 2391 } /* lookup.h:34:1 */ 2392 2393 func Xfreeaddrinfo(tls *TLS, p uintptr) { /* freeaddrinfo.c:7:6: */ 2394 var cnt size_t 2395 cnt = size_t(1) 2396 __1: 2397 if !((*addrinfo)(unsafe.Pointer(p)).Fai_next != 0) { 2398 goto __3 2399 } 2400 goto __2 2401 __2: 2402 cnt++ 2403 p = (*addrinfo)(unsafe.Pointer(p)).Fai_next 2404 goto __1 2405 goto __3 2406 __3: 2407 ; 2408 var b uintptr = p - uintptr(uint32(uintptr(0))) 2409 b -= 68 * uintptr((*aibuf)(unsafe.Pointer(b)).Fslot) 2410 //TODO LOCK(b->lock); 2411 if !(int32(AssignSubPtrInt16(b+66, int16(cnt))) != 0) { 2412 Xfree(tls, b) 2413 } 2414 //TODO else UNLOCK(b->lock); 2415 } 2416 2417 type time_t = int64 /* alltypes.h:108:16 */ 2418 2419 type clockid_t = int32 /* alltypes.h:237:13 */ 2420 2421 type timespec = struct { 2422 Ftv_sec time_t 2423 Ftv_nsec int32 2424 __12 uint32 /* int : 32 */ 2425 } /* alltypes.h:252:1 */ 2426 2427 type pthread_t = uintptr /* alltypes.h:296:26 */ 2428 2429 type pthread_once_t = int32 /* alltypes.h:302:13 */ 2430 2431 type pthread_key_t = uint32 /* alltypes.h:307:18 */ 2432 2433 type pthread_spinlock_t = int32 /* alltypes.h:312:13 */ 2434 2435 type pthread_mutexattr_t = struct{ F__attr uint32 } /* alltypes.h:317:37 */ 2436 2437 type pthread_condattr_t = struct{ F__attr uint32 } /* alltypes.h:322:37 */ 2438 2439 type pthread_barrierattr_t = struct{ F__attr uint32 } /* alltypes.h:327:37 */ 2440 2441 type pthread_rwlockattr_t = struct{ F__attr [2]uint32 } /* alltypes.h:332:40 */ 2442 2443 type __sigset_t = struct{ F__bits [32]uint32 } /* alltypes.h:372:9 */ 2444 2445 type sigset_t = __sigset_t /* alltypes.h:372:71 */ 2446 2447 type pthread_attr_t = struct{ F__u struct{ F__i [9]int32 } } /* alltypes.h:395:147 */ 2448 2449 type pthread_mutex_t = struct{ F__u struct{ F__i [6]int32 } } /* alltypes.h:400:157 */ 2450 2451 type pthread_cond_t = struct{ F__u struct{ F__i [12]int32 } } /* alltypes.h:410:112 */ 2452 2453 type pthread_rwlock_t = struct{ F__u struct{ F__i [8]int32 } } /* alltypes.h:420:139 */ 2454 2455 type pthread_barrier_t = struct{ F__u struct{ F__i [5]int32 } } /* alltypes.h:425:137 */ 2456 2457 type sched_param = struct { 2458 Fsched_priority int32 2459 F__reserved1 int32 2460 F__reserved2 [4]int32 2461 F__reserved3 int32 2462 } /* sched.h:19:1 */ 2463 2464 type timer_t = uintptr /* alltypes.h:232:14 */ 2465 2466 type clock_t = int32 /* alltypes.h:242:14 */ 2467 2468 type tm = struct { 2469 Ftm_sec int32 2470 Ftm_min int32 2471 Ftm_hour int32 2472 Ftm_mday int32 2473 Ftm_mon int32 2474 Ftm_year int32 2475 Ftm_wday int32 2476 Ftm_yday int32 2477 Ftm_isdst int32 2478 Ftm_gmtoff int32 2479 Ftm_zone uintptr 2480 } /* time.h:38:1 */ 2481 2482 type itimerspec = struct { 2483 Fit_interval struct { 2484 Ftv_sec time_t 2485 Ftv_nsec int32 2486 __12 uint32 /* int : 32 */ 2487 } 2488 Fit_value struct { 2489 Ftv_sec time_t 2490 Ftv_nsec int32 2491 __12 uint32 /* int : 32 */ 2492 } 2493 } /* time.h:80:1 */ 2494 2495 type __ptcb = struct { 2496 F__f uintptr 2497 F__x uintptr 2498 F__next uintptr 2499 } /* pthread.h:206:1 */ 2500 2501 type useconds_t = uint32 /* alltypes.h:283:18 */ 2502 2503 func Xgetaddrinfo(tls *TLS, host uintptr, serv uintptr, hint uintptr, res uintptr) int32 { /* getaddrinfo.c:12:5: */ 2504 bp := tls.Alloc(1608) 2505 defer tls.Free(1608) 2506 2507 // var ports [2]service at bp, 8 2508 2509 // var addrs [48]address at bp+8, 1344 2510 2511 // var canon [256]int8 at bp+1352, 256 2512 2513 var outcanon uintptr 2514 var nservs int32 2515 var naddrs int32 2516 var nais int32 2517 var canon_len int32 2518 var i int32 2519 var j int32 2520 var k int32 2521 var family int32 = 0 2522 var flags int32 = 0 2523 var proto int32 = 0 2524 var socktype int32 = 0 2525 var out uintptr 2526 2527 if !(host != 0) && !(serv != 0) { 2528 return -2 2529 } 2530 2531 if hint != 0 { 2532 family = (*addrinfo)(unsafe.Pointer(hint)).Fai_family 2533 flags = (*addrinfo)(unsafe.Pointer(hint)).Fai_flags 2534 proto = (*addrinfo)(unsafe.Pointer(hint)).Fai_protocol 2535 socktype = (*addrinfo)(unsafe.Pointer(hint)).Fai_socktype 2536 2537 var mask int32 = 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x400 2538 if flags&mask != flags { 2539 return -1 2540 } 2541 2542 switch family { 2543 case 2: 2544 fallthrough 2545 case 10: 2546 fallthrough 2547 case 0: 2548 break 2549 fallthrough 2550 default: 2551 return -6 2552 } 2553 } 2554 2555 if flags&0x20 != 0 { 2556 Xabort(tls) //TODO- 2557 // /* Define the "an address is configured" condition for address 2558 // * families via ability to create a socket for the family plus 2559 // * routability of the loopback address for the family. */ 2560 // static const struct sockaddr_in lo4 = { 2561 // .sin_family = AF_INET, .sin_port = 65535, 2562 // .sin_addr.s_addr = __BYTE_ORDER == __BIG_ENDIAN 2563 // ? 0x7f000001 : 0x0100007f 2564 // }; 2565 // static const struct sockaddr_in6 lo6 = { 2566 // .sin6_family = AF_INET6, .sin6_port = 65535, 2567 // .sin6_addr = IN6ADDR_LOOPBACK_INIT 2568 // }; 2569 // int tf[2] = { AF_INET, AF_INET6 }; 2570 // const void *ta[2] = { &lo4, &lo6 }; 2571 // socklen_t tl[2] = { sizeof lo4, sizeof lo6 }; 2572 // for (i=0; i<2; i++) { 2573 // if (family==tf[1-i]) continue; 2574 // int s = socket(tf[i], SOCK_CLOEXEC|SOCK_DGRAM, 2575 // IPPROTO_UDP); 2576 // if (s>=0) { 2577 // int cs; 2578 // pthread_setcancelstate( 2579 // PTHREAD_CANCEL_DISABLE, &cs); 2580 // int r = connect(s, ta[i], tl[i]); 2581 // pthread_setcancelstate(cs, 0); 2582 // close(s); 2583 // if (!r) continue; 2584 // } 2585 // switch (errno) { 2586 // case EADDRNOTAVAIL: 2587 // case EAFNOSUPPORT: 2588 // case EHOSTUNREACH: 2589 // case ENETDOWN: 2590 // case ENETUNREACH: 2591 // break; 2592 // default: 2593 // return EAI_SYSTEM; 2594 // } 2595 // if (family == tf[i]) return EAI_NONAME; 2596 // family = tf[1-i]; 2597 // } 2598 } 2599 2600 nservs = X__lookup_serv(tls, bp, serv, proto, socktype, flags) 2601 if nservs < 0 { 2602 return nservs 2603 } 2604 2605 naddrs = X__lookup_name(tls, bp+8, bp+1352, host, family, flags) 2606 if naddrs < 0 { 2607 return naddrs 2608 } 2609 2610 nais = nservs * naddrs 2611 canon_len = int32(Xstrlen(tls, bp+1352)) 2612 out = Xcalloc(tls, uint32(1), uint32(nais)*uint32(unsafe.Sizeof(aibuf{}))+uint32(canon_len)+uint32(1)) 2613 if !(out != 0) { 2614 return -10 2615 } 2616 2617 if canon_len != 0 { 2618 outcanon = out + uintptr(nais)*68 2619 Xmemcpy(tls, outcanon, bp+1352, uint32(canon_len+1)) 2620 } else { 2621 outcanon = uintptr(0) 2622 } 2623 2624 for k = AssignInt32(&i, 0); i < naddrs; i++ { 2625 j = 0 2626 __1: 2627 if !(j < nservs) { 2628 goto __3 2629 } 2630 { 2631 (*aibuf)(unsafe.Pointer(out + uintptr(k)*68)).Fslot = int16(k) 2632 //TODO out[k].ai = (struct addrinfo){ 2633 //TODO .ai_family = addrs[i].family, 2634 //TODO .ai_socktype = ports[j].socktype, 2635 //TODO .ai_protocol = ports[j].proto, 2636 //TODO .ai_addrlen = addrs[i].family == AF_INET 2637 //TODO ? sizeof(struct sockaddr_in) 2638 //TODO : sizeof(struct sockaddr_in6), 2639 //TODO .ai_addr = (void *)&out[k].sa, 2640 //TODO .ai_canonname = outcanon }; 2641 (*aibuf)(unsafe.Pointer(out + uintptr(k)*68)).Fai.Fai_family = (*address)(unsafe.Pointer(bp + 8 + uintptr(i)*28)).Ffamily 2642 (*aibuf)(unsafe.Pointer(out + uintptr(k)*68)).Fai.Fai_socktype = int32((*service)(unsafe.Pointer(bp + uintptr(j)*4)).Fsocktype) 2643 (*aibuf)(unsafe.Pointer(out + uintptr(k)*68)).Fai.Fai_protocol = int32((*service)(unsafe.Pointer(bp + uintptr(j)*4)).Fproto) 2644 (*aibuf)(unsafe.Pointer(out + uintptr(k)*68)).Fai.Fai_addrlen = func() uint32 { 2645 if (*address)(unsafe.Pointer(bp+8+uintptr(i)*28)).Ffamily == 2 { 2646 return uint32(unsafe.Sizeof(sockaddr_in{})) 2647 } 2648 return uint32(unsafe.Sizeof(sockaddr_in6{})) 2649 }() 2650 (*aibuf)(unsafe.Pointer(out + uintptr(k)*68)).Fai.Fai_addr = out + uintptr(k)*68 + 32 2651 (*aibuf)(unsafe.Pointer(out + uintptr(k)*68)).Fai.Fai_canonname = outcanon 2652 if k != 0 { 2653 (*aibuf)(unsafe.Pointer(out + uintptr(k-1)*68)).Fai.Fai_next = out + uintptr(k)*68 2654 } 2655 switch (*address)(unsafe.Pointer(bp + 8 + uintptr(i)*28)).Ffamily { 2656 case 2: 2657 (*sockaddr_in)(unsafe.Pointer(out + uintptr(k)*68 + 32)).Fsin_family = sa_family_t(2) 2658 (*sockaddr_in)(unsafe.Pointer(out + uintptr(k)*68 + 32)).Fsin_port = Xhtons(tls, (*service)(unsafe.Pointer(bp+uintptr(j)*4)).Fport) 2659 Xmemcpy(tls, out+uintptr(k)*68+32+4, bp+8+uintptr(i)*28+8, uint32(4)) 2660 break 2661 case 10: 2662 (*sockaddr_in6)(unsafe.Pointer(out + uintptr(k)*68 + 32)).Fsin6_family = sa_family_t(10) 2663 (*sockaddr_in6)(unsafe.Pointer(out + uintptr(k)*68 + 32)).Fsin6_port = Xhtons(tls, (*service)(unsafe.Pointer(bp+uintptr(j)*4)).Fport) 2664 (*sockaddr_in6)(unsafe.Pointer(out + uintptr(k)*68 + 32)).Fsin6_scope_id = (*address)(unsafe.Pointer(bp + 8 + uintptr(i)*28)).Fscopeid 2665 Xmemcpy(tls, out+uintptr(k)*68+32+8, bp+8+uintptr(i)*28+8, uint32(16)) 2666 break 2667 } 2668 2669 } 2670 goto __2 2671 __2: 2672 j++ 2673 k++ 2674 goto __1 2675 goto __3 2676 __3: 2677 } 2678 (*aibuf)(unsafe.Pointer(out)).Fref = int16(nais) 2679 *(*uintptr)(unsafe.Pointer(res)) = out 2680 return 0 2681 } 2682 2683 type ucred = struct { 2684 Fpid pid_t 2685 Fuid uid_t 2686 Fgid gid_t 2687 } /* socket.h:57:1 */ 2688 2689 type mmsghdr = struct { 2690 Fmsg_hdr struct { 2691 Fmsg_name uintptr 2692 Fmsg_namelen socklen_t 2693 Fmsg_iov uintptr 2694 Fmsg_iovlen int32 2695 Fmsg_control uintptr 2696 Fmsg_controllen socklen_t 2697 Fmsg_flags int32 2698 } 2699 Fmsg_len uint32 2700 } /* socket.h:63:1 */ 2701 2702 func Xgethostbyaddr(tls *TLS, a uintptr, l socklen_t, af int32) uintptr { /* gethostbyaddr.c:7:16: */ 2703 bp := tls.Alloc(4) 2704 defer tls.Free(4) 2705 2706 var size size_t = size_t(63) 2707 // var res uintptr at bp, 4 2708 2709 var err int32 2710 for __ccgo := true; __ccgo; __ccgo = err == 34 { 2711 Xfree(tls, _sh) 2712 _sh = Xmalloc(tls, AssignAddUint32(&size, size+size_t(1))) 2713 if !(_sh != 0) { 2714 *(*int32)(unsafe.Pointer(X__h_errno_location(tls))) = 3 2715 return uintptr(0) 2716 } 2717 err = Xgethostbyaddr_r(tls, a, l, af, _sh, 2718 _sh+uintptr(1)*20, size-size_t(unsafe.Sizeof(hostent{})), bp, X__h_errno_location(tls)) 2719 } 2720 if err != 0 { 2721 return uintptr(0) 2722 } 2723 return _sh 2724 } 2725 2726 var _sh uintptr /* gethostbyaddr.c:9:24: */ 2727 2728 func Xgethostbyname(tls *TLS, name uintptr) uintptr { /* gethostbyname.c:8:16: */ 2729 return Xgethostbyname2(tls, name, 2) 2730 } 2731 2732 func Xgethostbyname2(tls *TLS, name uintptr, af int32) uintptr { /* gethostbyname2.c:8:16: */ 2733 bp := tls.Alloc(4) 2734 defer tls.Free(4) 2735 2736 var size size_t = size_t(63) 2737 // var res uintptr at bp, 4 2738 2739 var err int32 2740 for __ccgo := true; __ccgo; __ccgo = err == 34 { 2741 Xfree(tls, _sh1) 2742 _sh1 = Xmalloc(tls, AssignAddUint32(&size, size+size_t(1))) 2743 if !(_sh1 != 0) { 2744 *(*int32)(unsafe.Pointer(X__h_errno_location(tls))) = 3 2745 return uintptr(0) 2746 } 2747 err = Xgethostbyname2_r(tls, name, af, _sh1, 2748 _sh1+uintptr(1)*20, size-size_t(unsafe.Sizeof(hostent{})), bp, X__h_errno_location(tls)) 2749 } 2750 if err != 0 { 2751 return uintptr(0) 2752 } 2753 return _sh1 2754 } 2755 2756 var _sh1 uintptr /* gethostbyname2.c:10:24: */ 2757 2758 func Xgethostbyname2_r(tls *TLS, name uintptr, af int32, h uintptr, buf uintptr, buflen size_t, res uintptr, err uintptr) int32 { /* gethostbyname2_r.c:11:5: */ 2759 bp := tls.Alloc(1600) 2760 defer tls.Free(1600) 2761 2762 // var addrs [48]address at bp, 1344 2763 2764 // var canon [256]int8 at bp+1344, 256 2765 2766 var i int32 2767 var cnt int32 2768 var align size_t 2769 var need size_t 2770 2771 *(*uintptr)(unsafe.Pointer(res)) = uintptr(0) 2772 cnt = X__lookup_name(tls, bp, bp+1344, name, af, 0x02) 2773 if cnt < 0 { 2774 switch cnt { 2775 case -2: 2776 *(*int32)(unsafe.Pointer(err)) = 1 2777 return 2 2778 fallthrough 2779 case -3: 2780 *(*int32)(unsafe.Pointer(err)) = 2 2781 return 11 2782 fallthrough 2783 default: 2784 fallthrough 2785 case -4: 2786 *(*int32)(unsafe.Pointer(err)) = 3 2787 return 74 2788 fallthrough 2789 case -10: 2790 fallthrough 2791 case -11: 2792 *(*int32)(unsafe.Pointer(err)) = 3 2793 return *(*int32)(unsafe.Pointer(X___errno_location(tls))) 2794 } 2795 } 2796 2797 (*hostent)(unsafe.Pointer(h)).Fh_addrtype = af 2798 (*hostent)(unsafe.Pointer(h)).Fh_length = func() int32 { 2799 if af == 10 { 2800 return 16 2801 } 2802 return 4 2803 }() 2804 2805 // Align buffer 2806 align = uint32(-uintptr_t(buf)) & (uint32(unsafe.Sizeof(uintptr(0))) - uint32(1)) 2807 2808 need = uint32(4) * uint32(unsafe.Sizeof(uintptr(0))) 2809 need = need + uint32(cnt+1)*(uint32(unsafe.Sizeof(uintptr(0)))+uint32((*hostent)(unsafe.Pointer(h)).Fh_length)) 2810 need = need + (Xstrlen(tls, name) + size_t(1)) 2811 need = need + (Xstrlen(tls, bp+1344) + size_t(1)) 2812 need = need + align 2813 2814 if need > buflen { 2815 return 34 2816 } 2817 2818 buf += uintptr(align) 2819 (*hostent)(unsafe.Pointer(h)).Fh_aliases = buf 2820 buf += uintptr(uint32(3) * uint32(unsafe.Sizeof(uintptr(0)))) 2821 (*hostent)(unsafe.Pointer(h)).Fh_addr_list = buf 2822 buf += uintptr(uint32(cnt+1) * uint32(unsafe.Sizeof(uintptr(0)))) 2823 2824 for i = 0; i < cnt; i++ { 2825 *(*uintptr)(unsafe.Pointer((*hostent)(unsafe.Pointer(h)).Fh_addr_list + uintptr(i)*4)) = buf 2826 buf += uintptr((*hostent)(unsafe.Pointer(h)).Fh_length) 2827 Xmemcpy(tls, *(*uintptr)(unsafe.Pointer((*hostent)(unsafe.Pointer(h)).Fh_addr_list + uintptr(i)*4)), bp+uintptr(i)*28+8, uint32((*hostent)(unsafe.Pointer(h)).Fh_length)) 2828 } 2829 *(*uintptr)(unsafe.Pointer((*hostent)(unsafe.Pointer(h)).Fh_addr_list + uintptr(i)*4)) = uintptr(0) 2830 2831 (*hostent)(unsafe.Pointer(h)).Fh_name = AssignPtrUintptr((*hostent)(unsafe.Pointer(h)).Fh_aliases, buf) 2832 Xstrcpy(tls, (*hostent)(unsafe.Pointer(h)).Fh_name, bp+1344) 2833 buf += uintptr(Xstrlen(tls, (*hostent)(unsafe.Pointer(h)).Fh_name) + size_t(1)) 2834 2835 if Xstrcmp(tls, (*hostent)(unsafe.Pointer(h)).Fh_name, name) != 0 { 2836 *(*uintptr)(unsafe.Pointer((*hostent)(unsafe.Pointer(h)).Fh_aliases + 1*4)) = buf 2837 Xstrcpy(tls, *(*uintptr)(unsafe.Pointer((*hostent)(unsafe.Pointer(h)).Fh_aliases + 1*4)), name) 2838 buf += uintptr(Xstrlen(tls, *(*uintptr)(unsafe.Pointer((*hostent)(unsafe.Pointer(h)).Fh_aliases + 1*4))) + size_t(1)) 2839 } else { 2840 *(*uintptr)(unsafe.Pointer((*hostent)(unsafe.Pointer(h)).Fh_aliases + 1*4)) = uintptr(0) 2841 } 2842 2843 *(*uintptr)(unsafe.Pointer((*hostent)(unsafe.Pointer(h)).Fh_aliases + 2*4)) = uintptr(0) 2844 2845 *(*uintptr)(unsafe.Pointer(res)) = h 2846 return 0 2847 } 2848 2849 type if_nameindex = struct { 2850 Fif_index uint32 2851 Fif_name uintptr 2852 } /* if.h:12:1 */ 2853 2854 type ifaddr = struct { 2855 Fifa_addr struct { 2856 Fsa_family sa_family_t 2857 Fsa_data [14]int8 2858 } 2859 Fifa_ifu struct { 2860 Fifu_broadaddr struct { 2861 Fsa_family sa_family_t 2862 Fsa_data [14]int8 2863 } 2864 } 2865 Fifa_ifp uintptr 2866 Fifa_next uintptr 2867 } /* if.h:51:1 */ 2868 2869 type ifmap = struct { 2870 Fmem_start uint32 2871 Fmem_end uint32 2872 Fbase_addr uint16 2873 Firq uint8 2874 Fdma uint8 2875 Fport uint8 2876 F__ccgo_pad1 [3]byte 2877 } /* if.h:64:1 */ 2878 2879 type ifreq = struct { 2880 Fifr_ifrn struct{ Fifrn_name [16]int8 } 2881 Fifr_ifru struct { 2882 F__ccgo_pad1 [0]uint32 2883 Fifru_addr struct { 2884 Fsa_family sa_family_t 2885 Fsa_data [14]int8 2886 } 2887 } 2888 } /* if.h:76:1 */ 2889 2890 type ifconf = struct { 2891 Fifc_len int32 2892 Fifc_ifcu struct{ Fifcu_buf uintptr } 2893 } /* if.h:116:1 */ 2894 2895 type ns_sect = uint32 /* nameser.h:37:3 */ 2896 2897 type __ns_msg = struct { 2898 F_msg uintptr 2899 F_eom uintptr 2900 F_id uint16_t 2901 F_flags uint16_t 2902 F_counts [4]uint16_t 2903 F_sections [4]uintptr 2904 F_sect ns_sect 2905 F_rrnum int32 2906 F_msg_ptr uintptr 2907 } /* nameser.h:39:9 */ 2908 2909 type ns_msg = __ns_msg /* nameser.h:46:3 */ 2910 2911 type _ns_flagdata = struct { 2912 Fmask int32 2913 Fshift int32 2914 } /* nameser.h:48:1 */ 2915 2916 type __ns_rr = struct { 2917 Fname [1025]int8 2918 F__ccgo_pad1 [1]byte 2919 Ftype uint16_t 2920 Frr_class uint16_t 2921 F__ccgo_pad2 [2]byte 2922 Fttl uint32_t 2923 Frdlength uint16_t 2924 F__ccgo_pad3 [2]byte 2925 Frdata uintptr 2926 } /* nameser.h:59:9 */ 2927 2928 type ns_rr = __ns_rr /* nameser.h:66:3 */ 2929 2930 type ns_flag = uint32 /* nameser.h:87:3 */ 2931 2932 type ns_opcode = uint32 /* nameser.h:96:3 */ 2933 2934 type ns_rcode = uint32 /* nameser.h:115:3 */ 2935 2936 type ns_update_operation = uint32 /* nameser.h:121:3 */ 2937 2938 type ns_tsig_key1 = struct { 2939 Fname [1025]int8 2940 Falg [1025]int8 2941 F__ccgo_pad1 [2]byte 2942 Fdata uintptr 2943 Flen int32 2944 } /* nameser.h:123:1 */ 2945 2946 type ns_tsig_key = ns_tsig_key1 /* nameser.h:128:28 */ 2947 2948 type ns_tcp_tsig_state1 = struct { 2949 Fcounter int32 2950 Fkey uintptr 2951 Fctx uintptr 2952 Fsig [512]uint8 2953 Fsiglen int32 2954 } /* nameser.h:130:1 */ 2955 2956 type ns_tcp_tsig_state = ns_tcp_tsig_state1 /* nameser.h:137:34 */ 2957 2958 type ns_type = uint32 /* nameser.h:200:3 */ 2959 2960 type ns_class = uint32 /* nameser.h:219:3 */ 2961 2962 type ns_key_types = uint32 /* nameser.h:226:3 */ 2963 2964 type ns_cert_types = uint32 /* nameser.h:234:3 */ 2965 2966 type HEADER = struct { 2967 F__ccgo_pad1 [0]uint32 2968 Fid uint32 /* unsigned id: 16, unsigned rd: 1, unsigned tc: 1, unsigned aa: 1, unsigned opcode: 4, unsigned qr: 1, unsigned rcode: 4, unsigned cd: 1, unsigned ad: 1, unsigned unused: 1, unsigned ra: 1 */ 2969 Fqdcount uint32 /* unsigned qdcount: 16, unsigned ancount: 16 */ 2970 Fnscount uint32 /* unsigned nscount: 16, unsigned arcount: 16 */ 2971 } /* nameser.h:353:3 */ 2972 2973 // unused; purely for broken apps 2974 type __res_state = struct { 2975 Fretrans int32 2976 Fretry int32 2977 Foptions uint32 2978 Fnscount int32 2979 Fnsaddr_list [3]struct { 2980 Fsin_family sa_family_t 2981 Fsin_port in_port_t 2982 Fsin_addr struct{ Fs_addr in_addr_t } 2983 Fsin_zero [8]uint8_t 2984 } 2985 Fid uint16 2986 F__ccgo_pad1 [2]byte 2987 Fdnsrch [7]uintptr 2988 Fdefdname [256]int8 2989 Fpfcode uint32 2990 Fndots uint32 /* unsigned ndots: 4, unsigned nsort: 4, unsigned ipv6_unavail: 1, unsigned unused: 23 */ 2991 F__ccgo_pad2 [4]byte 2992 Fsort_list [10]struct { 2993 Faddr struct{ Fs_addr in_addr_t } 2994 Fmask uint32_t 2995 } 2996 Fqhook uintptr 2997 Frhook uintptr 2998 Fres_h_errno int32 2999 F_vcsock int32 3000 F_flags uint32 3001 F_u struct { 3002 F__ccgo_pad1 [0]uint32 3003 Fpad [52]int8 3004 } 3005 } /* resolv.h:26:9 */ 3006 3007 // unused; purely for broken apps 3008 type res_state = uintptr /* resolv.h:62:3 */ 3009 3010 type res_sym = struct { 3011 Fnumber int32 3012 Fname uintptr 3013 Fhumanname uintptr 3014 } /* resolv.h:70:1 */ 3015 3016 func itoa(tls *TLS, p uintptr, x uint32) uintptr { /* getnameinfo.c:18:13: */ 3017 p += uintptr(uint32(3) * uint32(unsafe.Sizeof(int32(0)))) 3018 *(*int8)(unsafe.Pointer(PreDecUintptr(&p, 1))) = int8(0) 3019 for __ccgo := true; __ccgo; __ccgo = x != 0 { 3020 *(*int8)(unsafe.Pointer(PreDecUintptr(&p, 1))) = int8(uint32('0') + x%uint32(10)) 3021 x = x / uint32(10) 3022 } 3023 return p 3024 } 3025 3026 func mkptr4(tls *TLS, s uintptr, ip uintptr) { /* getnameinfo.c:28:13: */ 3027 bp := tls.Alloc(32) 3028 defer tls.Free(32) 3029 3030 Xsprintf(tls, s, ts+23, 3031 VaList(bp, int32(*(*uint8)(unsafe.Pointer(ip + 3))), int32(*(*uint8)(unsafe.Pointer(ip + 2))), int32(*(*uint8)(unsafe.Pointer(ip + 1))), int32(*(*uint8)(unsafe.Pointer(ip))))) 3032 } 3033 3034 func mkptr6(tls *TLS, s uintptr, ip uintptr) { /* getnameinfo.c:34:13: */ 3035 var i int32 3036 for i = 15; i >= 0; i-- { 3037 *(*int8)(unsafe.Pointer(PostIncUintptr(&s, 1))) = _sxdigits[int32(*(*uint8)(unsafe.Pointer(ip + uintptr(i))))&15] 3038 *(*int8)(unsafe.Pointer(PostIncUintptr(&s, 1))) = int8('.') 3039 *(*int8)(unsafe.Pointer(PostIncUintptr(&s, 1))) = _sxdigits[int32(*(*uint8)(unsafe.Pointer(ip + uintptr(i))))>>4] 3040 *(*int8)(unsafe.Pointer(PostIncUintptr(&s, 1))) = int8('.') 3041 } 3042 Xstrcpy(tls, s, ts+48) 3043 } 3044 3045 var _sxdigits = *(*[17]int8)(unsafe.Pointer(ts + 57)) /* getnameinfo.c:36:20 */ 3046 3047 func reverse_hosts(tls *TLS, buf uintptr, a uintptr, scopeid uint32, family int32) { /* getnameinfo.c:45:13: */ 3048 bp := tls.Alloc(556) 3049 defer tls.Free(556) 3050 3051 // var line [512]int8 at bp+16, 512 3052 3053 var p uintptr 3054 var z uintptr 3055 var _buf [1032]uint8 3056 _ = _buf 3057 // var atmp [16]uint8 at bp, 16 3058 3059 // var iplit address at bp+528, 28 3060 3061 //TODO FILE _f, *f = __fopen_rb_ca("/etc/hosts", &_f, _buf, sizeof _buf); 3062 var f uintptr = Xfopen(tls, ts+74, ts+85) 3063 if !(f != 0) { 3064 return 3065 } 3066 if family == 2 { 3067 Xmemcpy(tls, bp+uintptr(12), a, uint32(4)) 3068 Xmemcpy(tls, bp, ts+88, uint32(12)) 3069 a = bp /* &atmp[0] */ 3070 } 3071 for Xfgets(tls, bp+16, int32(unsafe.Sizeof([512]int8{})), f) != 0 { 3072 if AssignUintptr(&p, Xstrchr(tls, bp+16, '#')) != 0 { 3073 *(*int8)(unsafe.Pointer(PostIncUintptr(&p, 1))) = int8('\n') 3074 *(*int8)(unsafe.Pointer(p)) = int8(0) 3075 } 3076 3077 for p = bp + 16; /* &line[0] */ *(*int8)(unsafe.Pointer(p)) != 0 && !(__isspace(tls, int32(*(*int8)(unsafe.Pointer(p)))) != 0); p++ { 3078 } 3079 *(*int8)(unsafe.Pointer(PostIncUintptr(&p, 1))) = int8(0) 3080 if X__lookup_ipliteral(tls, bp+528, bp+16, 0) <= 0 { 3081 continue 3082 } 3083 3084 if (*address)(unsafe.Pointer(bp+528)).Ffamily == 2 { 3085 Xmemcpy(tls, bp+528+8+uintptr(12), bp+528+8, uint32(4)) 3086 Xmemcpy(tls, bp+528+8, ts+88, uint32(12)) 3087 (*address)(unsafe.Pointer(bp + 528 /* &iplit */)).Fscopeid = uint32(0) 3088 } 3089 3090 if Xmemcmp(tls, a, bp+528+8, uint32(16)) != 0 || (*address)(unsafe.Pointer(bp+528)).Fscopeid != scopeid { 3091 continue 3092 } 3093 3094 for ; *(*int8)(unsafe.Pointer(p)) != 0 && __isspace(tls, int32(*(*int8)(unsafe.Pointer(p)))) != 0; p++ { 3095 } 3096 for z = p; *(*int8)(unsafe.Pointer(z)) != 0 && !(__isspace(tls, int32(*(*int8)(unsafe.Pointer(z)))) != 0); z++ { 3097 } 3098 *(*int8)(unsafe.Pointer(z)) = int8(0) 3099 if (int32(z)-int32(p))/1 < 256 { 3100 Xmemcpy(tls, buf, p, uint32((int32(z)-int32(p))/1+1)) 3101 break 3102 } 3103 } 3104 //TODO __fclose_ca(f); 3105 Xfclose(tls, f) 3106 } 3107 3108 func reverse_services(tls *TLS, buf uintptr, port int32, dgram int32) { /* getnameinfo.c:87:13: */ 3109 Xabort(tls) //TODO- 3110 // unsigned long svport; 3111 // char line[128], *p, *z; 3112 // unsigned char _buf[1032]; 3113 // FILE _f, *f = __fopen_rb_ca("/etc/services", &_f, _buf, sizeof _buf); 3114 // if (!f) return; 3115 // while (fgets(line, sizeof line, f)) { 3116 // if ((p=strchr(line, '#'))) *p++='\n', *p=0; 3117 3118 // for (p=line; *p && !isspace(*p); p++); 3119 // if (!*p) continue; 3120 // *p++ = 0; 3121 // svport = strtoul(p, &z, 10); 3122 3123 // if (svport != port || z==p) continue; 3124 // if (dgram && strncmp(z, "/udp", 4)) continue; 3125 // if (!dgram && strncmp(z, "/tcp", 4)) continue; 3126 // if (p-line > 32) continue; 3127 3128 // memcpy(buf, line, p-line); 3129 // break; 3130 // } 3131 // __fclose_ca(f); 3132 } 3133 3134 var Xh_errno int32 /* h_errno.c:4:5: */ 3135 3136 func X__h_errno_location(tls *TLS) uintptr { /* h_errno.c:6:5: */ 3137 return uintptr(unsafe.Pointer(&Xh_errno)) 3138 } 3139 3140 func X__inet_aton(tls *TLS, s0 uintptr, dest uintptr) int32 { /* inet_aton.c:7:5: */ 3141 bp := tls.Alloc(20) 3142 defer tls.Free(20) 3143 3144 var s uintptr = s0 3145 var d uintptr = dest 3146 *(*[4]uint32)(unsafe.Pointer(bp /* a */)) = [4]uint32{0: uint32(0)} 3147 // var z uintptr at bp+16, 4 3148 3149 var i int32 3150 3151 for i = 0; i < 4; i++ { 3152 *(*uint32)(unsafe.Pointer(bp + uintptr(i)*4)) = Xstrtoul(tls, s, bp+16, 0) 3153 if *(*uintptr)(unsafe.Pointer(bp + 16)) == s || *(*int8)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 16)))) != 0 && int32(*(*int8)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 16))))) != '.' || !(func() int32 { 3154 if 0 != 0 { 3155 return Xisdigit(tls, int32(*(*int8)(unsafe.Pointer(s)))) 3156 } 3157 return Bool32(uint32(*(*int8)(unsafe.Pointer(s)))-uint32('0') < uint32(10)) 3158 }() != 0) { 3159 return 0 3160 } 3161 if !(int32(*(*int8)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 16))))) != 0) { 3162 break 3163 } 3164 s = *(*uintptr)(unsafe.Pointer(bp + 16)) + uintptr(1) 3165 } 3166 if i == 4 { 3167 return 0 3168 } 3169 switch i { 3170 case 0: 3171 *(*uint32)(unsafe.Pointer(bp + 1*4)) = *(*uint32)(unsafe.Pointer(bp)) & uint32(0xffffff) 3172 AssignShrPtrUint32(bp, int(24)) 3173 fallthrough 3174 case 1: 3175 *(*uint32)(unsafe.Pointer(bp + 2*4)) = *(*uint32)(unsafe.Pointer(bp + 1*4)) & uint32(0xffff) 3176 AssignShrPtrUint32(bp+1*4, int(16)) 3177 fallthrough 3178 case 2: 3179 *(*uint32)(unsafe.Pointer(bp + 3*4)) = *(*uint32)(unsafe.Pointer(bp + 2*4)) & uint32(0xff) 3180 AssignShrPtrUint32(bp+2*4, int(8)) 3181 } 3182 for i = 0; i < 4; i++ { 3183 if *(*uint32)(unsafe.Pointer(bp + uintptr(i)*4)) > uint32(255) { 3184 return 0 3185 } 3186 *(*uint8)(unsafe.Pointer(d + uintptr(i))) = uint8(*(*uint32)(unsafe.Pointer(bp + uintptr(i)*4))) 3187 } 3188 return 1 3189 } 3190 3191 func Xinet_ntop(tls *TLS, af int32, a0 uintptr, s uintptr, l socklen_t) uintptr { /* inet_ntop.c:7:12: */ 3192 bp := tls.Alloc(276) 3193 defer tls.Free(276) 3194 3195 var a uintptr = a0 3196 var i int32 3197 var j int32 3198 var max int32 3199 var best int32 3200 // var buf [100]int8 at bp+176, 100 3201 3202 switch af { 3203 case 2: 3204 if socklen_t(Xsnprintf(tls, s, uint32(l), ts+101, VaList(bp, int32(*(*uint8)(unsafe.Pointer(a))), int32(*(*uint8)(unsafe.Pointer(a + 1))), int32(*(*uint8)(unsafe.Pointer(a + 2))), int32(*(*uint8)(unsafe.Pointer(a + 3)))))) < l { 3205 return s 3206 } 3207 break 3208 case 10: 3209 if Xmemcmp(tls, a, ts+88, uint32(12)) != 0 { 3210 Xsnprintf(tls, bp+176, uint32(unsafe.Sizeof([100]int8{})), 3211 ts+113, 3212 VaList(bp+32, 256*int32(*(*uint8)(unsafe.Pointer(a)))+int32(*(*uint8)(unsafe.Pointer(a + 1))), 256*int32(*(*uint8)(unsafe.Pointer(a + 2)))+int32(*(*uint8)(unsafe.Pointer(a + 3))), 3213 256*int32(*(*uint8)(unsafe.Pointer(a + 4)))+int32(*(*uint8)(unsafe.Pointer(a + 5))), 256*int32(*(*uint8)(unsafe.Pointer(a + 6)))+int32(*(*uint8)(unsafe.Pointer(a + 7))), 3214 256*int32(*(*uint8)(unsafe.Pointer(a + 8)))+int32(*(*uint8)(unsafe.Pointer(a + 9))), 256*int32(*(*uint8)(unsafe.Pointer(a + 10)))+int32(*(*uint8)(unsafe.Pointer(a + 11))), 3215 256*int32(*(*uint8)(unsafe.Pointer(a + 12)))+int32(*(*uint8)(unsafe.Pointer(a + 13))), 256*int32(*(*uint8)(unsafe.Pointer(a + 14)))+int32(*(*uint8)(unsafe.Pointer(a + 15))))) 3216 } else { 3217 Xsnprintf(tls, bp+176, uint32(unsafe.Sizeof([100]int8{})), 3218 ts+137, 3219 VaList(bp+96, 256*int32(*(*uint8)(unsafe.Pointer(a)))+int32(*(*uint8)(unsafe.Pointer(a + 1))), 256*int32(*(*uint8)(unsafe.Pointer(a + 2)))+int32(*(*uint8)(unsafe.Pointer(a + 3))), 3220 256*int32(*(*uint8)(unsafe.Pointer(a + 4)))+int32(*(*uint8)(unsafe.Pointer(a + 5))), 256*int32(*(*uint8)(unsafe.Pointer(a + 6)))+int32(*(*uint8)(unsafe.Pointer(a + 7))), 3221 256*int32(*(*uint8)(unsafe.Pointer(a + 8)))+int32(*(*uint8)(unsafe.Pointer(a + 9))), 256*int32(*(*uint8)(unsafe.Pointer(a + 10)))+int32(*(*uint8)(unsafe.Pointer(a + 11))), 3222 int32(*(*uint8)(unsafe.Pointer(a + 12))), int32(*(*uint8)(unsafe.Pointer(a + 13))), int32(*(*uint8)(unsafe.Pointer(a + 14))), int32(*(*uint8)(unsafe.Pointer(a + 15))))) 3223 } 3224 // Replace longest /(^0|:)[:0]{2,}/ with "::" 3225 i = AssignInt32(&best, 0) 3226 max = 2 3227 for ; *(*int8)(unsafe.Pointer(bp + 176 + uintptr(i))) != 0; i++ { 3228 if i != 0 && int32(*(*int8)(unsafe.Pointer(bp + 176 + uintptr(i)))) != ':' { 3229 continue 3230 } 3231 j = int32(Xstrspn(tls, bp+176+uintptr(i), ts+167)) 3232 if j > max { 3233 best = i 3234 max = j 3235 } 3236 } 3237 if max > 3 { 3238 *(*int8)(unsafe.Pointer(bp + 176 + uintptr(best))) = AssignPtrInt8(bp+176+uintptr(best+1), int8(':')) 3239 Xmemmove(tls, bp+176+uintptr(best)+uintptr(2), bp+176+uintptr(best)+uintptr(max), uint32(i-best-max+1)) 3240 } 3241 if Xstrlen(tls, bp+176) < size_t(l) { 3242 Xstrcpy(tls, s, bp+176) 3243 return s 3244 } 3245 break 3246 default: 3247 *(*int32)(unsafe.Pointer(X___errno_location(tls))) = 97 3248 return uintptr(0) 3249 } 3250 *(*int32)(unsafe.Pointer(X___errno_location(tls))) = 28 3251 return uintptr(0) 3252 } 3253 3254 func hexval(tls *TLS, c uint32) int32 { /* inet_pton.c:7:12: */ 3255 if c-uint32('0') < uint32(10) { 3256 return int32(c - uint32('0')) 3257 } 3258 c = c | uint32(32) 3259 if c-uint32('a') < uint32(6) { 3260 return int32(c - uint32('a') + uint32(10)) 3261 } 3262 return -1 3263 } 3264 3265 func Xinet_pton(tls *TLS, af int32, s uintptr, a0 uintptr) int32 { /* inet_pton.c:15:5: */ 3266 bp := tls.Alloc(16) 3267 defer tls.Free(16) 3268 3269 // var ip [8]uint16_t at bp, 16 3270 3271 var a uintptr = a0 3272 var i int32 3273 var j int32 3274 var v int32 3275 var d int32 3276 var brk int32 = -1 3277 var need_v4 int32 = 0 3278 3279 if af == 2 { 3280 for i = 0; i < 4; i++ { 3281 for v = AssignInt32(&j, 0); j < 3 && func() int32 { 3282 if 0 != 0 { 3283 return Xisdigit(tls, int32(*(*int8)(unsafe.Pointer(s + uintptr(j))))) 3284 } 3285 return Bool32(uint32(*(*int8)(unsafe.Pointer(s + uintptr(j))))-uint32('0') < uint32(10)) 3286 }() != 0; j++ { 3287 v = 10*v + int32(*(*int8)(unsafe.Pointer(s + uintptr(j)))) - '0' 3288 } 3289 if j == 0 || j > 1 && int32(*(*int8)(unsafe.Pointer(s))) == '0' || v > 255 { 3290 return 0 3291 } 3292 *(*uint8)(unsafe.Pointer(a + uintptr(i))) = uint8(v) 3293 if int32(*(*int8)(unsafe.Pointer(s + uintptr(j)))) == 0 && i == 3 { 3294 return 1 3295 } 3296 if int32(*(*int8)(unsafe.Pointer(s + uintptr(j)))) != '.' { 3297 return 0 3298 } 3299 s += uintptr(j + 1) 3300 } 3301 return 0 3302 } else if af != 10 { 3303 *(*int32)(unsafe.Pointer(X___errno_location(tls))) = 97 3304 return -1 3305 } 3306 3307 if int32(*(*int8)(unsafe.Pointer(s))) == ':' && int32(*(*int8)(unsafe.Pointer(PreIncUintptr(&s, 1)))) != ':' { 3308 return 0 3309 } 3310 3311 for i = 0; ; i++ { 3312 if int32(*(*int8)(unsafe.Pointer(s))) == ':' && brk < 0 { 3313 brk = i 3314 *(*uint16_t)(unsafe.Pointer(bp + uintptr(i&7)*2)) = uint16_t(0) 3315 if !(int32(*(*int8)(unsafe.Pointer(PreIncUintptr(&s, 1)))) != 0) { 3316 break 3317 } 3318 if i == 7 { 3319 return 0 3320 } 3321 continue 3322 } 3323 for v = AssignInt32(&j, 0); j < 4 && AssignInt32(&d, hexval(tls, uint32(*(*int8)(unsafe.Pointer(s + uintptr(j)))))) >= 0; j++ { 3324 v = 16*v + d 3325 } 3326 if j == 0 { 3327 return 0 3328 } 3329 *(*uint16_t)(unsafe.Pointer(bp + uintptr(i&7)*2)) = uint16_t(v) 3330 if !(int32(*(*int8)(unsafe.Pointer(s + uintptr(j)))) != 0) && (brk >= 0 || i == 7) { 3331 break 3332 } 3333 if i == 7 { 3334 return 0 3335 } 3336 if int32(*(*int8)(unsafe.Pointer(s + uintptr(j)))) != ':' { 3337 if int32(*(*int8)(unsafe.Pointer(s + uintptr(j)))) != '.' || i < 6 && brk < 0 { 3338 return 0 3339 } 3340 need_v4 = 1 3341 i++ 3342 break 3343 } 3344 s += uintptr(j + 1) 3345 } 3346 if brk >= 0 { 3347 Xmemmove(tls, bp+uintptr(brk)*2+uintptr(7)*2-uintptr(i)*2, bp+uintptr(brk)*2, uint32(2*(i+1-brk))) 3348 for j = 0; j < 7-i; j++ { 3349 *(*uint16_t)(unsafe.Pointer(bp + uintptr(brk+j)*2)) = uint16_t(0) 3350 } 3351 } 3352 for j = 0; j < 8; j++ { 3353 *(*uint8)(unsafe.Pointer(PostIncUintptr(&a, 1))) = uint8(int32(*(*uint16_t)(unsafe.Pointer(bp + uintptr(j)*2))) >> 8) 3354 *(*uint8)(unsafe.Pointer(PostIncUintptr(&a, 1))) = uint8(*(*uint16_t)(unsafe.Pointer(bp + uintptr(j)*2))) 3355 } 3356 if need_v4 != 0 && Xinet_pton(tls, 2, s, a-uintptr(4)) <= 0 { 3357 return 0 3358 } 3359 return 1 3360 } 3361 3362 func X__lookup_ipliteral(tls *TLS, buf uintptr, name uintptr, family int32) int32 { /* lookup_ipliteral.c:12:5: */ 3363 bp := tls.Alloc(88) 3364 defer tls.Free(88) 3365 3366 // var a4 in_addr at bp, 4 3367 3368 // var a6 in6_addr at bp+68, 16 3369 3370 if X__inet_aton(tls, name, bp) > 0 { 3371 if family == 10 { // wrong family 3372 return -2 3373 } 3374 Xmemcpy(tls, buf+8, bp, uint32(unsafe.Sizeof(in_addr{}))) 3375 (*address)(unsafe.Pointer(buf)).Ffamily = 2 3376 (*address)(unsafe.Pointer(buf)).Fscopeid = uint32(0) 3377 return 1 3378 } 3379 // var tmp [64]int8 at bp+4, 64 3380 3381 var p uintptr = Xstrchr(tls, name, '%') 3382 // var z uintptr at bp+84, 4 3383 3384 var scopeid uint64 = uint64(0) 3385 if p != 0 && (int32(p)-int32(name))/1 < 64 { 3386 Xmemcpy(tls, bp+4, name, uint32((int32(p)-int32(name))/1)) 3387 *(*int8)(unsafe.Pointer(bp + 4 + uintptr((int32(p)-int32(name))/1))) = int8(0) 3388 name = bp + 4 /* &tmp[0] */ 3389 } 3390 3391 if Xinet_pton(tls, 10, name, bp+68) <= 0 { 3392 return 0 3393 } 3394 if family == 2 { // wrong family 3395 return -2 3396 } 3397 3398 Xmemcpy(tls, buf+8, bp+68, uint32(unsafe.Sizeof(in6_addr{}))) 3399 (*address)(unsafe.Pointer(buf)).Ffamily = 10 3400 if p != 0 { 3401 if func() int32 { 3402 if 0 != 0 { 3403 return Xisdigit(tls, int32(*(*int8)(unsafe.Pointer(PreIncUintptr(&p, 1))))) 3404 } 3405 return Bool32(uint32(*(*int8)(unsafe.Pointer(PreIncUintptr(&p, 1))))-uint32('0') < uint32(10)) 3406 }() != 0 { 3407 scopeid = Xstrtoull(tls, p, bp+84, 10) 3408 } else { 3409 *(*uintptr)(unsafe.Pointer(bp + 84 /* z */)) = p - uintptr(1) 3410 } 3411 if *(*int8)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp + 84)))) != 0 { 3412 Xabort(tls) //TODO- 3413 // if (!IN6_IS_ADDR_LINKLOCAL(&a6) && 3414 // !IN6_IS_ADDR_MC_LINKLOCAL(&a6)) 3415 // return EAI_NONAME; 3416 // scopeid = if_nametoindex(p); 3417 // if (!scopeid) return EAI_NONAME; 3418 } 3419 if scopeid > uint64(0xffffffff) { 3420 return -2 3421 } 3422 } 3423 (*address)(unsafe.Pointer(buf)).Fscopeid = uint32(scopeid) 3424 return 1 3425 } 3426 3427 type mode_t = uint32 /* alltypes.h:175:18 */ 3428 3429 type flock = struct { 3430 Fl_type int16 3431 Fl_whence int16 3432 Fl_start off_t 3433 Fl_len off_t 3434 Fl_pid pid_t 3435 } /* fcntl.h:24:1 */ 3436 3437 func is_valid_hostname(tls *TLS, host uintptr) int32 { /* lookup_name.c:18:12: */ 3438 var s uintptr 3439 //TODO if (strnlen(host, 255)-1 >= 254 || mbstowcs(0, host, 0) == -1) return 0; 3440 if Xstrnlen(tls, host, uint32(255))-size_t(1) >= size_t(254) { 3441 return 0 3442 } 3443 for s = host; int32(*(*uint8)(unsafe.Pointer(s))) >= 0x80 || int32(*(*uint8)(unsafe.Pointer(s))) == '.' || int32(*(*uint8)(unsafe.Pointer(s))) == '-' || Xisalnum(tls, int32(*(*uint8)(unsafe.Pointer(s)))) != 0; s++ { 3444 } 3445 return BoolInt32(!(*(*uint8)(unsafe.Pointer(s)) != 0)) 3446 } 3447 3448 var Xzero_struct_address address /* lookup_name.c:27:16: */ 3449 3450 func name_from_null(tls *TLS, buf uintptr, name uintptr, family int32, flags int32) int32 { /* lookup_name.c:29:12: */ 3451 var cnt int32 = 0 3452 if name != 0 { 3453 return 0 3454 } 3455 if flags&0x01 != 0 { 3456 //TODO if (family != AF_INET6) 3457 //TODO buf[cnt++] = (struct address){ .family = AF_INET }; 3458 if family != 10 { 3459 var x = Xzero_struct_address 3460 x.Ffamily = 2 3461 *(*address)(unsafe.Pointer(buf + uintptr(PostIncInt32(&cnt, 1))*28)) = x 3462 } 3463 //TODO if (family != AF_INET) 3464 //TODO buf[cnt++] = (struct address){ .family = AF_INET6 }; 3465 if family != 2 { 3466 var x = Xzero_struct_address 3467 x.Ffamily = 10 3468 *(*address)(unsafe.Pointer(buf + uintptr(PostIncInt32(&cnt, 1))*28)) = x 3469 } 3470 } else { 3471 Xabort(tls) //TODO- 3472 // if (family != AF_INET6) 3473 // buf[cnt++] = (struct address){ .family = AF_INET, .addr = { 127,0,0,1 } }; 3474 // if (family != AF_INET) 3475 // buf[cnt++] = (struct address){ .family = AF_INET6, .addr = { [15] = 1 } }; 3476 } 3477 return cnt 3478 } 3479 3480 func name_from_numeric(tls *TLS, buf uintptr, name uintptr, family int32) int32 { /* lookup_name.c:58:12: */ 3481 return X__lookup_ipliteral(tls, buf, name, family) 3482 } 3483 3484 func name_from_hosts(tls *TLS, buf uintptr, canon uintptr, name uintptr, family int32) int32 { /* lookup_name.c:63:12: */ 3485 bp := tls.Alloc(512) 3486 defer tls.Free(512) 3487 3488 // var line [512]int8 at bp, 512 3489 3490 var l size_t = Xstrlen(tls, name) 3491 var cnt int32 = 0 3492 var badfam int32 = 0 3493 var _buf [1032]uint8 3494 _ = _buf 3495 //TODO FILE _f, *f = __fopen_rb_ca("/etc/hosts", &_f, _buf, sizeof _buf); 3496 var _f FILE 3497 _ = _f 3498 var f uintptr = Xfopen(tls, ts+74, ts+85) 3499 if !(f != 0) { 3500 switch *(*int32)(unsafe.Pointer(X___errno_location(tls))) { 3501 case 2: 3502 fallthrough 3503 case 20: 3504 fallthrough 3505 case 13: 3506 return 0 3507 fallthrough 3508 default: 3509 return -11 3510 } 3511 } 3512 for Xfgets(tls, bp, int32(unsafe.Sizeof([512]int8{})), f) != 0 && cnt < 48 { 3513 var p uintptr 3514 var z uintptr 3515 3516 if AssignUintptr(&p, Xstrchr(tls, bp, '#')) != 0 { 3517 *(*int8)(unsafe.Pointer(PostIncUintptr(&p, 1))) = int8('\n') 3518 *(*int8)(unsafe.Pointer(p)) = int8(0) 3519 } 3520 for p = bp + uintptr(1); AssignUintptr(&p, Xstrstr(tls, p, name)) != 0 && (!(__isspace(tls, int32(*(*int8)(unsafe.Pointer(p + UintptrFromInt32(-1))))) != 0) || !(__isspace(tls, int32(*(*int8)(unsafe.Pointer(p + uintptr(l))))) != 0)); p++ { 3521 } 3522 if !(p != 0) { 3523 continue 3524 } 3525 3526 // Isolate IP address to parse 3527 for p = bp; /* &line[0] */ *(*int8)(unsafe.Pointer(p)) != 0 && !(__isspace(tls, int32(*(*int8)(unsafe.Pointer(p)))) != 0); p++ { 3528 } 3529 *(*int8)(unsafe.Pointer(PostIncUintptr(&p, 1))) = int8(0) 3530 switch name_from_numeric(tls, buf+uintptr(cnt)*28, bp, family) { 3531 case 1: 3532 cnt++ 3533 break 3534 case 0: 3535 continue 3536 default: 3537 badfam = -2 3538 continue 3539 } 3540 3541 // Extract first name as canonical name 3542 for ; *(*int8)(unsafe.Pointer(p)) != 0 && __isspace(tls, int32(*(*int8)(unsafe.Pointer(p)))) != 0; p++ { 3543 } 3544 for z = p; *(*int8)(unsafe.Pointer(z)) != 0 && !(__isspace(tls, int32(*(*int8)(unsafe.Pointer(z)))) != 0); z++ { 3545 } 3546 *(*int8)(unsafe.Pointer(z)) = int8(0) 3547 if is_valid_hostname(tls, p) != 0 { 3548 Xmemcpy(tls, canon, p, uint32((int32(z)-int32(p))/1+1)) 3549 } 3550 } 3551 //TODO __fclose_ca(f); 3552 Xfclose(tls, f) 3553 if cnt != 0 { 3554 return cnt 3555 } 3556 return badfam 3557 } 3558 3559 type dpc_ctx = struct { 3560 Faddrs uintptr 3561 Fcanon uintptr 3562 Fcnt int32 3563 } /* lookup_name.c:112:1 */ 3564 3565 func name_from_dns_search(tls *TLS, buf uintptr, canon uintptr, name uintptr, family int32) int32 { /* lookup_name.c:191:12: */ 3566 return -1 //TODO- 3567 Xabort(tls) 3568 return int32(0) //TODO- 3569 // char search[256]; 3570 // struct resolvconf conf; 3571 // size_t l, dots; 3572 // char *p, *z; 3573 3574 // if (__get_resolv_conf(&conf, search, sizeof search) < 0) return -1; 3575 3576 // /* Count dots, suppress search when >=ndots or name ends in 3577 // * a dot, which is an explicit request for global scope. */ 3578 // for (dots=l=0; name[l]; l++) if (name[l]=='.') dots++; 3579 // if (dots >= conf.ndots || name[l-1]=='.') *search = 0; 3580 3581 // /* Strip final dot for canon, fail if multiple trailing dots. */ 3582 // if (name[l-1]=='.') l--; 3583 // if (!l || name[l-1]=='.') return EAI_NONAME; 3584 3585 // /* This can never happen; the caller already checked length. */ 3586 // if (l >= 256) return EAI_NONAME; 3587 3588 // /* Name with search domain appended is setup in canon[]. This both 3589 // * provides the desired default canonical name (if the requested 3590 // * name is not a CNAME record) and serves as a buffer for passing 3591 // * the full requested name to name_from_dns. */ 3592 // memcpy(canon, name, l); 3593 // canon[l] = '.'; 3594 3595 // for (p=search; *p; p=z) { 3596 // for (; isspace(*p); p++); 3597 // for (z=p; *z && !isspace(*z); z++); 3598 // if (z==p) break; 3599 // if (z-p < 256 - l - 1) { 3600 // memcpy(canon+l+1, p, z-p); 3601 // canon[z-p+1+l] = 0; 3602 // int cnt = name_from_dns(buf, canon, canon, family, &conf); 3603 // if (cnt) return cnt; 3604 // } 3605 // } 3606 3607 // canon[l] = 0; 3608 // return name_from_dns(buf, canon, name, family, &conf); 3609 } 3610 3611 type policy = struct { 3612 Faddr [16]uint8 3613 Flen uint8 3614 Fmask uint8 3615 Fprec uint8 3616 Flabel uint8 3617 } /* lookup_name.c:237:14 */ 3618 3619 var defpolicy = [6]policy{ 3620 {Faddr: *(*[16]uint8)(unsafe.Pointer(ts + 170)), Flen: uint8(15), Fmask: uint8(0xff), Fprec: uint8(50)}, 3621 {Faddr: *(*[16]uint8)(unsafe.Pointer(ts + 187)), Flen: uint8(11), Fmask: uint8(0xff), Fprec: uint8(35), Flabel: uint8(4)}, 3622 {Faddr: *(*[16]uint8)(unsafe.Pointer(ts + 203)), Flen: uint8(1), Fmask: uint8(0xff), Fprec: uint8(30), Flabel: uint8(2)}, 3623 {Faddr: *(*[16]uint8)(unsafe.Pointer(ts + 219)), Flen: uint8(3), Fmask: uint8(0xff), Fprec: uint8(5), Flabel: uint8(5)}, 3624 {Faddr: *(*[16]uint8)(unsafe.Pointer(ts + 235)), Fmask: uint8(0xfe), Fprec: uint8(3), Flabel: uint8(13)}, 3625 // Last rule must match all addresses to stop loop. 3626 {Faddr: *(*[16]uint8)(unsafe.Pointer(ts + 251)), Fprec: uint8(40), Flabel: uint8(1)}, 3627 } /* lookup_name.c:241:3 */ 3628 3629 func policyof(tls *TLS, a uintptr) uintptr { /* lookup_name.c:259:28: */ 3630 var i int32 3631 for i = 0; ; i++ { 3632 if Xmemcmp(tls, a, uintptr(unsafe.Pointer(&defpolicy))+uintptr(i)*20, uint32(defpolicy[i].Flen)) != 0 { 3633 continue 3634 } 3635 if int32(*(*uint8_t)(unsafe.Pointer(a + uintptr(defpolicy[i].Flen))))&int32(defpolicy[i].Fmask) != 3636 int32(*(*uint8)(unsafe.Pointer(uintptr(unsafe.Pointer(&defpolicy)) + uintptr(i)*20 + uintptr(defpolicy[i].Flen)))) { 3637 continue 3638 } 3639 return uintptr(unsafe.Pointer(&defpolicy)) + uintptr(i)*20 3640 } 3641 return uintptr(0) 3642 } 3643 3644 func labelof(tls *TLS, a uintptr) int32 { /* lookup_name.c:272:12: */ 3645 return int32((*policy)(unsafe.Pointer(policyof(tls, a))).Flabel) 3646 } 3647 3648 func scopeof(tls *TLS, a uintptr) int32 { /* lookup_name.c:277:12: */ 3649 if int32(*(*uint8_t)(unsafe.Pointer(a))) == 0xff { 3650 return int32(*(*uint8_t)(unsafe.Pointer(a + 1))) & 15 3651 } 3652 if int32(*(*uint8_t)(unsafe.Pointer(a))) == 0xfe && int32(*(*uint8_t)(unsafe.Pointer(a + 1)))&0xc0 == 0x80 { 3653 return 2 3654 } 3655 if *(*uint32_t)(unsafe.Pointer(a)) == uint32_t(0) && *(*uint32_t)(unsafe.Pointer(a + 1*4)) == uint32_t(0) && *(*uint32_t)(unsafe.Pointer(a + 2*4)) == uint32_t(0) && int32(*(*uint8_t)(unsafe.Pointer(a + 12))) == 0 && int32(*(*uint8_t)(unsafe.Pointer(a + 13))) == 0 && int32(*(*uint8_t)(unsafe.Pointer(a + 14))) == 0 && int32(*(*uint8_t)(unsafe.Pointer(a + 15))) == 1 { 3656 return 2 3657 } 3658 if int32(*(*uint8_t)(unsafe.Pointer(a))) == 0xfe && int32(*(*uint8_t)(unsafe.Pointer(a + 1)))&0xc0 == 0xc0 { 3659 return 5 3660 } 3661 return 14 3662 } 3663 3664 func prefixmatch(tls *TLS, s uintptr, d uintptr) int32 { /* lookup_name.c:286:12: */ 3665 // FIXME: The common prefix length should be limited to no greater 3666 // than the nominal length of the prefix portion of the source 3667 // address. However the definition of the source prefix length is 3668 // not clear and thus this limiting is not yet implemented. 3669 var i uint32 3670 for i = uint32(0); i < uint32(128) && !((int32(*(*uint8_t)(unsafe.Pointer(s /* &.__in6_union */ /* &.__s6_addr */ + uintptr(i/uint32(8)))))^int32(*(*uint8_t)(unsafe.Pointer(d /* &.__in6_union */ /* &.__s6_addr */ + uintptr(i/uint32(8))))))&(int32(128)>>(i%uint32(8))) != 0); i++ { 3671 } 3672 return int32(i) 3673 } 3674 3675 func addrcmp(tls *TLS, _a uintptr, _b uintptr) int32 { /* lookup_name.c:305:12: */ 3676 var a uintptr = _a 3677 var b uintptr = _b 3678 return (*address)(unsafe.Pointer(b)).Fsortkey - (*address)(unsafe.Pointer(a)).Fsortkey 3679 } 3680 3681 func X__lookup_name(tls *TLS, buf uintptr, canon uintptr, name uintptr, family int32, flags int32) int32 { /* lookup_name.c:311:5: */ 3682 bp := tls.Alloc(92) 3683 defer tls.Free(92) 3684 3685 var cnt int32 = 0 3686 var i int32 3687 var j int32 3688 _ = j 3689 3690 *(*int8)(unsafe.Pointer(canon)) = int8(0) 3691 if name != 0 { 3692 // reject empty name and check len so it fits into temp bufs 3693 var l size_t = Xstrnlen(tls, name, uint32(255)) 3694 if l-size_t(1) >= size_t(254) { 3695 return -2 3696 } 3697 Xmemcpy(tls, canon, name, l+size_t(1)) 3698 } 3699 3700 // Procedurally, a request for v6 addresses with the v4-mapped 3701 // flag set is like a request for unspecified family, followed 3702 // by filtering of the results. 3703 if flags&0x08 != 0 { 3704 if family == 10 { 3705 family = 0 3706 } else { 3707 flags = flags - 0x08 3708 } 3709 } 3710 3711 // Try each backend until there's at least one result. 3712 cnt = name_from_null(tls, buf, name, family, flags) 3713 if !(cnt != 0) { 3714 cnt = name_from_numeric(tls, buf, name, family) 3715 } 3716 if !(cnt != 0) && !(flags&0x04 != 0) { 3717 cnt = name_from_hosts(tls, buf, canon, name, family) 3718 if !(cnt != 0) { 3719 cnt = name_from_dns_search(tls, buf, canon, name, family) 3720 } 3721 } 3722 if cnt <= 0 { 3723 if cnt != 0 { 3724 return cnt 3725 } 3726 return -2 3727 } 3728 3729 // Filter/transform results for v4-mapped lookup, if requested. 3730 if flags&0x08 != 0 { 3731 Xabort(tls) //TODO- 3732 // if (!(flags & AI_ALL)) { 3733 // /* If any v6 results exist, remove v4 results. */ 3734 // for (i=0; i<cnt && buf[i].family != AF_INET6; i++); 3735 // if (i<cnt) { 3736 // for (j=0; i<cnt; i++) { 3737 // if (buf[i].family == AF_INET6) 3738 // buf[j++] = buf[i]; 3739 // } 3740 // cnt = i = j; 3741 // } 3742 // } 3743 // /* Translate any remaining v4 results to v6 */ 3744 // for (i=0; i<cnt; i++) { 3745 // if (buf[i].family != AF_INET) continue; 3746 // memcpy(buf[i].addr+12, buf[i].addr, 4); 3747 // memcpy(buf[i].addr, "\0\0\0\0\0\0\0\0\0\0\xff\xff", 12); 3748 // buf[i].family = AF_INET6; 3749 // } 3750 } 3751 3752 // No further processing is needed if there are fewer than 2 3753 // results or if there are only IPv4 results. 3754 if cnt < 2 || family == 2 { 3755 return cnt 3756 } 3757 for i = 0; i < cnt; i++ { 3758 if (*address)(unsafe.Pointer(buf+uintptr(i)*28)).Ffamily != 2 { 3759 break 3760 } 3761 } 3762 if i == cnt { 3763 return cnt 3764 } 3765 var cs int32 3766 _ = cs 3767 //TODO pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs); 3768 3769 // The following implements a subset of RFC 3484/6724 destination 3770 // address selection by generating a single 31-bit sort key for 3771 // each address. Rules 3, 4, and 7 are omitted for having 3772 // excessive runtime and code size cost and dubious benefit. 3773 // So far the label/precedence table cannot be customized. 3774 for i = 0; i < cnt; i++ { 3775 var family int32 = (*address)(unsafe.Pointer(buf + uintptr(i)*28)).Ffamily 3776 var key int32 = 0 3777 *(*sockaddr_in6)(unsafe.Pointer(bp + 28 /* sa6 */)) = sockaddr_in6{} 3778 *(*sockaddr_in6)(unsafe.Pointer(bp /* da6 */)) = sockaddr_in6{Fsin6_family: sa_family_t(10), Fsin6_port: in_port_t(65535), Fsin6_scope_id: (*address)(unsafe.Pointer(buf + uintptr(i)*28)).Fscopeid} 3779 *(*sockaddr_in)(unsafe.Pointer(bp + 72 /* sa4 */)) = sockaddr_in{} 3780 *(*sockaddr_in)(unsafe.Pointer(bp + 56 /* da4 */)) = sockaddr_in{Fsin_family: sa_family_t(2), Fsin_port: in_port_t(65535)} 3781 var sa1 uintptr 3782 var da uintptr 3783 // var salen socklen_t at bp+88, 4 3784 3785 var dalen socklen_t 3786 if family == 10 { 3787 Xmemcpy(tls, bp+8, buf+uintptr(i)*28+8, uint32(16)) 3788 da = bp /* &da6 */ 3789 dalen = socklen_t(unsafe.Sizeof(sockaddr_in6{})) 3790 sa1 = bp + 28 /* &sa6 */ 3791 *(*socklen_t)(unsafe.Pointer(bp + 88 /* salen */)) = socklen_t(unsafe.Sizeof(sockaddr_in6{})) 3792 } else { 3793 Xmemcpy(tls, bp+28+8, 3794 ts+88, uint32(12)) 3795 Xmemcpy(tls, bp+8+uintptr(12), buf+uintptr(i)*28+8, uint32(4)) 3796 Xmemcpy(tls, bp+8, 3797 ts+88, uint32(12)) 3798 Xmemcpy(tls, bp+8+uintptr(12), buf+uintptr(i)*28+8, uint32(4)) 3799 Xmemcpy(tls, bp+56+4, buf+uintptr(i)*28+8, uint32(4)) 3800 da = bp + 56 /* &da4 */ 3801 dalen = socklen_t(unsafe.Sizeof(sockaddr_in{})) 3802 sa1 = bp + 72 /* &sa4 */ 3803 *(*socklen_t)(unsafe.Pointer(bp + 88 /* salen */)) = socklen_t(unsafe.Sizeof(sockaddr_in{})) 3804 } 3805 var dpolicy uintptr = policyof(tls, bp+8) 3806 var dscope int32 = scopeof(tls, bp+8) 3807 var dlabel int32 = int32((*policy)(unsafe.Pointer(dpolicy)).Flabel) 3808 var dprec int32 = int32((*policy)(unsafe.Pointer(dpolicy)).Fprec) 3809 var prefixlen int32 = 0 3810 var fd int32 = Xsocket(tls, family, 2|02000000, 17) 3811 if fd >= 0 { 3812 if !(Xconnect(tls, fd, da, dalen) != 0) { 3813 key = key | 0x40000000 3814 if !(Xgetsockname(tls, fd, sa1, bp+88) != 0) { 3815 if family == 2 { 3816 Xmemcpy(tls, 3817 bp+28+8+uintptr(12), 3818 bp+72+4, uint32(4)) 3819 } 3820 if dscope == scopeof(tls, bp+28+8) { 3821 key = key | 0x20000000 3822 } 3823 if dlabel == labelof(tls, bp+28+8) { 3824 key = key | 0x10000000 3825 } 3826 prefixlen = prefixmatch(tls, bp+28+8, 3827 bp+8) 3828 } 3829 } 3830 Xclose(tls, fd) 3831 } 3832 key = key | dprec<<20 3833 key = key | (15-dscope)<<16 3834 key = key | prefixlen<<8 3835 key = key | (48-i)<<0 3836 (*address)(unsafe.Pointer(buf + uintptr(i)*28)).Fsortkey = key 3837 } 3838 Xqsort(tls, buf, uint32(cnt), uint32(unsafe.Sizeof(address{})), *(*uintptr)(unsafe.Pointer(&struct { 3839 f func(*TLS, uintptr, uintptr) int32 3840 }{addrcmp}))) 3841 3842 //TODO pthread_setcancelstate(cs, 0); 3843 3844 return cnt 3845 } 3846 3847 func X__lookup_serv(tls *TLS, buf uintptr, name uintptr, proto int32, socktype int32, flags int32) int32 { /* lookup_serv.c:12:5: */ 3848 bp := tls.Alloc(4) 3849 defer tls.Free(4) 3850 3851 var line [128]int8 3852 _ = line 3853 var cnt int32 = 0 3854 var p uintptr 3855 _ = p 3856 *(*uintptr)(unsafe.Pointer(bp /* z */)) = ts + 13 /* "" */ 3857 var port uint32 = uint32(0) 3858 3859 switch socktype { 3860 case 1: 3861 switch proto { 3862 case 0: 3863 proto = 6 3864 fallthrough 3865 case 6: 3866 break 3867 default: 3868 return -8 3869 } 3870 break 3871 case 2: 3872 switch proto { 3873 case 0: 3874 proto = 17 3875 fallthrough 3876 case 17: 3877 break 3878 default: 3879 return -8 3880 } 3881 fallthrough 3882 case 0: 3883 break 3884 default: 3885 if name != 0 { 3886 return -8 3887 } 3888 (*service)(unsafe.Pointer(buf)).Fport = uint16_t(0) 3889 (*service)(unsafe.Pointer(buf)).Fproto = uint8(proto) 3890 (*service)(unsafe.Pointer(buf)).Fsocktype = uint8(socktype) 3891 return 1 3892 } 3893 3894 if name != 0 { 3895 if !(int32(*(*int8)(unsafe.Pointer(name))) != 0) { 3896 return -8 3897 } 3898 port = Xstrtoul(tls, name, bp, 10) 3899 } 3900 if !(int32(*(*int8)(unsafe.Pointer(*(*uintptr)(unsafe.Pointer(bp))))) != 0) { 3901 if port > uint32(65535) { 3902 return -8 3903 } 3904 if proto != 17 { 3905 (*service)(unsafe.Pointer(buf + uintptr(cnt)*4)).Fport = uint16_t(port) 3906 (*service)(unsafe.Pointer(buf + uintptr(cnt)*4)).Fsocktype = uint8(1) 3907 (*service)(unsafe.Pointer(buf + uintptr(PostIncInt32(&cnt, 1))*4)).Fproto = uint8(6) 3908 } 3909 if proto != 6 { 3910 (*service)(unsafe.Pointer(buf + uintptr(cnt)*4)).Fport = uint16_t(port) 3911 (*service)(unsafe.Pointer(buf + uintptr(cnt)*4)).Fsocktype = uint8(2) 3912 (*service)(unsafe.Pointer(buf + uintptr(PostIncInt32(&cnt, 1))*4)).Fproto = uint8(17) 3913 } 3914 return cnt 3915 } 3916 3917 if flags&0x400 != 0 { 3918 return -2 3919 } 3920 3921 var l size_t = Xstrlen(tls, name) 3922 _ = l 3923 3924 Xabort(tls) //TODO- 3925 // unsigned char _buf[1032]; 3926 // FILE _f, *f = __fopen_rb_ca("/etc/services", &_f, _buf, sizeof _buf); 3927 // if (!f) switch (errno) { 3928 // case ENOENT: 3929 // case ENOTDIR: 3930 // case EACCES: 3931 // return EAI_SERVICE; 3932 // default: 3933 // return EAI_SYSTEM; 3934 // } 3935 3936 Xabort(tls) //TODO- 3937 // while (fgets(line, sizeof line, f) && cnt < MAXSERVS) { 3938 // if ((p=strchr(line, '#'))) *p++='\n', *p=0; 3939 3940 // /* Find service name */ 3941 // for(p=line; (p=strstr(p, name)); p++) { 3942 // if (p>line && !isspace(p[-1])) continue; 3943 // if (p[l] && !isspace(p[l])) continue; 3944 // break; 3945 // } 3946 // if (!p) continue; 3947 3948 // /* Skip past canonical name at beginning of line */ 3949 // for (p=line; *p && !isspace(*p); p++); 3950 3951 // port = strtoul(p, &z, 10); 3952 // if (port > 65535 || z==p) continue; 3953 // if (!strncmp(z, "/udp", 4)) { 3954 // if (proto == IPPROTO_TCP) continue; 3955 // buf[cnt].port = port; 3956 // buf[cnt].socktype = SOCK_DGRAM; 3957 // buf[cnt++].proto = IPPROTO_UDP; 3958 // } 3959 // if (!strncmp(z, "/tcp", 4)) { 3960 // if (proto == IPPROTO_UDP) continue; 3961 // buf[cnt].port = port; 3962 // buf[cnt].socktype = SOCK_STREAM; 3963 // buf[cnt++].proto = IPPROTO_TCP; 3964 // } 3965 // } 3966 // __fclose_ca(f); 3967 // return cnt > 0 ? cnt : EAI_SERVICE; 3968 Xabort(tls) 3969 return int32(0) //TODO- 3970 } 3971 3972 func X__toread(tls *TLS, f uintptr) int32 { /* __toread.c:3:5: */ 3973 *(*int32)(unsafe.Pointer(f + 72)) |= (*FILE)(unsafe.Pointer(f)).Fmode - 1 3974 if (*FILE)(unsafe.Pointer(f)).Fwpos != (*FILE)(unsafe.Pointer(f)).Fwbase { 3975 (*struct { 3976 f func(*TLS, uintptr, uintptr, size_t) size_t 3977 })(unsafe.Pointer(&struct{ uintptr }{(*FILE)(unsafe.Pointer(f)).Fwrite})).f(tls, f, uintptr(0), uint32(0)) 3978 } 3979 (*FILE)(unsafe.Pointer(f)).Fwpos = AssignPtrUintptr(f+28, AssignPtrUintptr(f+16, uintptr(0))) 3980 if (*FILE)(unsafe.Pointer(f)).Fflags&uint32(4) != 0 { 3981 *(*uint32)(unsafe.Pointer(f)) |= uint32(32) 3982 return -1 3983 } 3984 (*FILE)(unsafe.Pointer(f)).Frpos = AssignPtrUintptr(f+8, (*FILE)(unsafe.Pointer(f)).Fbuf+uintptr((*FILE)(unsafe.Pointer(f)).Fbuf_size)) 3985 if (*FILE)(unsafe.Pointer(f)).Fflags&uint32(16) != 0 { 3986 return -1 3987 } 3988 return 0 3989 } 3990 3991 func X__toread_needs_stdio_exit(tls *TLS) { /* __toread.c:16:13: */ 3992 X__builtin_abort(tls) //TODO- 3993 // __stdio_exit_needed(); 3994 } 3995 3996 // This function assumes it will never be called if there is already 3997 // data buffered for reading. 3998 3999 func X__uflow(tls *TLS, f uintptr) int32 { /* __uflow.c:6:5: */ 4000 bp := tls.Alloc(1) 4001 defer tls.Free(1) 4002 4003 // var c uint8 at bp, 1 4004 4005 if !(X__toread(tls, f) != 0) && (*struct { 4006 f func(*TLS, uintptr, uintptr, size_t) size_t 4007 })(unsafe.Pointer(&struct{ uintptr }{(*FILE)(unsafe.Pointer(f)).Fread})).f(tls, f, bp, uint32(1)) == size_t(1) { 4008 return int32(*(*uint8)(unsafe.Pointer(bp))) 4009 } 4010 return -1 4011 } 4012 4013 func Xbsearch(tls *TLS, key uintptr, base uintptr, nel size_t, width size_t, cmp uintptr) uintptr { /* bsearch.c:3:6: */ 4014 var try uintptr 4015 var sign int32 4016 for nel > size_t(0) { 4017 try = base + uintptr(width*(nel/size_t(2))) 4018 sign = (*struct { 4019 f func(*TLS, uintptr, uintptr) int32 4020 })(unsafe.Pointer(&struct{ uintptr }{cmp})).f(tls, key, try) 4021 if sign < 0 { 4022 nel = nel / size_t(2) 4023 } else if sign > 0 { 4024 base = try + uintptr(width) 4025 nel = nel - (nel/size_t(2) + size_t(1)) 4026 } else { 4027 return try 4028 } 4029 } 4030 return uintptr(0) 4031 } 4032 4033 func strtox(tls *TLS, s uintptr, p uintptr, prec int32) float64 { /* strtod.c:6:20: */ 4034 bp := tls.Alloc(136) 4035 defer tls.Free(136) 4036 4037 // var f FILE at bp, 136 4038 4039 (*FILE)(unsafe.Pointer(bp)).Fbuf = AssignPtrUintptr(bp+4, s) 4040 (*FILE)(unsafe.Pointer(bp)).Frend = UintptrFromInt32(-1) 4041 X__shlim(tls, bp, int64(0)) 4042 var y float64 = X__floatscan(tls, bp, prec, 1) 4043 var cnt off_t = (*FILE)(unsafe.Pointer(bp)).Fshcnt + off_t((int32((*FILE)(unsafe.Pointer(bp)).Frpos)-int32((*FILE)(unsafe.Pointer(bp)).Fbuf))/1) 4044 if p != 0 { 4045 *(*uintptr)(unsafe.Pointer(p)) = func() uintptr { 4046 if cnt != 0 { 4047 return s + uintptr(cnt) 4048 } 4049 return s 4050 }() 4051 } 4052 return y 4053 } 4054 4055 func Xstrtof(tls *TLS, s uintptr, p uintptr) float32 { /* strtod.c:17:7: */ 4056 return float32(strtox(tls, s, p, 0)) 4057 } 4058 4059 func Xstrtod(tls *TLS, s uintptr, p uintptr) float64 { /* strtod.c:22:8: */ 4060 return strtox(tls, s, p, 1) 4061 } 4062 4063 func Xstrtold(tls *TLS, s uintptr, p uintptr) float64 { /* strtod.c:27:13: */ 4064 return strtox(tls, s, p, 2) 4065 } 4066 4067 func strtox1(tls *TLS, s uintptr, p uintptr, base int32, lim uint64) uint64 { /* strtol.c:8:27: */ 4068 bp := tls.Alloc(136) 4069 defer tls.Free(136) 4070 4071 // var f FILE at bp, 136 4072 4073 (*FILE)(unsafe.Pointer(bp)).Fbuf = AssignPtrUintptr(bp+4, s) 4074 (*FILE)(unsafe.Pointer(bp)).Frend = UintptrFromInt32(-1) 4075 X__shlim(tls, bp, int64(0)) 4076 var y uint64 = X__intscan(tls, bp, uint32(base), 1, lim) 4077 if p != 0 { 4078 var cnt size_t = size_t((*FILE)(unsafe.Pointer(bp)).Fshcnt + off_t((int32((*FILE)(unsafe.Pointer(bp)).Frpos)-int32((*FILE)(unsafe.Pointer(bp)).Fbuf))/1)) 4079 *(*uintptr)(unsafe.Pointer(p)) = s + uintptr(cnt) 4080 } 4081 return y 4082 } 4083 4084 func Xstrtoull(tls *TLS, s uintptr, p uintptr, base int32) uint64 { /* strtol.c:21:20: */ 4085 return strtox1(tls, s, p, base, 2*uint64(0x7fffffffffffffff)+uint64(1)) 4086 } 4087 4088 func Xstrtoll(tls *TLS, s uintptr, p uintptr, base int32) int64 { /* strtol.c:26:11: */ 4089 return int64(strtox1(tls, s, p, base, Uint64FromInt64(-0x7fffffffffffffff-int64(1)))) 4090 } 4091 4092 func Xstrtoul(tls *TLS, s uintptr, p uintptr, base int32) uint32 { /* strtol.c:31:15: */ 4093 return uint32(strtox1(tls, s, p, base, uint64(2*uint32(0x7fffffff)+uint32(1)))) 4094 } 4095 4096 func Xstrtol(tls *TLS, s uintptr, p uintptr, base int32) int32 { /* strtol.c:36:6: */ 4097 return int32(strtox1(tls, s, p, base, uint64(0+Uint32FromInt32(Int32(-Int32(0x7fffffff))-Int32FromInt32(1))))) 4098 } 4099 4100 func Xstrtoimax(tls *TLS, s uintptr, p uintptr, base int32) intmax_t { /* strtol.c:41:10: */ 4101 return Xstrtoll(tls, s, p, base) 4102 } 4103 4104 func Xstrtoumax(tls *TLS, s uintptr, p uintptr, base int32) uintmax_t { /* strtol.c:46:11: */ 4105 return Xstrtoull(tls, s, p, base) 4106 } 4107 4108 func Xstrdup(tls *TLS, s uintptr) uintptr { /* strdup.c:4:6: */ 4109 var l size_t = Xstrlen(tls, s) 4110 var d uintptr = Xmalloc(tls, l+size_t(1)) 4111 if !(d != 0) { 4112 return uintptr(0) 4113 } 4114 return Xmemcpy(tls, d, s, l+size_t(1)) 4115 } 4116 4117 func Xstrnlen(tls *TLS, s uintptr, n size_t) size_t { /* strnlen.c:3:8: */ 4118 var p uintptr = Xmemchr(tls, s, 0, n) 4119 if p != 0 { 4120 return uint32((int32(p) - int32(s)) / 1) 4121 } 4122 return n 4123 } 4124 4125 func Xstrspn(tls *TLS, s uintptr, c uintptr) size_t { /* strspn.c:6:8: */ 4126 bp := tls.Alloc(32) 4127 defer tls.Free(32) 4128 4129 var a uintptr = s 4130 *(*[8]size_t)(unsafe.Pointer(bp /* byteset */)) = [8]size_t{0: size_t(0)} 4131 4132 if !(int32(*(*int8)(unsafe.Pointer(c))) != 0) { 4133 return size_t(0) 4134 } 4135 if !(int32(*(*int8)(unsafe.Pointer(c + 1))) != 0) { 4136 for ; int32(*(*int8)(unsafe.Pointer(s))) == int32(*(*int8)(unsafe.Pointer(c))); s++ { 4137 } 4138 return size_t((int32(s) - int32(a)) / 1) 4139 } 4140 4141 for ; *(*int8)(unsafe.Pointer(c)) != 0 && AssignOrPtrUint32(bp+uintptr(size_t(*(*uint8)(unsafe.Pointer(c)))/(uint32(8)*uint32(unsafe.Sizeof(size_t(0)))))*4, size_t(size_t(1))<<(size_t(*(*uint8)(unsafe.Pointer(c)))%(uint32(8)*uint32(unsafe.Sizeof(size_t(0)))))) != 0; c++ { 4142 } 4143 for ; *(*int8)(unsafe.Pointer(s)) != 0 && *(*size_t)(unsafe.Pointer(bp + uintptr(size_t(*(*uint8)(unsafe.Pointer(s)))/(uint32(8)*uint32(unsafe.Sizeof(size_t(0)))))*4))&(size_t(size_t(1))<<(size_t(*(*uint8)(unsafe.Pointer(s)))%(uint32(8)*uint32(unsafe.Sizeof(size_t(0)))))) != 0; s++ { 4144 } 4145 return size_t((int32(s) - int32(a)) / 1) 4146 } 4147 4148 func init() { 4149 *(*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&X_ctype_)) + 0)) = uintptr(unsafe.Pointer(&X_C_ctype_)) // ctype_.c:319:23: 4150 } 4151 4152 var ts1 = "infinity\x00nan\x00\x00\x00\x01\x02\x04\a\x03\x06\x05\x00%d.%d.%d.%d.in-addr.arpa\x00ip6.arpa\x000123456789abcdef\x00/etc/hosts\x00rb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00%d.%d.%d.%d\x00%x:%x:%x:%x:%x:%x:%x:%x\x00%x:%x:%x:%x:%x:%x:%d.%d.%d.%d\x00:0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00 \x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" 4153 var ts = (*reflect.StringHeader)(unsafe.Pointer(&ts1)).Data