int stats_buffer_write(struct stats_buffer *sf) { int rc = 0; sf->sf_data=""; struct utsname uts_buf; uname(&uts_buf); sf_printf(sf, "\n%f %s %s\n", current_time, current_jobid, uts_buf.nodename); /* Write mark. */ if (sf->sf_mark != NULL) { const char *str = sf->sf_mark; while (*str != 0) { const char *eol = strchrnul(str, '\n'); sf_printf(sf, "%c%*s\n", SF_MARK_CHAR, (int) (eol - str), str); str = eol; if (*str == '\n') str++; } } /* Write stats. */ size_t i = 0; struct stats_type *type; while ((type = stats_type_for_each(&i)) != NULL) { if (!(type->st_enabled && type->st_selected)) continue; size_t j = 0; char *dev; while ((dev = dict_for_each(&type->st_current_dict, &j)) != NULL) { struct stats *stats = key_to_stats(dev); sf_printf(sf, "%s %s", type->st_name, stats->s_dev); size_t k; for (k = 0; k < type->st_schema.sc_len; k++) { sf_printf(sf, " %llu", stats->s_val[k]); } sf_printf(sf, "\n"); } } rc = send(sf); free(sf->sf_path); free(sf->sf_mark); free(sf->sf_data); memset(sf, 0, sizeof(struct stats_buffer)); return rc; }
/* * funkcja wyswietla tetramino jakie poleci w nastepnej kolejnosci, * przy okazji jak jest nowe tetramino (bo wtedy jest odpalana), to mozna * wypisywac punkty i linie. */ void tetramino_preview(struct game *g, const int *tmino, int size) { static SDL_Rect r[2]; struct position *p = g->frontend; int i; r[0].x = p->x2; r[0].y = p->y2; r[0].w = p->size * PREVIEW_W; r[0].h = p->size * PREVIEW_H; /* TODO: zrobic ten preview szybszy? */ SDL_BlitSurface(bground, &r[0], screen, &r[0]); /* teraz petla po kaflach tetramino */ for (i = 0; i < size; ++i) { /* TODO: zrobic to ansi c kompatybilne */ SDL_Rect r = {p->x2, p->y2, p->size, p->size}; const int pos = PREVIEW_W / 2 + tmino[i]; const int x = pos % MATRIX_WIDTH; const int y = pos / MATRIX_WIDTH; r.x += p->size * x; r.y += p->size * y; SDL_BlitSurface(block[g->next_tetramino], NULL, screen, &r); } /* w tym miejscu juz stary r */ /* TODO: do oddzielnej funkcji z tym */ SDL_BlitSurface(bground, &r[1], screen, &r[1]); r[1].x = r[0].x; r[1].y = r[0].y + r[0].h + 5; sf_printf(screen, &r[1], "Points: %4d\nLines : %4d\nLevel : %4d", g->points, g->lines_cleared, g->level); SDL_UpdateRects(screen, sizeof(r) / sizeof(r[0]), r); }
int stats_wr_hdr(struct stats_buffer *sf) { struct utsname uts_buf; unsigned long long uptime = 0; uname(&uts_buf); pscanf("/proc/uptime", "%llu", &uptime); sf->sf_data = ""; sf_printf(sf, "%c%s %s\n", SF_PROPERTY_CHAR, STATS_PROGRAM, STATS_VERSION); sf_printf(sf, "%chostname %s\n", SF_PROPERTY_CHAR, uts_buf.nodename); sf_printf(sf, "%cuname %s %s %s %s\n", SF_PROPERTY_CHAR, uts_buf.sysname, uts_buf.machine, uts_buf.release, uts_buf.version); sf_printf(sf, "%cuptime %llu\n", SF_PROPERTY_CHAR, uptime); size_t i = 0; struct stats_type *type; while ((type = stats_type_for_each(&i)) != NULL) { if (!type->st_enabled) continue; TRACE("type %s, schema_len %zu\n", type->st_name, type->st_schema.sc_len); /* Write schema. */ sf_printf(sf, "%c%s", SF_SCHEMA_CHAR, type->st_name); /* MOVEME */ size_t j; for (j = 0; j < type->st_schema.sc_len; j++) { struct schema_entry *se = type->st_schema.sc_ent[j]; sf_printf(sf, " %s", se->se_key); if (se->se_type == SE_CONTROL) sf_printf(sf, ",C"); if (se->se_type == SE_EVENT) sf_printf(sf, ",E"); if (se->se_unit != NULL) sf_printf(sf, ",U=%s", se->se_unit); if (se->se_width != 0) sf_printf(sf, ",W=%u", se->se_width); } sf_printf(sf, "\n"); } send(sf); return 0; }