By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
446,300 Members | 1,331 Online
Bytes IT Community
+ Ask a Question
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

<OT>
What im trying to accomplish is to display a number representing
the build date of the code in a 4-digit 7-segment display.
</OT>

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
Share this Question
Share on Google+
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

<OT>
What im trying to accomplish is to display a number representing
the build date of the code in a 4-digit 7-segment display.
</OT>

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 <stdio.h>

#define YEAR ((((__DATE__ [7] - '0') * 10 + (__DATE__ [8] - '0')) * 10 \
+ (__DATE__ [9] - '0')) * 10 + (__DATE__ [10] - '0'))

#define MONTH (__DATE__ [2] == 'n' ? 0 \
: __DATE__ [2] == 'b' ? 1 \
: __DATE__ [2] == 'r' ? (__DATE__ [0] == 'M' ? 2 : 3) \
: __DATE__ [2] == 'y' ? 4 \
: __DATE__ [2] == 'n' ? 5 \
: __DATE__ [2] == 'l' ? 6 \
: __DATE__ [2] == 'g' ? 7 \
: __DATE__ [2] == 'p' ? 8 \
: __DATE__ [2] == 't' ? 9 \
: __DATE__ [2] == 'v' ? 10 : 11)

#define DAY ((__DATE__ [4] == ' ' ? 0 : __DATE__ [4] - '0') * 10 \
+ (__DATE__ [5] - '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__ [7] - '0') * 10 + (__DATE__ [8] - '0')) * 10 \
+ (__DATE__ [9] - '0')) * 10 + (__DATE__ [10] - '0'))

#define MONTH (__DATE__ [2] == 'n' ? 0 \
#define MONTH (__DATE__ [2] == 'n' ? (__DATE__ [1] == 'a' ? 0 : 5) \
: __DATE__ [2] == 'b' ? 1 \
: __DATE__ [2] == 'r' ? (__DATE__ [0] == 'M' ? 2 : 3) \
: __DATE__ [2] == 'y' ? 4 \
: __DATE__ [2] == 'n' ? 5 \
Also, delete the above line.
: __DATE__ [2] == 'l' ? 6 \
: __DATE__ [2] == 'g' ? 7 \
: __DATE__ [2] == 'p' ? 8 \
: __DATE__ [2] == 't' ? 9 \
: __DATE__ [2] == 'v' ? 10 : 11)

#define DAY ((__DATE__ [4] == ' ' ? 0 : __DATE__ [4] - '0') * 10 \
+ (__DATE__ [5] - '0'))

#define DATE_AS_INT (((YEAR - 2000) * 12 + MONTH) * 31 + DAY)


Jeremy.
Nov 14 '05 #6

P: n/a
Jeremy Yallop <je****@jdyallop.freeserve.co.uk> writes:
#define MONTH (__DATE__ [2] == 'n' ? 0 \


#define MONTH (__DATE__ [2] == 'n' ? (__DATE__ [1] == 'a' ? 0 : 5) \
: __DATE__ [2] == 'b' ? 1 \
: __DATE__ [2] == 'r' ? (__DATE__ [0] == 'M' ? 2 : 3) \
: __DATE__ [2] == 'y' ? 4 \
: __DATE__ [2] == 'n' ? 5 \


Also, delete the above line.
: __DATE__ [2] == 'l' ? 6 \
: __DATE__ [2] == 'g' ? 7 \
: __DATE__ [2] == 'p' ? 8 \
: __DATE__ [2] == 't' ? 9 \
: __DATE__ [2] == 'v' ? 10 : 11)


Oops, of course! Thanks for the correction.

Martin
Nov 14 '05 #7

P: n/a
Martin Dickopp <ex****************@zero-based.org> wrote in message news:<br*************@news.t-online.com>...
Jeremy Yallop <je****@jdyallop.freeserve.co.uk> writes:
#define MONTH (__DATE__ [2] == 'n' ? 0 \


#define MONTH (__DATE__ [2] == 'n' ? (__DATE__ [1] == 'a' ? 0 : 5) \
: __DATE__ [2] == 'b' ? 1 \
: __DATE__ [2] == 'r' ? (__DATE__ [0] == 'M' ? 2 : 3) \
: __DATE__ [2] == 'y' ? 4 \
: __DATE__ [2] == 'n' ? 5 \


Also, delete the above line.
: __DATE__ [2] == 'l' ? 6 \
: __DATE__ [2] == 'g' ? 7 \
: __DATE__ [2] == 'p' ? 8 \
: __DATE__ [2] == 't' ? 9 \
: __DATE__ [2] == '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.