From: Jean-Philippe Orsini Date: Sun, 6 May 2012 11:04:48 +0000 (+0000) Subject: added module to handle log X-Git-Tag: v1.3.0~107 X-Git-Url: http://git.wpitchoune.net/gitweb/?p=ppastats.git;a=commitdiff_plain;h=49b52ead6d48488a4c1f90f372564c834da803cb added module to handle log fixed some strings --- diff --git a/po/Makefile b/po/Makefile index abc8a96..97f7a5c 100644 --- a/po/Makefile +++ b/po/Makefile @@ -73,7 +73,12 @@ $(POFILES) $(GMOFILES) \ $(DISTFILES.extra1) $(DISTFILES.extra2) $(DISTFILES.extra3) POTFILES = \ - ../src/main.c + ../src/cache.c \ + ../src/html.c \ + ../src/log.c \ + ../src/lp_ws.c \ + ../src/main.c \ + ../src/ppastats.c CATALOGS = fr.gmo diff --git a/po/POTFILES b/po/POTFILES index 403b79c..d3900b9 100644 --- a/po/POTFILES +++ b/po/POTFILES @@ -1 +1,6 @@ - ../src/main.c + ../src/cache.c \ + ../src/html.c \ + ../src/log.c \ + ../src/lp_ws.c \ + ../src/main.c \ + ../src/ppastats.c diff --git a/po/POTFILES.in b/po/POTFILES.in index 1221e82..0e2c8c9 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -1,2 +1,7 @@ # List of source files which contain translatable strings. +src/cache.c +src/html.c +src/log.c +src/lp_ws.c src/main.c +src/ppastats.c diff --git a/po/fr.po b/po/fr.po index 0795101..6b1efaf 100644 --- a/po/fr.po +++ b/po/fr.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ppastats 0.0.x\n" "Report-Msgid-Bugs-To: jeanfi@gmail.com\n" -"POT-Creation-Date: 2012-05-05 23:52+0200\n" +"POT-Creation-Date: 2012-05-06 13:01+0200\n" "PO-Revision-Date: 2012-05-05 23:45+0200\n" "Last-Translator: \n" "Language-Team: French\n" @@ -17,7 +17,68 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: src/main.c:101 +#: src/cache.c:57 +#, c-format +msgid "cache hit %s" +msgstr "" + +#: src/cache.c:62 +#, c-format +msgid "cache miss %s" +msgstr "" + +#: src/cache.c:71 +msgid "exceed cache capacity" +msgstr "" + +#: src/html.c:392 src/html.c:417 +#, c-format +msgid "failed to open: %s" +msgstr "" + +#: src/html.c:448 src/html.c:468 src/html.c:481 +#, c-format +msgid "generating %s" +msgstr "" + +#: src/html.c:544 +#, c-format +msgid "copying %s %s" +msgstr "" + +#: src/log.c:37 +#, c-format +msgid "Cannot open log file: %s" +msgstr "" + +#: src/lp_ws.c:71 +#, c-format +msgid "fetch_url(): %s" +msgstr "" + +#: src/lp_ws.c:74 +msgid "initializing CURL" +msgstr "" + +#: src/lp_ws.c:109 +#, c-format +msgid "Fetch failed with code %ld for URL %s" +msgstr "" + +#: src/lp_ws.c:114 +msgid "Wait 5s before retry" +msgstr "" + +#: src/lp_ws.c:122 +#, c-format +msgid "Fetch failed: %ld" +msgstr "" + +#: src/lp_ws.c:294 +msgid "cleanup CURL" +msgstr "" + +#: src/main.c:102 #, c-format msgid "" "Copyright (C) %s jeanfi@gmail.com\n" @@ -34,19 +95,73 @@ msgstr "" "Ce logiciel n'est accompagné d’ABSOLUMENT AUCUNE GARANTIE, dans les limites\n" "autorisées par la loi applicable.\n" -#: src/main.c:111 +#: src/main.c:112 #, c-format msgid "Usage: %s [OPTION]... PPA_OWNER PPA_NAME\n" msgstr "Utilisation: %s [OPTION]... PPA_OWNER PPA_NAME\n" -#: src/main.c:120 +#: src/main.c:114 +msgid "ppastats is a command application for generating PPA statistics.\n" +msgstr "" + +#: src/main.c:117 +msgid "" +"Prints number of downloads for each published packages of a PPA or generates " +"an HTML page containing a graph representation." +msgstr "" + +#: src/main.c:122 msgid "Options:" msgstr "Options:" -#: src/main.c:121 +#: src/main.c:123 msgid "" " -h, --help display this help and exit\n" " -v, --version display version information and exit" msgstr "" " -h, --help afficher cette aide et quitter\n" " -v, --version afficher les informations de version et quitter" + +#: src/main.c:129 +msgid " -o, --output-dir=[PATH] generates HTML pages into 'PATH'." +msgstr "" + +#: src/main.c:132 +msgid "" +" -s, --status=[STATUS]\t\tretrieves only package of the given status\n" +"\t\t\t\t(possible values are: Pending, Published, \n" +"\t\t\t\tSuperseded, Deleted or Obsolete)." +msgstr "" + +#: src/main.c:137 +msgid " -S, --skip-js-css\t\tskip installation of js and css files" +msgstr "" + +#: src/main.c:141 +#, c-format +msgid "Report bugs to: %s\n" +msgstr "" + +#: src/main.c:143 +#, c-format +msgid "%s home page: <%s>\n" +msgstr "" + +#: src/main.c:193 +#, c-format +msgid "Try `%s --help' for more information.\n" +msgstr "" + +#: src/ppastats.c:254 +msgid "Failed to retrieve PPA information" +msgstr "" + +#: src/ppastats.c:269 +#, c-format +msgid "Failed to retrieve download totals for %s" +msgstr "" + +#: src/ppastats.c:275 +#, c-format +msgid "Failed to retrieve download count for %s" +msgstr "" diff --git a/po/ppastats.pot b/po/ppastats.pot index 12dd2c0..e151df2 100644 --- a/po/ppastats.pot +++ b/po/ppastats.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: ppastats 0.0.x\n" "Report-Msgid-Bugs-To: jeanfi@gmail.com\n" -"POT-Creation-Date: 2012-05-05 23:52+0200\n" +"POT-Creation-Date: 2012-05-06 13:01+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,7 +17,68 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: src/main.c:101 +#: src/cache.c:57 +#, c-format +msgid "cache hit %s" +msgstr "" + +#: src/cache.c:62 +#, c-format +msgid "cache miss %s" +msgstr "" + +#: src/cache.c:71 +msgid "exceed cache capacity" +msgstr "" + +#: src/html.c:392 src/html.c:417 +#, c-format +msgid "failed to open: %s" +msgstr "" + +#: src/html.c:448 src/html.c:468 src/html.c:481 +#, c-format +msgid "generating %s" +msgstr "" + +#: src/html.c:544 +#, c-format +msgid "copying %s %s" +msgstr "" + +#: src/log.c:37 +#, c-format +msgid "Cannot open log file: %s" +msgstr "" + +#: src/lp_ws.c:71 +#, c-format +msgid "fetch_url(): %s" +msgstr "" + +#: src/lp_ws.c:74 +msgid "initializing CURL" +msgstr "" + +#: src/lp_ws.c:109 +#, c-format +msgid "Fetch failed with code %ld for URL %s" +msgstr "" + +#: src/lp_ws.c:114 +msgid "Wait 5s before retry" +msgstr "" + +#: src/lp_ws.c:122 +#, c-format +msgid "Fetch failed: %ld" +msgstr "" + +#: src/lp_ws.c:294 +msgid "cleanup CURL" +msgstr "" + +#: src/main.c:102 #, c-format msgid "" "Copyright (C) %s jeanfi@gmail.com\n" @@ -27,17 +88,71 @@ msgid "" "There is NO WARRANTY, to the extent permitted by law.\n" msgstr "" -#: src/main.c:111 +#: src/main.c:112 #, c-format msgid "Usage: %s [OPTION]... PPA_OWNER PPA_NAME\n" msgstr "" -#: src/main.c:120 +#: src/main.c:114 +msgid "ppastats is a command application for generating PPA statistics.\n" +msgstr "" + +#: src/main.c:117 +msgid "" +"Prints number of downloads for each published packages of a PPA or generates " +"an HTML page containing a graph representation." +msgstr "" + +#: src/main.c:122 msgid "Options:" msgstr "" -#: src/main.c:121 +#: src/main.c:123 msgid "" " -h, --help display this help and exit\n" " -v, --version display version information and exit" msgstr "" + +#: src/main.c:129 +msgid " -o, --output-dir=[PATH] generates HTML pages into 'PATH'." +msgstr "" + +#: src/main.c:132 +msgid "" +" -s, --status=[STATUS]\t\tretrieves only package of the given status\n" +"\t\t\t\t(possible values are: Pending, Published, \n" +"\t\t\t\tSuperseded, Deleted or Obsolete)." +msgstr "" + +#: src/main.c:137 +msgid " -S, --skip-js-css\t\tskip installation of js and css files" +msgstr "" + +#: src/main.c:141 +#, c-format +msgid "Report bugs to: %s\n" +msgstr "" + +#: src/main.c:143 +#, c-format +msgid "%s home page: <%s>\n" +msgstr "" + +#: src/main.c:193 +#, c-format +msgid "Try `%s --help' for more information.\n" +msgstr "" + +#: src/ppastats.c:254 +msgid "Failed to retrieve PPA information" +msgstr "" + +#: src/ppastats.c:269 +#, c-format +msgid "Failed to retrieve download totals for %s" +msgstr "" + +#: src/ppastats.c:275 +#, c-format +msgid "Failed to retrieve download count for %s" +msgstr "" diff --git a/src/Makefile.am b/src/Makefile.am index e19e20a..03bb962 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -13,6 +13,7 @@ ppastats_SOURCES = \ html.h html.c\ io.h io.c\ list.h list.c\ + log.h log.c\ lp.h lp.c\ lp_json.h lp_json.c\ lp_ws.h lp_ws.c\ diff --git a/src/Makefile.in b/src/Makefile.in index a8341ef..3dfb16b 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -54,8 +54,8 @@ CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" PROGRAMS = $(bin_PROGRAMS) am_ppastats_OBJECTS = cache.$(OBJEXT) html.$(OBJEXT) io.$(OBJEXT) \ - list.$(OBJEXT) lp.$(OBJEXT) lp_json.$(OBJEXT) lp_ws.$(OBJEXT) \ - main.$(OBJEXT) ppastats.$(OBJEXT) + list.$(OBJEXT) log.$(OBJEXT) lp.$(OBJEXT) lp_json.$(OBJEXT) \ + lp_ws.$(OBJEXT) main.$(OBJEXT) ppastats.$(OBJEXT) ppastats_OBJECTS = $(am_ppastats_OBJECTS) ppastats_LDADD = $(LDADD) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) @@ -231,6 +231,7 @@ ppastats_SOURCES = \ html.h html.c\ io.h io.c\ list.h list.c\ + log.h log.c\ lp.h lp.c\ lp_json.h lp_json.c\ lp_ws.h lp_ws.c\ @@ -323,6 +324,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/html.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/io.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/list.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/log.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lp_json.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lp_ws.Po@am__quote@ diff --git a/src/cache.c b/src/cache.c index 940294e..cd24367 100644 --- a/src/cache.c +++ b/src/cache.c @@ -17,9 +17,13 @@ 02110-1301 USA */ +#include +#define _(String) gettext(String) + #include #include "cache.h" +#include "log.h" #include "ppastats.h" #include @@ -50,14 +54,12 @@ const void *cache_get(const char *key) for (i = 0; i < cache.size; i++) if (!strcmp(cache.entries[i].key, key)) { - if (debug) - printf("DEBUG: cache hit %s\n", key); + log_debug(_("cache hit %s"), key); return cache.entries[i].value; } - if (debug) - printf("DEBUG: cache miss %s\n", key); + log_debug(_("cache miss %s"), key); return NULL; } @@ -66,7 +68,7 @@ void cache_put(const char *key, const void *value, void (*fct_cleanup)(void *)) { if (cache.size == CAPACITY) { - fprintf(stderr, "WARNING: exceed cache capacity\n"); + log_warn(_("exceed cache capacity")); return ; } diff --git a/src/html.c b/src/html.c index 2fd1eef..e79c2a4 100644 --- a/src/html.c +++ b/src/html.c @@ -17,6 +17,9 @@ 02110-1301 USA */ +#include +#define _(String) gettext(String) + #include #include #include @@ -28,6 +31,7 @@ #include "html.h" #include "io.h" +#include "log.h" #include "lp.h" #include "lp_ws.h" #include "ppastats.h" @@ -385,7 +389,7 @@ version_to_html(struct ppa_stats *ppa, f = fopen(path, "w"); if (!f) { - fprintf(stderr, "ERROR: failed to open: %s\n", path); + log_err(_("failed to open: %s"), path); return ; } @@ -410,7 +414,7 @@ create_html(const char *path, f = fopen(path, "w"); if (!f) { - fprintf(stderr, "ERROR: failed to open: %s\n", path); + log_err(_("failed to open: %s"), path); return ; } @@ -440,8 +444,8 @@ index_to_html(struct ppa_stats *ppa, const char *dir) json = ppa_to_json(ppa); json_path = path_new(dir, "index", ".json"); - if (debug) - printf("DEBUG: generating %s\n", json_path); + + log_debug(_("generating %s"), json_path); json_object_to_file(json_path, json); json_object_put(json); free(json_path); @@ -461,8 +465,8 @@ pkg_to_html(struct ppa_stats *ppa, struct package_stats *pkg, const char *dir) json_path = path_new(dir, pkg->name, ".json"); json = pkg_to_json(ppa, pkg); - if (debug) - printf("DEBUG: generating %s\n", json_path); + log_debug(_("generating %s"), json_path); + json_object_to_file(json_path, json); json_object_put(json); free(json_path); @@ -474,8 +478,7 @@ pkg_to_html(struct ppa_stats *ppa, struct package_stats *pkg, const char *dir) 1); sprintf(script, "ppastats_pkg(\"%s%s\");", pkg->name, ".json"); - if (debug) - printf("DEBUG: generating %s\n", path); + log_debug(_("generating %s"), path); create_html(path, pkg->name, HTML_PKG_TEMPLATE, script); free(path); @@ -538,9 +541,7 @@ ppa_to_html(const char *owner, for (i = 0; i < 7; i++) { f_dst = path_append(output_dir, www_files[2*i+1]); - if (debug) - printf("DEBUG: copying %s %s\n", - www_files[2*i], f_dst); + log_debug(_("copying %s %s"), www_files[2*i], f_dst); fcopy(www_files[2*i], f_dst); free(f_dst); diff --git a/src/log.c b/src/log.c new file mode 100644 index 0000000..0790345 --- /dev/null +++ b/src/log.c @@ -0,0 +1,135 @@ +/* + * Copyright (C) 2010-2012 jeanfi@gmail.com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA + */ +#include +#include +#define _(str) gettext(str) + +#include +#include +#include + +#include "log.h" + +static FILE *file; +int log_level = LOG_WARN; + +void log_open(const char *path) +{ + file = fopen(path, "a"); + + if (!file) + log_printf(LOG_ERR, _("Cannot open log file: %s"), path); +} + +void log_close() +{ + if (!file) + return ; + + fclose(file); + + file = NULL; +} + + +#define LOG_BUFFER 4096 +static void vlogf(int lvl, const char *fmt, va_list ap) +{ + struct timeval tv; + char buffer[1 + LOG_BUFFER]; + char *lvl_str; + FILE *stdf; + + if (lvl > log_level) + return ; + + vsnprintf(buffer, LOG_BUFFER, fmt, ap); + buffer[LOG_BUFFER] = '\0'; + + if (gettimeofday(&tv, NULL) != 0) + timerclear(&tv); + + switch (lvl) { + case LOG_WARN: + lvl_str = "[WARN]"; + break; + case LOG_ERR: + lvl_str = "[ERR]"; + break; + case LOG_DEBUG: + lvl_str = "[DEBUG]"; + break; + case LOG_INFO: + lvl_str = "[INFO]"; + break; + default: + lvl_str = "[??]"; + } + + if (file) { + fprintf(file, "[%ld] %s %s\n", tv.tv_sec, lvl_str, buffer); + fflush(file); + } + + if (lvl == LOG_WARN || lvl == LOG_ERR) + stdf = stderr; + else + stdf = stdout; + + fprintf(stdf, "[%ld] %s %s\n", tv.tv_sec, lvl_str, buffer); +} + +void log_printf(int lvl, const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + vlogf(lvl, fmt, ap); + va_end(ap); +} + +void log_debug(const char *fmt, ...) +{ + va_list ap; + + if (log_level < LOG_DEBUG) + return ; + + va_start(ap, fmt); + vlogf(LOG_DEBUG, fmt, ap); + va_end(ap); +} + +void log_err(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + vlogf(LOG_ERR, fmt, ap); + va_end(ap); +} + +void log_warn(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + vlogf(LOG_WARN, fmt, ap); + va_end(ap); +} diff --git a/src/log.h b/src/log.h new file mode 100644 index 0000000..e3d64fd --- /dev/null +++ b/src/log.h @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2010-2012 jeanfi@gmail.com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA + */ +#ifndef _PPASTATS_LOG_H_ +#define _PPASTATS_LOG_H_ + +enum log_level { + LOG_ERR , + LOG_WARN, + LOG_INFO, + LOG_DEBUG +}; + +void log_open(const char *path); + +void log_printf(int lvl, const char *fmt, ...); +void log_debug(const char *fmt, ...); +void log_err(const char *fmt, ...); +void log_warn(const char *fmt, ...); + +void log_close(); + +/* level of the log file. */ +extern int log_level; + +#endif diff --git a/src/lp_ws.c b/src/lp_ws.c index 5eca19a..81b8b63 100644 --- a/src/lp_ws.c +++ b/src/lp_ws.c @@ -16,6 +16,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include +#define _(String) gettext(String) #include #include @@ -26,6 +28,7 @@ #include "cache.h" #include "list.h" +#include "log.h" #include "lp_ws.h" #include "lp_json.h" #include "ppastats.h" @@ -65,12 +68,10 @@ static char *fetch_url(const char *url) long code; int retries; - if (debug) - printf("DEBUG: fetch_url %s\n", url); + log_debug(_("fetch_url(): %s"), url); if (!curl) { - if (debug) - printf("DEBUG: initializing CURL\n"); + log_debug(_("initializing CURL")); curl_global_init(CURL_GLOBAL_ALL); curl = curl_easy_init(); } @@ -105,14 +106,12 @@ static char *fetch_url(const char *url) case 503: case 504: if (retries) { - fprintf(stderr, - "Fetch failed: with code %ld " - "for URL= %s\n", + log_err(_("Fetch failed with code %ld " + "for URL %s"), code, url); - if (debug) - printf("Wait 5s before retry.\n"); + log_debug(_("Wait 5s before retry")); sleep(5); free(content->data); @@ -120,7 +119,7 @@ static char *fetch_url(const char *url) goto retrieve; } default: - fprintf(stderr, "Fetch failed: %ld\n", code); + log_err(_("Fetch failed: %ld"), code); } } @@ -292,8 +291,7 @@ struct daily_download_total **get_daily_download_totals(const char *binary_url) void lp_ws_cleanup() { - if (debug) - printf("DEBUG: cleanup CURL\n"); + log_debug(_("cleanup CURL")); curl_easy_cleanup(curl); curl_global_cleanup(); diff --git a/src/main.c b/src/main.c index 94f6f8d..4f3a227 100644 --- a/src/main.c +++ b/src/main.c @@ -27,11 +27,11 @@ #include "cache.h" #include "html.h" +#include "log.h" #include "lp_ws.h" #include "config.h" #include "ppastats.h" -int debug; static const char *program_name; static void display_published_binaries(const char *owner, @@ -168,7 +168,7 @@ int main(int argc, char **argv) output_dir = strdup(optarg); break; case 'd': - debug = 1; + log_level = LOG_DEBUG; break; case 'h': print_help(); diff --git a/src/ppastats.c b/src/ppastats.c index 38f6dd0..7861301 100644 --- a/src/ppastats.c +++ b/src/ppastats.c @@ -17,11 +17,15 @@ 02110-1301 USA */ +#include +#define _(String) gettext(String) + #include #include #include #include "list.h" +#include "log.h" #include "lp_ws.h" #include "ppastats.h" @@ -247,7 +251,7 @@ create_ppa_stats(const char *owner, free(ppa_url); if (!history) { - fprintf(stderr, "Failed to retrieve PPA information\n"); + log_err(_("Failed to retrieve PPA information")); exit(EXIT_FAILURE); } @@ -262,14 +266,14 @@ create_ppa_stats(const char *owner, h = *h_cur; totals = get_daily_download_totals(h->self_link); if (!totals) { - fprintf(stderr, "Failed to retrieve download totals" - " for %s\n", h->self_link); + log_err(_("Failed to retrieve download totals for %s"), + h->self_link); continue; } count = get_download_count(h->self_link); if (count == -1) { - fprintf(stderr, "Failed to retrieve download count" - " for %s\n", h->self_link); + log_err(_("Failed to retrieve download count for %s"), + h->self_link); count = 0; } pkg_name = h->binary_package_name; diff --git a/src/ppastats.h b/src/ppastats.h index 4fe6c65..b6b12df 100644 --- a/src/ppastats.h +++ b/src/ppastats.h @@ -20,8 +20,6 @@ #ifndef _PPASTATS_PPASTATS_H_ #define _PPASTATS_PPASTATS_H_ -extern int debug; - #include "lp.h" struct arch_stats {