Convert __DATE__ to unsigned int

Discussion in 'C Programming' started by Erik Cato, Dec 12, 2003.

  1. Erik Cato

    Erik Cato Guest

    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
     
    Erik Cato, Dec 12, 2003
    #1
    1. Advertisements

  2. Erik Cato

    Eric Sosman Guest

    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.
     
    Eric Sosman, Dec 12, 2003
    #2
    1. Advertisements

  3. 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
     
    Martin Dickopp, Dec 12, 2003
    #3

  4. __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.
    Good luck. Looking up the number corresponding to the month seems a bit
    difficult at compile time.
     
    Martin Ambuhl, Dec 12, 2003
    #4
  5. Erik Cato

    Eric Sosman Guest

    Yikes! I stand corrected, and my hat's off to you!
     
    Eric Sosman, Dec 12, 2003
    #5
  6. #define MONTH (__DATE__ [2] == 'n' ? (__DATE__ [1] == 'a' ? 0 : 5) \
    Also, delete the above line.
    Jeremy.
     
    Jeremy Yallop, Dec 12, 2003
    #6
  7. Oops, of course! Thanks for the correction.

    Martin
     
    Martin Dickopp, Dec 12, 2003
    #7
  8. Erik Cato

    Erik Cato Guest

    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
     
    Erik Cato, Dec 15, 2003
    #8
  9. Erik Cato

    ClaudeWSmith

    Joined:
    Oct 26, 2014
    Messages:
    1
    Likes Received:
    0
    I must be incredibly stupid, but what I did was the following run-time code.

    char *pMons = "000JanFebMarAprMayJunJulAugSepOctNovDec";
    char *pMon = strstr( pMons, Mid( __DATE__, 0, 3) );
    int iMon = ( pMon - pMons ) /3;
     
    ClaudeWSmith, Oct 26, 2014
    #9
    1. Advertisements

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments (here). After that, you can post your question and our members will help you out.