Пример #1
0
_OutputIter
time_put<_Ch,_OutputIter>::do_put(_OutputIter __s, ios_base& __f, _Ch     /* __fill */ ,
				  const tm* __tmb,
				  char __format, char __modifier ) const 
{
  char __buf[64];
  char * __iend = __write_formatted_time(__buf, __format, __modifier,
					 _M_timeinfo, __tmb);
  //  locale __loc = __f.getloc();
  return __put_time(__buf, __iend, __s, __f, _Ch());
}
Пример #2
0
inline char* __subformat(string format, char*& buf, 
			 const _Time_Info&  table, const tm* t) {
  const char * cp = format.data();
  const char * cp_end = cp + format.size();
  while (cp != cp_end) {
    if (*cp == '%') {
      ++cp;
      buf = __write_formatted_time(buf, *cp++, table, t);
    } else
      *buf++ = *cp++;
  }
  return buf;
}
Пример #3
0
inline char* __subformat(const string& format, char*& buf, size_t buf_size,
                         const _Time_Info&  table, const tm* t) {
  const char * cp = format.data();
  const char * cp_end = cp + format.size();
  while (cp != cp_end) {
    if (*cp == '%') {
      char mod = 0;
      ++cp;
      if(*cp == '#') {
        mod = *cp; ++cp;
      }
      char *former_buf = buf;
      buf = __write_formatted_time(buf, buf_size, *cp++, mod, table, t);
      buf_size -= (buf - former_buf);
    } else
      *buf++ = *cp++;
  }
  return buf;
}
Пример #4
0
char * __write_formatted_time(char* buf, char format, char modifier,
                              const _Time_Info& table, const tm* t) {
  switch(format) {
    case 'a':
      return copy(table._M_dayname[t->tm_wday].begin(),
                  table._M_dayname[t->tm_wday].end(),
                  buf);

    case 'A':
      return copy(table._M_dayname[t->tm_wday+7].begin(),
                  table._M_dayname[t->tm_wday+7].end(),
                  buf);

    case 'b':
      return copy(table._M_monthname[t->tm_mon].begin(),
                  table._M_monthname[t->tm_mon].end(),
                  buf);

    case 'B':
      return copy(table._M_monthname[t->tm_mon+12].begin(),
                  table._M_monthname[t->tm_mon+12].end(),
                  buf);

    case 'c': {
      const char *cp = (modifier != '#') ?
        table._M_date_time_format.data() :
        table._M_long_date_time_format.data();
      const char* cp_end = cp +
        ((modifier != '#') ? table._M_date_time_format.size() :
         table._M_long_date_time_format.size() );
      char mod = 0;
      while (cp != cp_end) {
        if (*cp == '%') {
          ++cp; if(*cp == '#') mod = *cp++; else mod = 0;
          buf = __write_formatted_time(buf, *cp++, mod, table, t);
        }
        else
          *buf++ = *cp++;
      }
      return buf;
    }

    case 'd': 
      sprintf(buf, (modifier != '#')?"%.2ld":"%ld", (long)t->tm_mday);
      return ((long)t->tm_mday < 10L && modifier == '#')?buf+1:buf + 2;

    case 'e':
      sprintf(buf, "%2ld", (long)t->tm_mday);
      return buf + 2;

    case 'H':
      sprintf(buf, (modifier != '#')?"%.2ld":"%ld", (long)t->tm_hour);
      return ((long)t->tm_hour < 10L && modifier == '#')?buf+1:buf + 2;

    case 'I':
      sprintf(buf, (modifier != '#')?"%.2ld":"%ld", (long)__hour12(t->tm_hour));
      return ((long)__hour12(t->tm_hour) < 10L && modifier == '#')?buf+1:buf + 2;

    case 'j':
      return __write_integer(buf, 0, (long)((long)t->tm_yday + 1));

    case 'm':
      sprintf(buf, (modifier != '#')?"%.2ld":"%ld", (long)t->tm_mon + 1);
      return ((long)(t->tm_mon + 1) < 10L && modifier == '#')?buf+1:buf + 2;

    case 'M':
      sprintf(buf, (modifier != '#')?"%.2ld":"%ld", (long)t->tm_min);
      return ((long)t->tm_min < 10L && modifier == '#')?buf+1:buf + 2;

    case 'p':
      return copy(table._M_am_pm[t->tm_hour/12].begin(),
                  table._M_am_pm[t->tm_hour/12].end(),
                  buf);

    case 'S': // pad with zeros
       sprintf(buf, (modifier != '#')?"%.2ld":"%ld", (long)t->tm_sec);
       return ((long)t->tm_sec < 10L && modifier == '#')?buf+1:buf + 2;

    case 'U':
      return __write_integer(buf, 0, 
                             long((t->tm_yday - t->tm_wday + 7) / 7));
      //      break;

    case 'w':
      return __write_integer(buf, 0, (long)t->tm_wday);
      //      break;

    case 'W':
      return __write_integer(buf, 0,
                             (long)(t->tm_wday == 0 ? (t->tm_yday + 1) / 7 :
                                                      (t->tm_yday + 8 - t->tm_wday) / 7));

    case'x': {
      const char * cp = (modifier != '#') ? table._M_date_format.data():
                                            table._M_long_date_format.data();
      const char* cp_end = (modifier != '#') ? cp + table._M_date_format.size():
                                               cp + table._M_long_date_format.size();
      char mod = 0;
      while (cp != cp_end) {
        if (*cp == '%') {
          ++cp; if(*cp == '#') mod = *cp++; else mod = 0;
          buf = __write_formatted_time(buf, *cp++, mod, table, t);
        }
        else
          *buf++ = *cp++;
      }
      return buf;
    }

    case 'X': {
      const char * cp = table._M_time_format.data();
      const char* cp_end = cp + table._M_time_format.size();
      char mod = 0;
      while (cp != cp_end) {
        if (*cp == '%') {
          ++cp; if(*cp == '#') mod = *cp++; else mod = 0;
          buf = __write_formatted_time(buf, *cp++, mod, table, t);
        }
        else
          *buf++ = *cp++;
      }
      return buf;
    }
    case 'y':
      return __write_integer(buf, 0, (long)((long)(t->tm_year + 1900) % 100));

    case 'Y':
      return __write_integer(buf, 0, (long)((long)t->tm_year + 1900));

    case '%':
      *buf++ = '%';
      return buf;

#ifdef __GNUC__

      // fbp : at least on SUN 
#  if defined ( _STLP_UNIX ) && ! defined (__linux__)
#    define __USE_BSD 1
#  endif
 
   /*********************************************
    *     JGS, handle various extensions        *
    *********************************************/

    case 'h': /* POSIX.2 extension */
      // same as 'b', abbrev month name
      return copy(table._M_monthname[t->tm_mon].begin(),
                  table._M_monthname[t->tm_mon].end(),
                  buf);

    case 'C': /* POSIX.2 extension */
      // same as 'd', the day 
      sprintf(buf, "%2ld", (long)t->tm_mday);
      return buf + 2;

    case 'D': /* POSIX.2 extension */
      // same as 'x'
      return __subformat(table._M_date_format, buf, table, t);

    case 'k': /* GNU extension */
      sprintf(buf, "%2ld", (long)t->tm_hour);
      return buf + 2;

    case 'l': /* GNU extension */
      sprintf(buf, "%2ld", (long)t->tm_hour % 12);
      return buf + 2;

    case 'n': /* POSIX.2 extension */
      *buf++ = '\n';
      return buf;

    case 'R': /* GNU extension */
      return __subformat("%H:%M", buf, table, t);

    case 'r': /* POSIX.2 extension */
      return __subformat("%I:%M:%S %p", buf, table, t);

    case 'T': /* POSIX.2 extension.  */
      return __subformat("%H:%M:%S", buf, table, t);

    case 't': /* POSIX.2 extension.  */
      *buf++ = '\t';
      return buf;

    case 'u': /* POSIX.2 extension.  */
      return __write_integer(buf, 0, long((t->tm_wday - 1 + 7)) % 7 + 1);

    case 's': {
      time_t __t;
      __t = mktime ((tm*)t);
      return __write_integer(buf, 0, (long)__t );
    }
    case 'g': /* GNU extension */
    case 'G': {
      int year = t->tm_year + __TM_YEAR_BASE;
      int days = __iso_week_days (t->tm_yday, t->tm_wday);
      if (days < 0) {
        /* This ISO week belongs to the previous year.  */
        year--;
        days = __iso_week_days (t->tm_yday + (365 + __is_leap (year)), t->tm_wday);
      } else {
        int d = __iso_week_days (t->tm_yday - (365 + __is_leap (year)), t->tm_wday);
        if (0 <= d) {
          /* This ISO week belongs to the next year.  */
          ++year;
          days = d;
        }
      }
      switch (format) {
      case 'g':
        return __write_integer(buf, 0, (long)(year % 100 + 100) % 100);
      case 'G':
        return __write_integer(buf, 0, (long)year);
      default:
        return __write_integer(buf, 0, (long)days / 7 + 1);
      }
    }

# if defined ( _STLP_USE_GLIBC  ) && ! defined (__CYGWIN__)
    case 'z':   /* GNU extension.  */
      if (t->tm_isdst < 0)
        break;
      {
        int diff;
#if defined(__USE_BSD) || defined(__BEOS__)
        diff = t->tm_gmtoff;
#else
        diff = t->__tm_gmtoff;
#endif
        if (diff < 0) {
          *buf++ = '-';
          diff = -diff;
        } else
          *buf++ = '+';
        diff /= 60;
        sprintf(buf, "%.4d", (diff / 60) * 100 + diff % 60);
        return buf + 4;
      }
# endif /* __GLIBC__ */
#endif /* __GNUC__ */

    default:
      //      return buf;
      break;
  }
  return buf;
}