Exemple #1
0
void dmLogMessage(int level, const char* filename, int lineno, const char *format, ...)
{
	va_list ap;
	static char s_buffer[2048];
    int nWritten = 0;

    if(level < g_logLevel) 
        return;

	Lock(&g_LockLog);
    s_buffer[2047] = 0;
	va_start(ap, format);
    if(g_logType == LOG_DRIVER_SYSLOG)
    {
#ifdef WIN32
        FORMAT_STRING();
        OutputDebugString(s_buffer);
#elif defined(ANDROID)
        __android_log_vprint(g_logLevelNative[level], dmBaseName(filename), format, ap);
#elif defined(LINUX)
        vsyslog(g_logLevelNative[level], format, ap);
#elif defined(__IPHONE__)
        FORMAT_STRING();
        printf(s_buffer);
#endif
    }else if(g_logType == LOG_DRIVER_CONSOLE){
        FORMAT_STRING();
        printf(s_buffer);
    }else if (g_logType == LOG_DRIVER_MMAP){
        FORMAT_STRING();
        mmapLogWrite(s_buffer, nWritten);
    }else if(g_logType == LOG_DRIVER_FILE){
	    if(g_hLogFile != NULL){
            FORMAT_STRING();
            fwrite(s_buffer, sizeof(char), nWritten, g_hLogFile);
	        fflush(g_hLogFile);
        }
    }
    va_end(ap);
	UnLock(&g_LockLog);
}
Exemple #2
0
static size_t
xstrftime(
    char *str,			/* output buffer */
    size_t bsz,			/* space available */
    const char *fmt,
    struct tm *tm,
    double usec,
    double fulltime)
{
    size_t l = 0;			/* chars written so far */
    int incr = 0;			/* chars just written */
    char *s = str;
    TBOOLEAN sign_printed = FALSE;

    memset(str, '\0', bsz);

    while (*fmt != '\0') {
        if (*fmt != '%') {
            if (l >= bsz-1)
                return 0;
            *s++ = *fmt++;
            l++;
        } else {
            /* set up format modifiers */
            int w = 0;
            int z = 0;
            int p = 0;

            if (*++fmt == '0') {
                z = 1;
                ++fmt;
            }
            while (*fmt >= '0' && *fmt <= '9') {
                w = w * 10 + (*fmt - '0');
                ++fmt;
            }
            if (*fmt == '.') {
                ++fmt;
                while (*fmt >= '0' && *fmt <= '9') {
                    p = p * 10 + (*fmt - '0');
                    ++fmt;
                }
                if (p > 6) p = 6;
            }

            switch (*fmt++) {

                /* some shorthands : check that there is space in the
                 * output string. */
#define CHECK_SPACE(n) do {				\
		    if ((l+(n)) > bsz) return 0;	\
		} while (0)

                /* copy a fixed string, checking that there's room */
#define COPY_STRING(z) do {			\
		    CHECK_SPACE(strlen(z)) ;	\
		    strcpy(s, z);		\
		} while (0)

                /* format a string, using default spec if none given w
                 * and z are width and zero-flag dw and dz are the
                 * defaults for these In fact, CHECK_SPACE(w) is not a
                 * sufficient test, since sprintf("%2d", 365) outputs
                 * three characters
                 */
#define FORMAT_STRING(dz, dw, x) do {				\
		    if (w==0) {					\
			w=(dw);					\
			if (!z)					\
			    z=(dz);				\
		    }						\
		    incr = snprintf(s, bsz-l-1, z ? "%0*d" : "%*d", w, (x));	\
		    CHECK_SPACE(incr);				\
		} while(0)

            case '%':
                CHECK_SPACE(1);
                *s = '%';
                break;

            case 'a':
                COPY_STRING(abbrev_day_names[tm->tm_wday]);
                break;

            case 'A':
                COPY_STRING(full_day_names[tm->tm_wday]);
                break;

            case 'b':
            case 'h':
                COPY_STRING(abbrev_month_names[tm->tm_mon]);
                break;

            case 'B':
                COPY_STRING(full_month_names[tm->tm_mon]);
                break;

            case 'd':
                FORMAT_STRING(1, 2, tm->tm_mday);	/* %02d */
                break;

            case 'D':
                if (!xstrftime(s, bsz - l, "%m/%d/%y", tm, 0., fulltime))
                    return 0;
                break;

            case 'F':
                if (!xstrftime(s, bsz - l, "%Y-%m-%d", tm, 0., fulltime))
                    return 0;
                break;

            case 'H':
                FORMAT_STRING(1, 2, tm->tm_hour);	/* %02d */
                break;

            case 'I':
                FORMAT_STRING(1, 2, (tm->tm_hour + 11) % 12 + 1); /* %02d */
                break;

            case 'j':
                FORMAT_STRING(1, 3, tm->tm_yday + 1);	/* %03d */
                break;

            /* not in linux strftime man page. Not really needed now */
            case 'k':
                FORMAT_STRING(0, 2, tm->tm_hour);	/* %2d */
                break;

            case 'l':
                FORMAT_STRING(0, 2, (tm->tm_hour + 11) % 12 + 1); /* %2d */
                break;

            case 'm':
                FORMAT_STRING(1, 2, tm->tm_mon + 1);	/* %02d */
                break;

            case 'M':
                FORMAT_STRING(1, 2, tm->tm_min);	/* %02d */
                break;

            case 'p':
                CHECK_SPACE(2);
                strcpy(s, (tm->tm_hour < 12) ? "am" : "pm");
                break;

            case 'r':
                if (!xstrftime(s, bsz - l, "%I:%M:%S %p", tm, 0., fulltime))
                    return 0;
                break;

            case 'R':
                if (!xstrftime(s, bsz - l, "%H:%M", tm, 0., fulltime))
                    return 0;
                break;

            case 's':
                CHECK_SPACE(12); /* large enough for year 9999 */
                sprintf(s, "%.0f", gtimegm(tm));
                break;

            case 'S':
                FORMAT_STRING(1, 2, tm->tm_sec);	/* %02d */

                /* EAM FIXME - need to implement an actual format specifier */
                if (p > 0) {
                    double base = pow(10., (double)p);
                    int msec = floor(0.5 + base * usec);
                    char *f = &s[strlen(s)];
                    CHECK_SPACE(p+1);
                    sprintf(f, ".%0*d", p, msec<(int)base?msec:(int)base-1);
                }
                break;

            case 'T':
                if (!xstrftime(s, bsz - l, "%H:%M:%S", tm, 0., fulltime))
                    return 0;
                break;

            case 't':		/* Time (as opposed to Date) formats */
            {
                int tminute, tsecond;

                switch (*fmt++) {
                case 'H':
                    /* +/- fractional hours (not wrapped at 24h) */
                    if (p > 0) {
                        incr = snprintf(s, bsz-l-1, "%*.*f", w, p, fulltime/3600.);
                        CHECK_SPACE(incr);
                        break;
                    }
                    /* Set flag in case minutes come next */
                    if (fulltime < 0) {
                        CHECK_SPACE(1);	/* the minus sign */
                        sign_printed = TRUE;
                        *s++ = '-';
                        l++;
                    }
                    /* +/- integral hour truncated toward zero */
                    sprintf(s, "%0*d", w, (int)floor(fabs(fulltime/3600.)));
                    break;
                case 'M':
                    /* +/- fractional minutes (not wrapped at 60m) */
                    if (p > 0) {
                        incr = snprintf(s, bsz-l-1, "%*.*f", w, p,
                                        sign_printed ? fabs(fulltime)/60. : fulltime/60.);
                        CHECK_SPACE(incr);
                        break;
                    }
                    /* +/- integral minute truncated toward zero */
                    tminute = floor(60. * (fabs(fulltime/3600.) - floor(fabs(fulltime/3600.))));
                    if (fulltime < 0) {
                        if (!sign_printed) {
                            sign_printed = TRUE;
                            *s++ = '-';
                            l++;
                        }
                    }
                    FORMAT_STRING(1, 2, tminute);	/* %02d */
                    break;
                case 'S':
                    /* +/- fractional seconds */
                    tsecond = floor(60. * (fabs(fulltime/60.) - floor(fabs(fulltime/60.))));
                    if (fulltime < 0) {
                        if (usec > 0)
                            usec = 1.0 - usec;
                        if (!sign_printed) {
                            *s++ = '-';
                            l++;
                        }
                    }
                    FORMAT_STRING(1, 2, tsecond);	/* %02d */
                    if (p > 0) {
                        double base = pow(10., (double)p);
                        int msec = floor(0.5 + base * usec);
                        char *f = &s[strlen(s)];
                        CHECK_SPACE(p+1);
                        sprintf(f, ".%0*d", p, msec<(int)base?msec:(int)base-1);
                    }
                    break;
                default:
                    break;
                }
                break;
            }

            case 'W':		/* mon 1 day of week */
            {
                int week;
                if (tm->tm_yday <= tm->tm_wday) {
                    week = 1;

                    if ((tm->tm_mday - tm->tm_yday) > 4) {
                        week = 52;
                    }
                    if (tm->tm_yday == tm->tm_wday && tm->tm_wday == 0)
                        week = 52;

                } else {

                    /* sun prev week */
                    int bw = tm->tm_yday - tm->tm_wday;

                    if (tm->tm_wday > 0)
                        bw += 7;	/* sun end of week */

                    week = (int) bw / 7;

                    if ((bw % 7) > 2)	/* jan 1 is before friday */
                        week++;
                }
                FORMAT_STRING(1, 2, week);	/* %02d */
                break;
            }

            case 'U':		/* sun 1 day of week */
            {
                int week, bw;

                if (tm->tm_yday <= tm->tm_wday) {
                    week = 1;
                    if ((tm->tm_mday - tm->tm_yday) > 4) {
                        week = 52;
                    }
                } else {
                    /* sat prev week */
                    bw = tm->tm_yday - tm->tm_wday - 1;
                    if (tm->tm_wday >= 0)
                        bw += 7;	/* sat end of week */
                    week = (int) bw / 7;
                    if ((bw % 7) > 1) {	/* jan 1 is before friday */
                        week++;
                    }
                }
                FORMAT_STRING(1, 2, week);	/* %02d */
                break;
            }

            case 'w':		/* day of week, sun=0 */
                FORMAT_STRING(1, 2, tm->tm_wday);	/* %02d */
                break;

            case 'y':
                FORMAT_STRING(1, 2, tm->tm_year % 100);		/* %02d */
                break;

            case 'Y':
                FORMAT_STRING(1, 4, tm->tm_year);	/* %04d */
                break;

            }			/* switch */

            while (*s != '\0') {
                s++;
                l++;
            }
#undef CHECK_SPACE
#undef COPY_STRING
#undef FORMAT_STRING
        } /* switch(fmt letter) */
    } /* if(fmt letter not '%') */
    return (l);
}
Exemple #3
0
void
gimp_cursor_view_update_cursor (GimpCursorView   *view,
                                GimpImage        *image,
                                GimpUnit          unit,
                                gdouble           x,
                                gdouble           y)
{
  gboolean      in_image;
  gdouble       unit_factor;
  gint          unit_digits;
  const gchar  *unit_str;
  gchar         format_buf[32];
  gchar         buf[32];
  GimpImageType sample_type;
  GimpRGB       color;
  gint          color_index;

  g_return_if_fail (GIMP_IS_CURSOR_VIEW (view));
  g_return_if_fail (GIMP_IS_IMAGE (image));

  if (unit == GIMP_UNIT_PIXEL)
    unit = gimp_image_get_unit (image);

  in_image = (x >= 0.0 && x < gimp_image_get_width  (image) &&
              y >= 0.0 && y < gimp_image_get_height (image));

  unit_factor = _gimp_unit_get_factor (image->gimp, unit);
  unit_digits = _gimp_unit_get_digits (image->gimp, unit);
  unit_str    = _gimp_unit_get_abbreviation (image->gimp, unit);

#define FORMAT_STRING(s) (in_image ? (s) : "("s")")

  g_snprintf (buf, sizeof (buf), FORMAT_STRING ("%d"), (gint) floor (x));
  gtk_label_set_text (GTK_LABEL (view->pixel_x_label), buf);

  g_snprintf (buf, sizeof (buf), FORMAT_STRING ("%d"), (gint) floor (y));
  gtk_label_set_text (GTK_LABEL (view->pixel_y_label), buf);

  g_snprintf (format_buf, sizeof (format_buf),
              FORMAT_STRING ("%%.%df %s"), unit_digits, unit_str);

  g_snprintf (buf, sizeof (buf), format_buf,
              x * unit_factor / image->xresolution);
  gtk_label_set_text (GTK_LABEL (view->unit_x_label), buf);

  g_snprintf (buf, sizeof (buf), format_buf,
              y * unit_factor / image->yresolution);
  gtk_label_set_text (GTK_LABEL (view->unit_y_label), buf);

  if (gimp_image_pick_color (image, NULL,
                             (gint) floor (x),
                             (gint) floor (y),
                             view->sample_merged,
                             FALSE, 0.0,
                             &sample_type, &color, &color_index))
    {
      gimp_color_frame_set_color (GIMP_COLOR_FRAME (view->color_frame_1),
                                  sample_type, &color, color_index);
      gimp_color_frame_set_color (GIMP_COLOR_FRAME (view->color_frame_2),
                                  sample_type, &color, color_index);
    }
  else
    {
      gimp_color_frame_set_invalid (GIMP_COLOR_FRAME (view->color_frame_1));
      gimp_color_frame_set_invalid (GIMP_COLOR_FRAME (view->color_frame_2));
    }
}
Exemple #4
0
static size_t
xstrftime(
    char *str,			/* output buffer */
    size_t bsz,			/* space available */
    const char *fmt,
    struct tm *tm)
{
    size_t l = 0;			/* chars written so far */

    char *s = str;

    memset(s, '\0', bsz);

    while (*fmt != '\0') {
        if (*fmt != '%') {
            if (l >= bsz)
                return (0);
            *s++ = *fmt++;
            l++;
        } else {
            /* set up format modifiers */
            int w = 0;
            int z = 0;

            if (*++fmt == '0') {
                z = 1;
                ++fmt;
            }
            while (*fmt >= '0' && *fmt <= '9') {
                w = w * 10 + (*fmt - '0');
                ++fmt;
            }

            switch (*fmt++) {

                /* some shorthands : check that there is space in the
                 * output string. */
#define CHECK_SPACE(n) do {				\
		    if ((l+(n)) > bsz) return 0;	\
		} while (0)

                /* copy a fixed string, checking that there's room */
#define COPY_STRING(z) do {			\
		    CHECK_SPACE(strlen(z)) ;	\
		    strcpy(s, z);		\
		} while (0)

                /* format a string, using default spec if none given w
                 * and z are width and zero-flag dw and dz are the
                 * defaults for these In fact, CHECK_SPACE(w) is not a
                 * sufficient test, since sprintf("%2d", 365) outputs
                 * three characters
                 */
#define FORMAT_STRING(dz, dw, x) do {				\
		    if (w==0) {					\
			w=(dw);					\
			if (!z)					\
			    z=(dz);				\
		    }						\
		    CHECK_SPACE(w);				\
		    sprintf(s, z ? "%0*d" : "%*d", w, (x));	\
		} while(0)

            case '%':
                CHECK_SPACE(1);
                *s = '%';
                break;

            case 'a':
                COPY_STRING(abbrev_day_names[tm->tm_wday]);
                break;

            case 'A':
                COPY_STRING(full_day_names[tm->tm_wday]);
                break;

            case 'b':
            case 'h':
                COPY_STRING(abbrev_month_names[tm->tm_mon]);
                break;

            case 'B':
                COPY_STRING(full_month_names[tm->tm_mon]);
                break;


#if 0
            /* %x not currently supported, so neither is c */
            case 'c':
                if (!xstrftime(s, bsz - l, "%x %X", tm))
                    return (0);
                break;
#endif

            case 'd':
                FORMAT_STRING(1, 2, tm->tm_mday);	/* %02d */
                break;

            case 'D':
                if (!xstrftime(s, bsz - l, "%m/%d/%y", tm))
                    return (0);
                break;

            case 'F':
                if (!xstrftime(s, bsz - l, "%Y-%m-%d", tm))
                    return (0);
                break;

            case 'H':
                FORMAT_STRING(1, 2, tm->tm_hour);	/* %02d */
                break;

            case 'I':
                FORMAT_STRING(1, 2, (tm->tm_hour + 11) % 12 + 1); /* %02d */
                break;

            case 'j':
                FORMAT_STRING(1, 3, tm->tm_yday + 1);	/* %03d */
                break;

            /* not in linux strftime man page. Not really needed now */
            case 'k':
                FORMAT_STRING(0, 2, tm->tm_hour);	/* %2d */
                break;

            case 'l':
                FORMAT_STRING(0, 2, (tm->tm_hour + 11) % 12 + 1); /* %2d */
                break;

            case 'm':
                FORMAT_STRING(1, 2, tm->tm_mon + 1);	/* %02d */
                break;

            case 'M':
                FORMAT_STRING(1, 2, tm->tm_min);	/* %02d */
                break;

            case 'p':
                CHECK_SPACE(2);
                strcpy(s, (tm->tm_hour < 12) ? "am" : "pm");
                break;

            case 'r':
                if (!xstrftime(s, bsz - l, "%I:%M:%S %p", tm))
                    return (0);
                break;

            case 'R':
                if (!xstrftime(s, bsz - l, "%H:%M", tm))
                    return (0);
                break;

            case 'S':
                FORMAT_STRING(1, 2, tm->tm_sec);	/* %02d */
                break;

            case 'T':
                if (!xstrftime(s, bsz - l, "%H:%M:%S", tm))
                    return (0);
                break;

            case 'W':		/* mon 1 day of week */
            {
                int week;
                if (tm->tm_yday <= tm->tm_wday) {
                    week = 1;

                    if ((tm->tm_mday - tm->tm_yday) > 4) {
                        week = 52;
                    }
                    if (tm->tm_yday == tm->tm_wday && tm->tm_wday == 0)
                        week = 52;

                } else {

                    /* sun prev week */
                    int bw = tm->tm_yday - tm->tm_wday;

                    if (tm->tm_wday > 0)
                        bw += 7;	/* sun end of week */

                    week = (int) bw / 7;

                    if ((bw % 7) > 2)	/* jan 1 is before friday */
                        week++;
                }
                FORMAT_STRING(1, 2, week);	/* %02d */
                break;
            }

            case 'U':		/* sun 1 day of week */
            {
                int week, bw;

                if (tm->tm_yday <= tm->tm_wday) {
                    week = 1;
                    if ((tm->tm_mday - tm->tm_yday) > 4) {
                        week = 52;
                    }
                } else {
                    /* sat prev week */
                    bw = tm->tm_yday - tm->tm_wday - 1;
                    if (tm->tm_wday >= 0)
                        bw += 7;	/* sat end of week */
                    week = (int) bw / 7;
                    if ((bw % 7) > 1) {	/* jan 1 is before friday */
                        week++;
                    }
                }
                FORMAT_STRING(1, 2, week);	/* %02d */
                break;
            }

            case 'w':		/* day of week, sun=0 */
                FORMAT_STRING(1, 2, tm->tm_wday);	/* %02d */
                break;

            case 'y':
                FORMAT_STRING(1, 2, tm->tm_year % 100);		/* %02d */
                break;

            case 'Y':
                FORMAT_STRING(1, 4, tm->tm_year);	/* %04d */
                break;

#if 0
            case 'Z':
                COPY_STRING(tm->tm_zone);
                break;
#endif
            }			/* switch */

            while (*s != '\0') {
                s++;
                l++;
            }
#undef CHECK_SPACE
#undef COPY_STRING
#undef FORMAT_STRING
        } /* switch(fmt letter) */
    } /* if(fmt letter not '%') */
    return (l);
}