446,300 Members | 1,331 Online Need help? Post your question and get tips & solutions from a community of 446,300 IT Pros & Developers. It's quick & easy.

# Convert __DATE__ to unsigned int

 P: n/a Hi group! Anyone know a way to convert the __DATE__ predefined macro into a unsigned int representing the current date? It should be possible to make out what date it was from the beginning. My idéa was this format: ((Year - 2000)*12 + (month - 1))*31 + day So 12 Dec 2003 would result in: ((2003 - 2000)*12 + (12 - 1))*31 + 12 = 1469 What im trying to accomplish is to display a number representing the build date of the code in a 4-digit 7-segment display. Preferbly i would have a solution that does it at compile time? Something like this: #define DATE_AS_INT /* something nice here */ displayAsInt(DATE_AS_INT); The next best thing is a function returning the int. But i cannot use any library functions. Like this unsigned int getDateAsInt() { /* Code goes here */ } displayAsInt(getDateAsInt()); The reason for the somewhat strange constraints is that im developing for an embedded system and im having a little short on code memory. Greatful for any suggestion! //Erik Nov 14 '05 #1
7 Replies

 P: n/a Erik Cato wrote: Hi group! Anyone know a way to convert the __DATE__ predefined macro into a unsigned int representing the current date? It should be possible to make out what date it was from the beginning. My idéa was this format: ((Year - 2000)*12 + (month - 1))*31 + day So 12 Dec 2003 would result in: ((2003 - 2000)*12 + (12 - 1))*31 + 12 =1469 You won't be able to do this with "preprocessor magic" at compile time, because the preprocessor has no way to turn "Dec" into 12. You could write a run-time function that would derive the desired number from the __DATE__ string, turning "Dec 12 2003" into 12, 12, 2003 and then encoding it as desired. Perhaps a better solution is to do neither of these, but to write a "helper" program that runs early in your build procedure. This program would write a #define directive to a one-line .h file, which would then be #include'd in any compilations that needed it. Hey, presto! no preprocessor magic required, no run-time overhead, and you don't get into ambiguous situations if the program is built from multiple modules compiled on different days. -- Er*********@sun.com Nov 14 '05 #2

 P: n/a er*******@japro.se (Erik Cato) writes: Anyone know a way to convert the __DATE__ predefined macro into a unsigned int representing the current date? It should be possible to make out what date it was from the beginning. My idéa was this format: ((Year - 2000)*12 + (month - 1))*31 + day So 12 Dec 2003 would result in: ((2003 - 2000)*12 + (12 - 1))*31 + 12 = 1469 What im trying to accomplish is to display a number representing the build date of the code in a 4-digit 7-segment display. Preferbly i would have a solution that does it at compile time? Something like this: #define DATE_AS_INT /* something nice here */ Here is some code which does this. DATE_AS_INT expands to a constant expression, so an optimizing compiler should be able to compute its value at compile time. #include #define YEAR ((((__DATE__  - '0') * 10 + (__DATE__  - '0')) * 10 \ + (__DATE__  - '0')) * 10 + (__DATE__  - '0')) #define MONTH (__DATE__  == 'n' ? 0 \ : __DATE__  == 'b' ? 1 \ : __DATE__  == 'r' ? (__DATE__  == 'M' ? 2 : 3) \ : __DATE__  == 'y' ? 4 \ : __DATE__  == 'n' ? 5 \ : __DATE__  == 'l' ? 6 \ : __DATE__  == 'g' ? 7 \ : __DATE__  == 'p' ? 8 \ : __DATE__  == 't' ? 9 \ : __DATE__  == 'v' ? 10 : 11) #define DAY ((__DATE__  == ' ' ? 0 : __DATE__  - '0') * 10 \ + (__DATE__  - '0')) #define DATE_AS_INT (((YEAR - 2000) * 12 + MONTH) * 31 + DAY) int main (void) { printf ("%d-%02d-%02d = %d\n", YEAR, MONTH + 1, DAY, DATE_AS_INT); return 0; } Martin Nov 14 '05 #3

 P: n/a Erik Cato wrote: Hi group! Anyone know a way to convert the __DATE__ predefined macro into a unsigned int representing the current date? It should be possible to make out what date it was from the beginning. My idéa was this format: ((Year - 2000)*12 + (month - 1))*31 + day So 12 Dec 2003 would result in: ((2003 - 2000)*12 + (12 - 1))*31 + 12 = 1469 __DATE__ has the for "Mmm dd yyyy", so "12 Dec 2003" is not a possible value. Get the number for the month by using strstr on an array containing the month names as used by asctime (char monthname[] = "JanFebMarApr...) This is a trivial exercise, and I'm sorry to say that your post does not make it clear what your problem is, apart from your not having the form for __DATE__ right and asking the preprocessor to do something for which it is not designed. Preferbly i would have a solution that does it at compile time? Good luck. Looking up the number corresponding to the month seems a bit difficult at compile time. -- Martin Ambuhl Nov 14 '05 #4

 P: n/a Martin Dickopp wrote: er*******@japro.se (Erik Cato) writes: Anyone know a way to convert the __DATE__ predefined macro into a unsigned int representing the current date? It should [...] Here is some code which does this. DATE_AS_INT expands to a constant expression, so an optimizing compiler should be able to compute its value at compile time. [...] Yikes! I stand corrected, and my hat's off to you! -- Er*********@sun.com Nov 14 '05 #5

 P: n/a Martin Dickopp wrote: #define YEAR ((((__DATE__  - '0') * 10 + (__DATE__  - '0')) * 10 \ + (__DATE__  - '0')) * 10 + (__DATE__  - '0')) #define MONTH (__DATE__  == 'n' ? 0 \ #define MONTH (__DATE__  == 'n' ? (__DATE__  == 'a' ? 0 : 5) \ : __DATE__  == 'b' ? 1 \ : __DATE__  == 'r' ? (__DATE__  == 'M' ? 2 : 3) \ : __DATE__  == 'y' ? 4 \ : __DATE__  == 'n' ? 5 \ Also, delete the above line. : __DATE__  == 'l' ? 6 \ : __DATE__  == 'g' ? 7 \ : __DATE__  == 'p' ? 8 \ : __DATE__  == 't' ? 9 \ : __DATE__  == 'v' ? 10 : 11) #define DAY ((__DATE__  == ' ' ? 0 : __DATE__  - '0') * 10 \ + (__DATE__  - '0')) #define DATE_AS_INT (((YEAR - 2000) * 12 + MONTH) * 31 + DAY) Jeremy. Nov 14 '05 #6

 P: n/a Jeremy Yallop writes: #define MONTH (__DATE__  == 'n' ? 0 \ #define MONTH (__DATE__  == 'n' ? (__DATE__  == 'a' ? 0 : 5) \ : __DATE__  == 'b' ? 1 \ : __DATE__  == 'r' ? (__DATE__  == 'M' ? 2 : 3) \ : __DATE__  == 'y' ? 4 \ : __DATE__  == 'n' ? 5 \ Also, delete the above line. : __DATE__  == 'l' ? 6 \ : __DATE__  == 'g' ? 7 \ : __DATE__  == 'p' ? 8 \ : __DATE__  == 't' ? 9 \ : __DATE__  == 'v' ? 10 : 11) Oops, of course! Thanks for the correction. Martin Nov 14 '05 #7

 P: n/a Martin Dickopp wrote in message news:... Jeremy Yallop writes: #define MONTH (__DATE__  == 'n' ? 0 \ #define MONTH (__DATE__  == 'n' ? (__DATE__  == 'a' ? 0 : 5) \ : __DATE__  == 'b' ? 1 \ : __DATE__  == 'r' ? (__DATE__  == 'M' ? 2 : 3) \ : __DATE__  == 'y' ? 4 \ : __DATE__  == 'n' ? 5 \ Also, delete the above line. : __DATE__  == 'l' ? 6 \ : __DATE__  == 'g' ? 7 \ : __DATE__  == 'p' ? 8 \ : __DATE__  == 't' ? 9 \ : __DATE__  == 'v' ? 10 : 11) Oops, of course! Thanks for the correction. Martin Thanks a lot for all answers. I suspected that something like this could be done but could not find the solution. :-) The idéa of making a helper program hadn´t occured for me before but that is an idéa worth looking into a little more. Thanks! The only problem with that is how to make my compile and build enviroment call that program before every build. But i will surely look into it. //Erik Nov 14 '05 #8

### This discussion thread is closed

Replies have been disabled for this discussion. 