Darwin-strptime() är inkompatibel med traditionella implementationer

Tråden skapades och har fått 6 svar. Det senaste inlägget skrevs .
1
  • Medlem
  • Nacka
  • 2008-12-23 23:20

Råkade ut för otrevlig inkompatibilitet i Darwin's strptime(). Traditionella implementationer förväntar sig att scanna av 4 siffror om det står %Y i formatsträngen, dvs ett årtal mellan 0000 och 9999. Men i Darwin-implementationen kan årtalet ha fler än fyra siffror. Det innebär att om man skickar in "20081223" och "%Y%m%d" som argument så får man fel-return (NULL), eftersom alla siffrorna "äts" upp av %Y och inga finns kvar till %m och %d. Det går att komma runt genom att använda något skiljetecken mellan årtal och månadssiffra ("%Y %m" eller "%Y-%m" t.ex), men det är lite tråkigt att 1, behöva ändra sin befintliga kod på en massa ställen, 2, behöva ändra sina datum-strängar i filer som programmen (se 1) ska parsa.

Har tittat på Darwin-koden Apple - Open Source - Login
och kan inte se att det går att få att fungera på traditionellt vis utan att bygga om libc eller ha en egen strptime() i sin eget bibliotek. Det senare vill man helst slippa, inte minst med tanke på att en rättning i strptime() var med i senaste security update av OS X.

Tacksam för tips!

Ett Y10k-problem!

  • Oregistrerad
  • 2008-12-26 01:31

Använder inte strptime och liknande locale för att bestämma formattering? Jag är ingen unix nörd men i php är det iaf så.

Sen, återigen i php så skriver man %Y-%m-%d för att få en korrekt formattering. Är det inte så man ska göra?

  • Medlem
  • Stockholm
  • 2008-12-26 10:33

Inte nog med att den inte följer "traditionella implementationer", den tycks bryta mot UNIX-standarden. UNIX är ett varumärke som ägs av The Open Group och här är deras specifikation av strptime():

strptime

Under "Application Usage" står det att %Y är 4 siffror.

Du borde buggrapportera detta hos Apple och påpeka att de inte följer UNIX-standarden från Open Group.

http://developer.apple.com/bugreporter/

Slutligen, för just din sträng kan du ju använda sscanf portabelt:

rc = sscanf(str, "%4d%2d%2d", &y, &m, &d);
  • Medlem
  • Nacka
  • 2008-12-26 22:39

studiox, vissa format-modifierare är locale-beroende, men inte %Y.

pesc, tack för länken för bugrapporter till Apple. sscanf känns inte som ett alternativ. Min kod ska kunna tolka i princip godtyckliga input- och format-strängar. Men jag hittade på en generell lösning som funkar.

Jag gjorde ungefär så här:
i en .h-fil som inkluderas där strptime () används, och man kompilerar på OS X:
#define strptime my_strptime

my_strptime () som jag bygger in i mitt bas-bibliotek (om man är på OS X), letar i formatsträngen efter %Y%. Om det inte hittas så anropas den vanliga strptime(). Annars så används vanliga strptime() dels för den del som kommer före %Y och dels för den del som kommer efter. Själva %Y delen tolkar my_strptime () själv, 1-4 siffror.

Om %Y% förekommer två gånger i samma formatsträng så går jag bet, men det kan jag leva med.

Inser när jag skriver att det finns en till situation som jag inte hanterar, men den känns inte heller viktig; om t.ex. formatsträngen är %Y1234 t.ex. och inputsträngen är 20081234 så kommer funktionen returnera NULL eftersom den inte hittar 1234 när den tolkat årtalet som 20081234.

Om någon behöver mer detaljer, skicka ett P.M.

  • Medlem
  • Nacka
  • 2008-12-26 23:22

Inloggning på ADC krävs minst, vet inte om det räcker, man kanske måste vara inloggad som mig?

https://bugreport.apple.com/cgi-bin/WebObjects/RadarWeb.woa/79/wo/vkvzWovmRtjXf4XIVA1mpg/9.34

  • Medlem
  • Sundsvall
  • 2008-12-27 17:28

Jag har inte dykt ner i problemet men är inte detta bara the BSD-way och apple kör BSD-style och man är van med GNU-varianten?

  • Medlem
  • Nacka
  • 2009-02-01 23:38

Fick ett meddelande från apple som egentligen bara sa att min felrapport var ett duplikat, och att deras tekniker undersökte orignalrapporten. Jag fick id:t för orginalet, men det verkar inte som om jag kommer att få något meddelande på om/när/hur den blir löst. Om jag kommer ihåg ska jag kolla med ett testprogram när det kommer nya utgåvor av c-biblioteket.

1
Bevaka tråden