Skip to content

fix(libc): format strftime and asctime fields as measured on a PS5 - #10129

Merged
oneandonlydean merged 19 commits into
boykopovar:mainfrom
orezraey:fix/libc-strftime-measured-ps5
Oct 25, 2026
Merged

oneandonlydean merged 19 commits into
boykopovar:mainfrom
orezraey:fix/libc-strftime-measured-ps5

Conversation

@orezraey

@orezraey orezraey commented Oct 23, 2026 •

Copy link
Copy Markdown
Contributor

What

strftime and asctime measured on a retail PS5 (firmware 13.60) with five homebrew probes calling libSceLibcInternal.sprx from a payload process. The sources and console logs are in this gist (strf to strf4).

strftime was FreeBSD's; the console's is a different implementation. It now follows the console:

Input Console Before
%k, %l, %P, %s, %+, %v, %Q and any other unknown conversion copied as written (%k) formatted as FreeBSD (%k → 13), or the letter alone (%Q → Q)
flags and widths (%-d, %_d, %0e, %^a, %#b, %10Y) copied as written applied
E or O before a conversion ignored (%Ec = %c); before an unknown one dropped (%EE → %E, %Ek → %k) the same for known ones; %EE → EE
a negative weekday or month Sun or Jan, also for %A and %B; %m 00 ?
weekday 7+ or month 12+ empty name; %m 13, 14, …; %u and %w the value mod 10 ?
a negative numeric field (%d, %e, %H, %I, %M, %S, %j, %U, %W) 0 the negative number
a field of 100 or more wraps at 100 (%j at 1000): %H of 101 is 01 printed in full
%I (hour + 11) % 12 + 1, so hour -1 is 11 and -12 is 00 hour % 12 or 12
%Y, %G the year mod 10000, and 0000 before year 0 the full year, signed
%y, %g the last two digits, also for negative years (year -1 → 99) the same, with a sign in places
%C tm_year / 100 + 19 mod 100 (year 1 → 01, year 10001 → 00) the year / 100
%U, %W the weekday is (tm_wday + 7) % 7 and (tm_wday + 6) % 7 with the C remainder, so weekday 9 counts as 2 and -19 as -5 from tm_wday as given
%z the guest zone's offset, one hour later when tm_isdst is positive; tm_gmtoff ignored, also printed for tm_isdst -1 tm_gmtoff, nothing for tm_isdst -1
%Z tzname[tm_isdst > 0]; tm_zone ignored tm_zone, else tzname
a conversion that does not fit not written at all (ab%Ycd in 5 bytes writes only ab) and the call returns 0; a composite is written part by part (%t%D in 8 bytes leaves \t10/02/) written up to the limit

%c is %a %b %e %H:%M:%S %Y, %x and %D are %m/%d/%y, and %r is %I:%M:%S %p, as before.

asctime uses the same field rules: "%s %s%3d %02d:%02d:%02d %04d\n" with those names, day, time and year (Fri Oct 56 00:61:61 2026 for day 123456 and hour -10, year 10000 as 0000). Before, the year was printed in full and an out-of-range name was ???.

Not followed:

  • The console crashed the probe on a format ending in %E or %O; here that throws.
  • %G, %g and %V throw for a negative tm_yday. The console gave %V 01, 00, 00 and 52 for tm_yday -25, -13, -12 and -1 with tm_wday 5, and 52 for -10 with tm_wday 4; neither FreeBSD's ISO-week loop nor the variants I tried reproduce these, so the rule is unknown. They also throw for a tm_yday past the end of the year and a tm_wday below -6: tm_yday 400 of 2026 rolls into week 01 of 2027, but 415 of 1997 stays week 59 and 365 of 2013 week 53, and tm_wday -12 with tm_yday 18 is week 04 where FreeBSD's loop gives 03 (JJenkx, ntamas94). Every ISO case inside the year with tm_wday from -6 up matches, including the year boundaries. The ISO-week arithmetic is now 64-bit, so out-of-range fields no longer overflow.
  • %Z prints tzname. The console's tzname and %Z were both empty in the payload process; AnyPS5's tzname keeps the host's names (separate debt entry).

The debt entries record all of these, and that fegetexceptflag with a mask wider than 0x3f, which now also stores MXCSR control bits, was not measured.

The fetestexcept change moved to #10175 and the memmem/memccpy note to #10176, as requested in review.

Tested

  • Head after merging main (f26434afa3, with refactor(libs): add full export headers for libs #10706): 6b1962e978. The test takes its declarations from libc/include/Api.hpp. guest_crt, guest_mktime, guest_strftime, guest_time_conversion, guest_time_extras and guest_wide_formatting pass three runs in a row on Windows (MinGW) and on Linux (WSL Ubuntu, GCC); public_headers audit and check_conventions pass.
    Windows 11, MinGW (winlibs), at head c1ce36f9ee: this branch with current main (938812df14) merged in and docs(libc): record nearbyintf, getw, putw, __isfinitel and _FSinh measured on a PS5 #10134's commit 2151929559 kept.
  • guest_strftime is rewritten from the console logs: the conversions, the alternative forms, weekday and month -3 to 14, fields from -25 to 123456, years from -12345 to 12345, 14 ISO-week cases, the buffer limits and asctime. On main it reports 47 mismatches.
  • guest_time_conversion now checks the console's handling of the unknown and modified conversions, in place of FreeBSD's.
  • Since 974e0a89f2, guest_strftime also checks %U and %W on the ten out-of-range rows JJenkx and ntamas94 posted and the two composite rows that do not fit (%t%D in 8 bytes, %X%#H in 2); with the Time.cpp before that commit it reports 5 failures. The unknown ISO cases are not pinned in tests (removed in 68a4482acd at oneandonlydean's request); they still throw in Time.cpp with their debt entry.
  • guest_strftime, guest_time_conversion, guest_wide_formatting, guest_crt, guest_mktime and guest_time_extras pass three runs in a row. git diff --check is clean.
  • tools/check_conventions.py passes.

Checklist

@github-actions

github-actions Bot commented Oct 23, 2026 •

Copy link
Copy Markdown

Progress report (cf528e7 → 6b1962e)

📉 System libraries: 48.79% (-0.01%, -1 reverted functions)

⚠️ 1 went back to stubs
Library Name
libc libc_strftime_nid_postfix

Changed libraries (implemented exports)

Library Before After Change
libc 1338/1348 (99.26%) 1337/1348 (99.18%) -0.07 pp

@MarcZX10 MarcZX10 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The linked probe reports substantive strftime/asctime differences and the test matrix is broad. GCC 12.2 syntax checks passed for the changed source and tests; exact-worktree conventions, diff-check, and main-sync also pass (6 ahead/29 behind; merge clean). The author reports seven related Windows CTests passing three times; I did not run the full CTest suite locally. Please split the independent fetestexcept implementation/test/debt change into a separate topic PR from the strftime/asctime implementation, as required by the repository’s one-branch-per-topic rule. The non-exported memmem/memccpy note is also separate from this formatter behavior and should move to a focused documentation change if retained. In addition, coordinate the debt-file integration with #10134: the pairwise heads conflict in the guest-time-conversion / __isfinitel section. Refresh the formatter branch, rerun its focused tests and overlap/convention checks, and retain the measured probe caveats.

@github-actions

github-actions Bot commented Oct 23, 2026 •

Copy link
Copy Markdown

Other open pull requests touch the same code. Merging one will break the other, or both implement the same thing. If this one builds on them, list them in Depends on.

Pull request Conflicting files (lines on main) Same exports Same new files
PR 9613 docs/dev/debt/libc.md L13-14
PR 10742 docs/dev/debt/libc.md L70-71
PR 10787 docs/dev/debt/libc.md L71

Some comparisons could not be completed because a pull request conflicts with the base branch. Review these shared files manually before concluding that there is no overlap.

Pull request Shared files not compared
PR 3965 docs/dev/debt/libc.md
PR 5021 core/libs/prx/libc/src/Time.cpp
docs/dev/debt/libc.md
PR 7081 docs/dev/debt/libc.md
PR 7201 core/libs/prx/libc/src/Time.cpp
PR 7544 docs/dev/debt/libc.md
PR 7648 docs/dev/debt/libc.md
PR 7715 docs/dev/debt/libc.md
PR 8150 docs/dev/debt/libc.md
PR 8417 docs/dev/debt/libc.md
PR 9133 docs/dev/debt/libc.md
PR 9269 docs/dev/debt/libc.md
PR 9371 docs/dev/debt/libc.md
PR 9408 docs/dev/debt/libc.md
PR 9447 core/libs/prx/libc/src/Time.cpp
docs/dev/debt/libc.md
PR 9499 docs/dev/debt/libc.md
PR 9526 docs/dev/debt/libc.md
PR 9527 docs/dev/debt/libc.md
PR 9552 docs/dev/debt/libc.md
PR 9648 docs/dev/debt/libc.md
PR 9669 docs/dev/debt/libc.md
PR 9677 core/libs/prx/libc/src/Time.cpp
docs/dev/debt/libc.md
PR 9863 docs/dev/debt/libc.md
PR 9867 docs/dev/debt/libc.md
PR 9873 docs/dev/debt/libc.md
PR 9929 docs/dev/debt/libc.md
PR 9973 docs/dev/debt/libc.md
PR 10229 docs/dev/debt/libc.md
PR 10234 docs/dev/debt/libc.md
PR 10245 docs/dev/debt/libc.md
PR 10247 docs/dev/debt/libc.md
PR 10250 docs/dev/debt/libc.md
PR 10253 docs/dev/debt/libc.md
PR 10265 docs/dev/debt/libc.md
PR 10283 docs/dev/debt/libc.md
PR 10316 docs/dev/debt/libc.md
PR 10317 docs/dev/debt/libc.md
PR 10321 docs/dev/debt/libc.md
PR 10324 docs/dev/debt/libc.md
PR 10349 docs/dev/debt/libc.md
PR 10405 docs/dev/debt/libc.md
PR 10460 docs/dev/debt/libc.md
PR 10505 docs/dev/debt/libc.md
PR 10506 docs/dev/debt/libc.md
PR 10529 docs/dev/debt/libc.md
PR 10546 docs/dev/debt/libc.md
PR 10565 docs/dev/debt/libc.md
PR 10610 docs/dev/debt/libc.md
PR 10665 docs/dev/debt/libc.md
PR 10688 docs/dev/debt/libc.md

orezraey and others added 2 commits October 23, 2026 08:48
… requests

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…sured-ps5

# Conflicts:
#	docs/dev/debt/libc.md
@orezraey

Copy link
Copy Markdown
Contributor Author

@MarcZX10 Split as requested: fetestexcept is now #10175 and the memmem/memccpy note is #10176. For the libc.md conflict with #10134, this branch now carries #10134's commit and lists it under Depends on, so #10134 can land first without another refresh here. The focused tests pass three runs in a row again.

@github-actions github-actions Bot added the needs rebase Conflicts with main, rebase needed label Oct 23, 2026

@MarcZX10 MarcZX10 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-review of current head ed75f2fee18f75f03c79dfb2c68b5824b06ea049. The unrelated fetestexcept and memmem work has been split out, and this PR now declares Depends on: #10134; the remaining changed files are the formatter, its tests and the debt note. Exact-head conventions and git diff --check pass, and the author reports the focused formatter tests passing three consecutive runs after the refresh.

The PR is currently CONFLICTING / DIRTY against current main, so the current merged tree cannot be built or reviewed as a landing candidate. Please rebase onto current main, preserve the #10134 prerequisite and both sets of debt evidence, rerun the focused formatter/time tests, and update the report to the resulting exact head. This is the remaining integration blocker; no closure is requested.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@orezraey

Copy link
Copy Markdown
Contributor Author

@MarcZX10 The branch is refreshed: c1ce36f9ee merges current main (938812df14) into it, and GitHub now reports it mergeable. #10134's commit 2151929559 is kept, so its debt entries and this PR's both remain in libc.md and #10134 can still land first. guest_strftime, guest_time_conversion, guest_wide_formatting, guest_crt, guest_mktime and guest_time_extras pass three runs in a row at that head, and the Tested section now names it. I merged rather than rebased because the PR already has reviews.

@MarcZX10 MarcZX10 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-review of exact current head c1ce36f9eea92e4333e945172593911573299754.

The prior blockers are resolved: fetestexcept and the unrelated memmem/memccpy note are split into separate PRs; the branch now declares its #10134 dependency; and it is clean against current main (938812df14). The remaining diff is limited to strftime/asctime, focused tests, and the corresponding libc debt note. The measured PS5 behavior and the explicitly unmeasured cases are documented in the PR.

I independently ran tools/check_conventions.py on this exact head, git diff --check, and GCC C++20 -Wall -Wextra -Werror -fsyntax-only on the changed Time.cpp; all passed. The author reports six focused Windows CTests passing three consecutive times. Current hosted eligibility, conventions, labels, report, relinker (Ubuntu/Windows/macOS including x86_64), ASan relinker, register-context, and write-watch checks pass. Linux and Windows full product build jobs were skipped by path policy; I did not run the six CTests locally.

The #10134 dependency is explicit and its commit is present in this branch as described. Approving this exact head.

@github-actions github-actions Bot added needs rebase Conflicts with main, rebase needed and removed needs rebase Conflicts with main, rebase needed labels Oct 23, 2026
The %Z check now expects the guest tzname, since main leaves tzname[1] as three spaces for a zone without daylight saving time.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions github-actions Bot removed the needs rebase Conflicts with main, rebase needed label Oct 23, 2026
@oneandonlydean oneandonlydean self-assigned this Oct 23, 2026
@ntamas94

Copy link
Copy Markdown
Contributor

@orezraey #10409 shrinks GuestTm to the console's 36-byte struct tm (no tm_gmtoff, no tm_zone) and so has to touch the same %z/%Z branches in Time.cpp that this PR rewrites. Your PS5 rows already ignore both fields, so the two changes agree; only the text overlaps.

Proposed order: this PR lands first. #10409 then takes your %z/%Z code as it is, drops its own edits there, and keeps only the struct size, the conversion write-backs and gmtime_s's tm_isdst of -1. I have marked #10409 Depends on: #10129. If you would rather go the other way, say so and I will adapt.

@JJenkx

JJenkx commented Oct 23, 2026

Copy link
Copy Markdown
Contributor

A cross-check from Windows, against a different console binary from the one you measured.

Method. A scratch loader maps the decrypted libc.prx that titles ship and calls its strftime natively, by NID, next to the libc.prx DLL built from this PR at 5e36c33142. That libc.prx is the module titles import strftime from, not libSceLibcInternal.sprx. The titles were PPSA07923, PPSA13934 and PPSA35169, and their copies gave identical results. On eleven titles, the shipped copy formats only the C99 conversions and copies everything else with its %, which agrees with your table. The kernel time-zone import was stubbed to UTC, so %z and %Z are excluded below. Formats ending in %E/%O, and %G/%g/%V with a negative tm_yday, are left out because this PR throws there on purpose.

This PR on Windows (GCC 15.2.0 UCRT r7, Release): guest_strftime, guest_time_conversion, guest_wide_formatting and guest_crt pass in three runs out of three.

Fuzz against the titles' copy:

  • Random multi-conversion formats: mixes of C99 conversions, unknown characters, E/O, flags and widths, with every field random and often far out of range, years up to ±2^30, and random buffer sizes from 1 to 40. On 198,308 cases, 7,480 differ. main differs on 126,669 of the same cases.
  • Single conversions, 2.04M cases: everything matches except %U, %W, %V, %G and %g. With tm_wday 0 to 6 and tm_yday 0 to 365, only 48 cases remain (item 3 below).

What still differs:

  1. Negative tm_wday. The titles' copy appears to use the C remainder tm_wday % 7 as is, negative values included, where this PR normalizes it to 0 to 6.
    • %U with tm_wday -19 and tm_yday 100: console 16, this PR 15.
    • %W with tm_wday -16 and tm_yday 277: console 41, this PR 40.
    • %V, %G and %g shift the same way. Example: %V with tm_wday -12 and tm_yday 18: console 04, this PR 03.
    • With tm_wday from -20 to 20 and tm_yday 0 to 365: about 17,800 differences each in %U, %V and %W.
  2. tm_yday past the end of the year (366 to 1500, tm_wday 0 to 6). The console never rolls into a later ISO year.
    • %V keeps counting and wraps at 100: tm_yday 1365 with tm_wday 6 gives 95, from 195, where this PR gives 01.
    • %G and %g stay at tm_year: tm_year 97, tm_yday 415, tm_wday 6 gives 97, where this PR gives 98.
  3. tm_yday 365 in a non-leap year (an impossible date): the console gives %V 53 and keeps %G in that year, where this PR gives 01 of the next year. Examples are 1907 and 2013 with tm_wday 1. These are the 48 in-range cases.
  4. Composite conversions that do not fit. Your Not-followed list has this as unmeasured. The console writes a composite part by part, each part all-or-nothing, and returns 0. It does not drop the whole composite.
    • %t%D in 8 bytes leaves 09 30 31 2f 30 32 2f (\t01/02/) and stops before 24.
    • %X%#H in 2 bytes leaves 30 33 (03), with no room for the terminator.
    • This PR leaves 09 and nothing respectively.
    • Single conversions agree with your rule: ab%Ycd in 5 bytes leaves only ab, and %Y in 4 bytes leaves 2024.

None of these affect in-range dates. Items 1 to 3 need impossible field combinations, and item 4 only affects the buffer contents on a 0 return. I'm posting them in case you want to close the remaining gaps or record them in the debt entry. The harness is ad hoc and not part of any PR; I can rerun it on a later head.

🤖 Generated with Claude Code

ntamas94 added a commit to ntamas94/AnyPS5 that referenced this pull request Oct 23, 2026
… zone

gmtime_s now stores tm_isdst -1, so strftime must not drop %z or empty
%Z for it. Follow the rule boykopovar#10129 measured on a PS5: %z is the guest
zone's offset, one hour more only when tm_isdst is positive, and %Z is
tzname[tm_isdst > 0].

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@orezraey

Copy link
Copy Markdown
Contributor Author

@ntamas94 Agreed: this PR lands first, and #10409 then keeps only the struct tm size, the conversion write-backs and gmtime_s's tm_isdst of -1. If #10409 is ready first instead, I will refresh this branch over it.

@JJenkx Thanks for the cross-check. Items 1 and 2 differ from what libSceLibcInternal.sprx (firmware 13.60) gave in strf4 of the gist: tm_wday -2 with tm_yday 10 printed %U as 01, where the C remainder gives 02, and tm_yday 400 with tm_wday 4 in 2026 printed %G 2027 and %V 01. So the two modules seem to disagree on out-of-range weeks, and I am leaving the code on the measured module for now. Items 3 and 4 are outside what I measured (no non-leap tm_yday 365 case, and only %Y for the fit rule), so your %t%D and %X%#H results are the only data there.

@ntamas94

Copy link
Copy Markdown
Contributor

@orezraey @JJenkx A third data point for the out-of-range weeks and the fit rule, from a PS4 Pro (firmware 10.71). One probe called strftime from three modules: the system libc.sprx, libSceLibcInternal.sprx, and the libc.prx a PS4 title ships (a fake-signed copy from my own dump). All three gave the same bytes on every row, and they reproduce both of your examples, so the measurements may not disagree after all.

"%U|%W|%V|%G|%g" with tm_isdst 0, hour 12 (mday and mon as listed, since they may matter for the ISO rollover):

tm_year tm_mon tm_mday tm_yday tm_wday | result
126 0 11     10  -2 | 01|01|02|2026|26
126 1  5    400   4 | 57|57|01|2027|27
126 3 11    100 -19 | 16|16|16|2026|26
126 9  5    277 -16 | 40|41|41|2026|26
126 0 19     18 -12 | 04|04|04|2026|26
126 0  1   1365   6 | 95|95|95|2026|26
 97 0  1    415   6 | 59|59|59|1997|97
113 11 31   365   1 | 53|53|53|2013|13
  7 11 31   365   1 | 53|53|53|1907|07
126 9 24    296   6 | 42|42|43|2026|26   (in range, control)
  • %U and %W: one rule fits all nine rows: the weekday is (tm_wday + 7) % 7 for %U and (tm_wday + 6) % 7 for %W, both with C's remainder (so it can stay negative), and the week is (tm_yday + 7 - weekday) / 7, wrapping at 100. For tm_wday of -7 or less that is the same as tm_wday % 7, which is why JJenkx's -19, -16 and -12 rows fit the plain remainder; for -1 to -6 the two differ, which is where orezraey's tm_wday -2 row (%U 01) sits.
  • %V, %G, %g: tm_yday 400 in 2026 rolls into 2027 week 01, as in strf4, while tm_yday 415 in 1997 and 1365 in 2026 stay in their year (59 and 95), as in JJenkx's results; 2013 and 1907 with tm_yday 365 and tm_wday 1 give week 53 of that year. I have no rule that separates the 400 and 415 rows yet; their tm_mon and tm_mday differ (February 5 against January 1), which may be what decides it.
  • Conversions that do not fit, same in all three modules:
"%t%D"   size 8 | ret 0 | 09 30 31 2f 30 32 2f aa   (\t01/02/, stops before 24)
"%X%#H"  size 2 | ret 0 | 30 33 aa                  (03, no terminator)
"ab%Ycd" size 5 | ret 0 | 61 62 aa aa aa aa         (ab)
"%D"     size 9 | ret 8 | 01/02/24 and the terminator

That matches JJenkx's part-by-part result for composites and orezraey's rule for single conversions.

These are PS4 modules, not the PS5 ones you measured, so they do not settle the PS5 behaviour directly. But on the PS4 the system libc and a title's libc.prx agree here, which makes it less likely that the two PS5 modules differ. The probe and its full output are in this gist: https://gist.github.com/ntamas94/38aca1712084acbea1c70058568147ff.

AI-assisted: yes (Claude Code)

…y part

%U and %W take the weekday as (tm_wday + 7) % 7 and (tm_wday + 6) % 7
with the C remainder, which fits the PS5 rows of libSceLibcInternal.sprx
and of the libc.prx titles ship. A composite conversion is written part
by part, each part all or nothing. %G, %g and %V throw for a tm_yday
past the year and a tm_wday below -6, where no rule fits the console.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@orezraey

Copy link
Copy Markdown
Contributor Author

@ntamas94 @JJenkx Thanks, that settles %U and %W: your (tm_wday + 7) % 7 and (tm_wday + 6) % 7 rule with the C remainder also fits my strf4 rows, so the two PS5 modules agree there. Commit 974e0a8 uses it, writes a composite conversion part by part (each part all or nothing, as in your %t%D and %X%#H rows), and makes %G, %g and %V throw for a tm_yday past the end of the year and a tm_wday below -6, since no rule yet separates the 400 and 415 rows or explains week 04 for tm_wday -12. guest_strftime now checks your ten %U/%W rows, the two composite rows and those eight throwing ISO cases, and reports 26 failures with the old Time.cpp; it and the other five time tests pass three runs in a row. The debt entry and the description list the ISO rows that are still open.

@oneandonlydean

Copy link
Copy Markdown
Collaborator

@orezraey thanks for the week-number and composite-buffer fixes, those cases read right against the code. One thing has to change before this can merge: CheckThrows in core/libs/tests/GuestStrftime.cpp asserts that %V, %G and %g throw a "not implemented" error for the eight unknown ISO rows (the unknownWeeks loop). We don't pin unimplemented behaviour in tests: a test like that fails the day someone measures and implements those rows, and it doesn't tell us anything about a real PS5. Could you drop CheckThrows and the unknownWeeks loop, keep the measured U/W cases and the composite buffer cases, and leave the refusal plus its debt entry in production as they are? Then rerun guest_strftime, guest_time_conversion, guest_wide_formatting, guest_crt, guest_mktime and guest_time_extras on the new head. #10134 still needs to land first.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@orezraey

Copy link
Copy Markdown
Contributor Author

Done in 68a4482acd: CheckThrows and the unknownWeeks loop are gone from GuestStrftime.cpp, and the measured %U/%W rows and the composite buffer cases stay. Time.cpp and the debt entry are unchanged, so those rows still refuse in production. guest_strftime, guest_time_conversion, guest_wide_formatting, guest_crt, guest_mktime and guest_time_extras pass at the new head (three runs, Windows), and I updated the Tested section. This still waits for #10134.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions github-actions Bot added the needs rebase Conflicts with main, rebase needed label Oct 24, 2026
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions github-actions Bot added needs rebase Conflicts with main, rebase needed and removed needs rebase Conflicts with main, rebase needed labels Oct 24, 2026
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions github-actions Bot removed the needs rebase Conflicts with main, rebase needed label Oct 24, 2026
@orezraey

Copy link
Copy Markdown
Contributor Author

@karimibrahim07 @UnhealthyKraken @JJenkx: #6713, #8937, #10113, #10226 and #10345 change the same lines as this PR in docs/dev/debt/libc.md (git merge-tree of both heads over current main conflicts there). I propose they land first; I will then merge main into this branch, keeping both sides' behaviour, and rerun its tests. Depends on now lists them (merge order only).

@orezraey

Copy link
Copy Markdown
Contributor Author

@JJenkx: #9613 changes the same lines as this PR in docs/dev/debt/libc.md (git merge-tree of both heads conflicts there, while it merges cleanly with current main). I propose it lands first; I will then merge main into this branch, keeping both sides' behaviour, and rerun its tests. Depends on now lists it (merge order only).

@orezraey

Copy link
Copy Markdown
Contributor Author

#10706 replaces the local extern "C" declaration blocks in the tests with the new headers, and this PR adds declarations to that block in core/libs/tests/GuestStrftime.cpp, so the two conflict there (git merge-tree of both heads). I suggest #10706 lands first; this PR will then be refreshed to use the new headers instead of its own declarations, with its tests and behaviour unchanged. I added #10706 to Depends on (merge order only).

@github-actions github-actions Bot added the needs rebase Conflicts with main, rebase needed label Oct 24, 2026
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions github-actions Bot removed the needs rebase Conflicts with main, rebase needed label Oct 25, 2026
@oneandonlydean
oneandonlydean merged commit f4aabbb into boykopovar:main Oct 25, 2026
18 of 19 checks passed
@00xDisaster 00xDisaster mentioned this pull request Oct 25, 2026
12 tasks done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants