Exemplo n.º 1
0
time_t mktime (struct tm *tim_p) // from newlib
{
  time_t tim = 0;
  long days = 0;
  int year;

  /* validate structure */
  validate_structure (tim_p);

  /* compute hours, minutes, seconds */
  tim += tim_p->tm_sec + (tim_p->tm_min * _SEC_IN_MINUTE) +
    (tim_p->tm_hour * _SEC_IN_HOUR);

  /* compute days in year */
  days += tim_p->tm_mday - 1;
  days += _DAYS_BEFORE_MONTH[tim_p->tm_mon];
  if (tim_p->tm_mon > 1 && _DAYS_IN_YEAR (tim_p->tm_year) == 366)
    days++;

  /* compute day of the year */
  tim_p->tm_yday = days;

  if (tim_p->tm_year > 10000
      || tim_p->tm_year < -10000)
    {
      return (time_t) -1;
    }

  /* compute days in other years */
  if (tim_p->tm_year > 70)
    {
      for (year = 70; year < tim_p->tm_year; year++)
	days += _DAYS_IN_YEAR (year);
    }
  else if (tim_p->tm_year < 70)
    {
      for (year = 69; year > tim_p->tm_year; year--)
	days -= _DAYS_IN_YEAR (year);
      days -= _DAYS_IN_YEAR (year);
    }

  /* compute day of the week */
  if ((tim_p->tm_wday = (days + 4) % 7) < 0)
    tim_p->tm_wday += 7;

  /* compute total seconds */
  tim += (days * _SEC_IN_DAY);

  return tim;
}
Exemplo n.º 2
0
time_t 
mktime(
    _In_ struct tm *TimePointer)
{
    time_t Result = 0;
    long   Days   = 0;
    int    Year   = TimePointer->tm_year;
    int    Leap   = isleap(Year);

    validate_structure(TimePointer);
    if (TimePointer->tm_year > 10000 || TimePointer->tm_year < -10000) {
        return (time_t)-1;
    }

    // compute hours, minutes, seconds
    Result += TimePointer->tm_sec + (TimePointer->tm_min * SECSPERMIN) + (TimePointer->tm_hour * SECSPERHOUR);

    // compute days in year, get how many days untill now, and how many days has passed this year
    Days += __days_before_month[Leap][TimePointer->tm_mon];
    Days += TimePointer->tm_mday - 1;

    // Update the time structure to include this information
    TimePointer->tm_yday = Days;

    // compute days in other years
    if (Year > 70) {
        for (Year = 70; Year < TimePointer->tm_year; Year++) {
            Days += DAYSPERYEAR(Year);
        }
    }
    else if (Year < 70) {
        for (Year = 69; Year > TimePointer->tm_year; Year--) {
            Days -= DAYSPERYEAR(Year);
        }
        Days -= DAYSPERYEAR(Year);
    }
    return handle_daylight_savings(TimePointer, Year, Days, Result + (Days * SECSPERDAY));
}
Exemplo n.º 3
0
time_t mkgmtime(tm *tim_p)
{
    time_t tim = 0;
    long days = 0;
    int year, isdst, tm_isdst;

    /* validate structure */
    validate_structure (tim_p);

    /* compute hours, minutes, seconds */
    tim += tim_p->tm_sec + (tim_p->tm_min * _SEC_IN_MINUTE) +
           (tim_p->tm_hour * _SEC_IN_HOUR);

    /* compute days in year */
    days += tim_p->tm_mday - 1;
    days += _DAYS_BEFORE_MONTH[tim_p->tm_mon];
    if (tim_p->tm_mon > 1 && _DAYS_IN_YEAR (tim_p->tm_year) == 366)
        days++;

    /* compute day of the year */
    tim_p->tm_yday = days;

    if (tim_p->tm_year > 10000
            || tim_p->tm_year < -10000)
    {
        return (time_t) -1;
    }

    /* compute days in other years */
    if (tim_p->tm_year > 70)
    {
        for (year = 70; year < tim_p->tm_year; year++)
            days += _DAYS_IN_YEAR (year);
    }
    else if (tim_p->tm_year < 70)
    {
        for (year = 69; year > tim_p->tm_year; year--)
            days -= _DAYS_IN_YEAR (year);
        days -= _DAYS_IN_YEAR (year);
    }

    /* compute day of the week */
    if ((tim_p->tm_wday = (days + 4) % 7) < 0)
        tim_p->tm_wday += 7;

    /* compute total seconds */
    tim += (days * _SEC_IN_DAY);

    /* Convert user positive into 1 */
    tm_isdst = tim_p->tm_isdst > 0  ?  1 : tim_p->tm_isdst;
    isdst = tm_isdst;

    //screw this!

// if (_daylight)
//   {
//     int y = tim_p->tm_year + YEAR_BASE;
//     if (y == tz->__tzyear || __tzcalc_limits (y))
    //{
    //  /* calculate start of dst in dst local time and
    //     start of std in both std local time and dst local time */
//         time_t startdst_dst = tz->__tzrule[0].change
    //    - (time_t) tz->__tzrule[1].offset;
    //  time_t startstd_dst = tz->__tzrule[1].change
    //    - (time_t) tz->__tzrule[1].offset;
    //  time_t startstd_std = tz->__tzrule[1].change
    //    - (time_t) tz->__tzrule[0].offset;
    //  /* if the time is in the overlap between dst and std local times */
    //  if (tim >= startstd_std && tim < startstd_dst)
    //    ; /* we let user decide or leave as -1 */
//         else
    //    {
    //      isdst = (tz->__tznorth
    //             ? (tim >= startdst_dst && tim < startstd_std)
    //             : (tim >= startdst_dst || tim < startstd_std));
//           /* if user committed and was wrong, perform correction, but not
//            * if the user has given a negative value (which
//            * asks mktime() to determine if DST is in effect or not) */
//           if (tm_isdst >= 0  &&  (isdst ^ tm_isdst) == 1)
    //      {
    //        /* we either subtract or add the difference between
    //           time zone offsets, depending on which way the user got it
    //           wrong. The diff is typically one hour, or 3600 seconds,
    //           and should fit in a 16-bit int, even though offset
    //           is a long to accomodate 12 hours. */
    //        int diff = (int) (tz->__tzrule[0].offset
    //                          - tz->__tzrule[1].offset);
    //        if (!isdst)
    //          diff = -diff;
    //        tim_p->tm_sec += diff;
    //        validate_structure (tim_p);
    //        tim += diff;  /* we also need to correct our current time calculation */
    //      }
    //    }
    //}
//   }

    //screw this also
    /* add appropriate offset to put time in gmt format */
    //if (isdst == 1)
    //  tim += (time_t) tz->__tzrule[1].offset;
    //else /* otherwise assume std time */
    //  tim += (time_t) tz->__tzrule[0].offset;

    //and screw this too
    /* reset isdst flag to what we have calculated */
    tim_p->tm_isdst = isdst;

    return tim;
}
Exemplo n.º 4
0
time_t
handle_daylight_savings(
    _In_ struct tm* TimePointer,
    _In_ int        Year,
    _In_ int        DayCount,
    _In_ time_t     LinearTime)
{
    __tzinfo_type* tz    = __gettzinfo();
    int            isdst = 0;

    TZ_LOCK;
    _tzset_unlocked();
    if (__daylight) {
        int tm_isdst;
        int y = TimePointer->tm_year + YEAR_BASE;
        /* Convert user positive into 1 */
        tm_isdst = TimePointer->tm_isdst > 0  ?  1 : TimePointer->tm_isdst;
        isdst = tm_isdst;

        if (y == tz->__tzyear || __tzcalc_limits (y)) {
        /* calculate start of dst in dst local time and 
            start of std in both std local time and dst local time */
            time_t startdst_dst = tz->__tzrule[0].change - (time_t) tz->__tzrule[1].offset;
        time_t startstd_dst = tz->__tzrule[1].change - (time_t) tz->__tzrule[1].offset;
        time_t startstd_std = tz->__tzrule[1].change - (time_t) tz->__tzrule[0].offset;
        /* if the time is in the overlap between dst and std local times */
        if (LinearTime >= startstd_std && LinearTime < startstd_dst)
        ; /* we let user decide or leave as -1 */
            else
        {
            isdst = (tz->__tznorth
                ? (LinearTime >= startdst_dst && LinearTime < startstd_std)
                : (LinearTime >= startdst_dst || LinearTime < startstd_std));
            /* if user committed and was wrong, perform correction, but not
            * if the user has given a negative value (which
            * asks mktime() to determine if DST is in effect or not) */
            if (tm_isdst >= 0  &&  (isdst ^ tm_isdst) == 1)
        {
            /* we either subtract or add the difference between
                time zone offsets, depending on which way the user got it
                wrong. The diff is typically one hour, or 3600 seconds,
                and should fit in a 16-bit int, even though offset
                is a long to accomodate 12 hours. */
            int diff = (int) (tz->__tzrule[0].offset
                    - tz->__tzrule[1].offset);
            if (!isdst)
            diff = -diff;
            TimePointer->tm_sec += diff;
            LinearTime += diff;  /* we also need to correct our current time calculation */
            int mday = TimePointer->tm_mday;
            validate_structure (TimePointer);
            mday = TimePointer->tm_mday - mday;
            /* roll over occurred */
            if (mday) {
            /* compensate for month roll overs */
            if (mday > 1)
                mday = -1;
            else if (mday < -1)
                mday = 1;
            /* update days for wday calculation */
            DayCount += mday;
            /* handle yday */
            if ((TimePointer->tm_yday += mday) < 0) {
                --Year;
                TimePointer->tm_yday = DAYSPERYEAR(Year) - 1;
            } else {
                mday = DAYSPERYEAR(Year);
                if (TimePointer->tm_yday > (mday - 1))
                TimePointer->tm_yday -= mday;
            }
            }
        }
        }
    }
    }

    // add appropriate offset to put time in gmt format
    if (isdst == 1) {
        LinearTime += (time_t) tz->__tzrule[1].offset;
    }
    else {
        // otherwise assume std time
        LinearTime += (time_t) tz->__tzrule[0].offset;
    }
    TZ_UNLOCK;

    // Update the daylight savings result
    TimePointer->tm_isdst = isdst;
    TimePointer->tm_wday  = (DayCount + 4) % 7;
    if (TimePointer->tm_wday < 0) {
        TimePointer->tm_wday += 7;
    }
    return LinearTime;
}
Exemplo n.º 5
0
AP_Logger::log_write_fmt *AP_Logger::msg_fmt_for_name(const char *name, const char *labels, const char *units, const char *mults, const char *fmt)
{
    struct log_write_fmt *f;
    for (f = log_write_fmts; f; f=f->next) {
        if (f->name == name) { // ptr comparison
            // already have an ID for this name:
#if CONFIG_HAL_BOARD == HAL_BOARD_SITL
            assert_same_fmt_for_name(f, name, labels, units, mults, fmt);
#endif
            return f;
        }
    }
    f = (struct log_write_fmt *)calloc(1, sizeof(*f));
    if (f == nullptr) {
        // out of memory
        return nullptr;
    }
    // no message type allocated for this name.  Try to allocate one:
    int16_t msg_type = find_free_msg_type();
    if (msg_type == -1) {
        free(f);
        return nullptr;
    }
    f->msg_type = msg_type;
    f->name = name;
    f->fmt = fmt;
    f->labels = labels;
    f->units = units;
    f->mults = mults;

    int16_t tmp = Write_calc_msg_len(fmt);
    if (tmp == -1) {
        free(f);
        return nullptr;
    }

    f->msg_len = tmp;

    // add to front of list
    f->next = log_write_fmts;
    log_write_fmts = f;

#if CONFIG_HAL_BOARD == HAL_BOARD_SITL
    char ls_name[LS_NAME_SIZE] = {};
    char ls_format[LS_FORMAT_SIZE] = {};
    char ls_labels[LS_LABELS_SIZE] = {};
    char ls_units[LS_UNITS_SIZE] = {};
    char ls_multipliers[LS_MULTIPLIERS_SIZE] = {};
    struct LogStructure ls = {
        f->msg_type,
        f->msg_len,
        ls_name,
        ls_format,
        ls_labels,
        ls_units,
        ls_multipliers
    };
    memcpy((char*)ls_name, f->name, MIN(sizeof(ls_name), strlen(f->name)));
    memcpy((char*)ls_format, f->fmt, MIN(sizeof(ls_format), strlen(f->fmt)));
    memcpy((char*)ls_labels, f->labels, MIN(sizeof(ls_labels), strlen(f->labels)));
    if (f->units != nullptr) {
        memcpy((char*)ls_units, f->units, MIN(sizeof(ls_units), strlen(f->units)));
    } else {
        memset((char*)ls_units, '?', MIN(sizeof(ls_format), strlen(f->fmt)));
    }
    if (f->mults != nullptr) {
        memcpy((char*)ls_multipliers, f->mults, MIN(sizeof(ls_multipliers), strlen(f->mults)));
    } else {
        memset((char*)ls_multipliers, '?', MIN(sizeof(ls_format), strlen(f->fmt)));
    }
    validate_structure(&ls, (int16_t)-1);
#endif

    return f;
}