<div dir="ltr"><div>take 2 (switches to next_printf, fixes the %%N case):</div><div><br></div><div> tests/date.test   | 14 ++++++++++++++</div><div> toys/posix/date.c | 50 +++++++++++++++++++++++++++++++++++++++-----------</div><div> 2 files changed, 53 insertions(+), 11 deletions(-)</div><div><br></div><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Apr 16, 2017 at 4:22 PM, Rob Landley <span dir="ltr"><<a href="mailto:rob@landley.net" target="_blank">rob@landley.net</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span class="gmail-">On 04/16/2017 03:51 PM, enh wrote:<br>
> yeah, definitely a mess.<br>
><br>
> note that i only did this because (a) existing tests were using it and<br>
> (b) busybox has it too. i've been assuming (perhaps incorrectly) that<br>
> busybox also tried to avoid needlessly implementing GNU extensions<br>
> unless they were actually useful to enough people.<br>
<br>
</span>As far as I can tell the way people do this is indeed date %N. I've<br>
tried to do this before, but adding extra escapes to both input and<br>
output via an overlay mechanism turns out to be a hard problem to do right.<br>
<br>
(Really I want a generic mechanism to wrap arbitrary printf/scanf style<br>
things, but the problem space isn't necessarily set up that way. Can I<br>
chop strptime parsing into multiple strptime calls that _only_ modify<br>
certain fields each time while leaving the others alone? I was reading<br>
the posix page and man page stuff about that at one point, something<br>
said it only modified specific fields other than the ones you<br>
specified... but alas, I got distracted halfway through...)<br></blockquote><div><br></div><div>one of the things i liked in Plan 9: <a href="http://man.cat-v.org/plan_9/2/fmtinstall">http://man.cat-v.org/plan_9/2/fmtinstall</a></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
Checking my notes, I was attempting to add %s support to the input path.<br>
Except that %s pretty much _replaces_ strptime() because none of the<br>
other fields you set make sense in combination with that. (But %s could<br>
be in the middle of a context string describing the rest of the input;<br>
that I didn't make up, it's in the ubuntu one.) So %s is probably<br>
fiddlier than %N. Hmmm...<br>
<br>
In general I wince at merging half a solution to a larger problem,<br>
because it increases the surface area of the problem. (People start<br>
using the partial thing, then I break them when I try to fix the rest of<br>
it...) That said, if I'm not doing the full fix now and the partial fix<br>
is there and we need it... Sigh.</blockquote><div><br></div><div>plus no-one else supports round trips as far as i can tell, so demand hasn't been that great.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span class="gmail-">
>     Speaking of which, this patch adds %N to output but not to input, so<br>
>     date can still only _set_ nanoseconds using the @123456789.123456789<br>
>     syntax.<br>
><br>
> isn't setting via arbitrary format a toybox extension?<br>
<br>
</span>Walter Harms added it to busybox in 2006 (back when I maintained it):<br>
<br>
  <a href="http://lists.busybox.net/pipermail/busybox/2006-February/018203.html" rel="noreferrer" target="_blank">http://lists.busybox.net/<wbr>pipermail/busybox/2006-<wbr>February/018203.html</a><br>
  <a href="https://git.busybox.net/busybox/commit/?id=c5789a6e234c" rel="noreferrer" target="_blank">https://git.busybox.net/<wbr>busybox/commit/?id=<wbr>c5789a6e234c</a><br>
<br>
I genericized his original idea a bit because "I want to convert data<br>
from one format to another" is awkward to solve otherwise. "This email's<br>
datestamp would be what in unix time"... I used to write little C<br>
programs to do that.<br>
<br>
I used to have a button that said "Only XT users know that January 1,<br>
1980 was a tuesday". Toybox says:<br>
<br>
  $ ./date -D "%m %d %Y" -d "1 1 1980" +%A<br>
  Tuesday<br></blockquote><div><br></div><div>(given that this question comes up in real life more than "show me the whole calendar for 1856" or "show me the calendar for October 1856", i never understood why cal will show you a whole year or a whole month but not a single day.)</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
If you can say %N in + but not in -D I'm doing it wrong. It's a tiny<br>
thing, but it bothers me.<br>
<span class="gmail-"><br>
>     And you're not checking that "%%N is a literal %N". (Sigh. If<br>
>     we're going there, may I draw your attention to next_printf() in<br>
>     lib/lib.c? Example usage in seq and stat.)<br>
><br>
> okay, i'll switch it over (assuming we actually want %N).<br>
<br>
</span>Eh, we probably want it, I just winced at how expensive it was to<br>
implement and it's the wrong place to do it (belongs in libc) and if<br>
we're going there I want to do the full fix (get and set, and handling<br>
%% and %4N) so it isn't inconsistent...<br>
<br>
And it needs one of them Focused Review things that have been in short<br>
supply recently. (The easter weekend's helped me to dig out a bit. If I<br>
got a three day weekend every week, keeping up would be so much easier. :)</blockquote><div><br></div><div>no extra day off here :-( at the other end of the spectrum, the London office have a four-day weekend...</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span class="gmail-"><br>
>     It's kind of sad "ls" can't show nanoseconds. Or "stat". I understand<br>
>     why (nanoseconds were added when makefile dependencies started breaking<br>
>     as computers got faster and multiple build things happened in the same<br>
>     second; nothing else actually _needed_ them in the filesystem) but it's<br>
>     still half-assed.<br>
><br>
> ~$ ls -ld --time-style=full-iso /<br>
<br>
</span>--time-style is a can of worms (I made a design decision _not_ to<br>
support more than one output format, now there's a straightforward<br>
extension of the existing output format we want to add, but if I use the<br>
generic named selection mechanism for it the pressure to support all the<br>
rest of 'em will never stop. I lose the ability to draw a clear boundary<br>
line.)<br>
<br>
But --full-time is a synonym, which I can add _and_ make -ll do it too.<br>
(Repeat -l and it shows nanoseconds. I like having short options for<br>
things, but the letters are all taken here. Still, logically it's a<br>
"long long"... :)<br>
<br>
My concern here is maximizing the surface area of "I can write a script<br>
that runs under toybox and under ubuntu as well." Such as the current<br>
test suite stuff we're trying to do. I can write one using --full-time<br>
it works in both contexts.<br>
<br>
The problem with using ls for the touch test code is "ls -l" shows<br>
ownership information also, varying between systems. You can't output<br>
_just_ the info you want without that. We can do the awk/cut trick to<br>
filter it and only look at specific fields (todo: can we have spaces or<br>
tabs in usernames? You can in the realname field...).<br>
<br>
tl;dr there's still a call for "date %N".<br>
<span class="gmail-"><br>
> i'm happy to rewrite the tests instead... i've never used %N personally,<br>
> and would just naturally use stat for this kind of thing.<br>
<br>
</span>How do you get nanoseconds out of stat? (I'm happy to add a toybox<br>
extension for it, but relying on that breaks TEST_HOST or "make<br>
test_sed" on a non-toybox host.)</blockquote><div><br></div><div>well, the _text_ form includes nanoseconds. but i guess you meant the numeric-only form, in which case, no, i'm not aware of a way to do that.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span class="gmail-">
> as you say, the asymmetry is ugly, and the divergence from libc is ugly,<br>
> so if busybox added this "just because" maybe we shouldn't have it at all?<br>
<br>
</span>It was useful, and still is. (Especially the ability to specify<br>
different input and output formats so you can convert between them.) And<br>
it's already implemented and working. :)<br>
<span class="gmail-HOEnZb"><font color="#888888"><br>
Rob<br>
</font></span></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature">Elliott Hughes - <a href="http://who/enh" target="_blank">http://who/enh</a> - <a href="http://jessies.org/~enh/" target="_blank">http://jessies.org/~enh/</a><br>Android native code/tools questions? Mail me/drop by/add me as a reviewer.</div>
</div></div>