diff -ruN webalizer-2.01-10/configure webalizer-work/configure --- webalizer-2.01-10/configure 2000-10-06 11:51:48.000000000 +0400 +++ webalizer-work/configure 2006-08-24 18:07:02.000000000 +0400 @@ -37,6 +37,8 @@ --enable-dns Enable DNS lookup code" ac_help="$ac_help --with-language=language Use 'language' (default is english)" +ac_help="$ac_help +--with-encoding Encoding for language file (default not defined)" # Initialize some variables set by options. # The variables have the same names as the options, with @@ -1988,8 +1990,15 @@ fi ac_cv_language=${WEBALIZER_LANG} - - +#//1 +echo $ac_n "checking for encoding""... $ac_c" 1>&6 +if test "${with_encoding+set}" = set; then + withval="$with_encoding" + WEBALIZER_LANG_ENCODING="${withval}"; LANG_CACHE=no + echo "Using $WEBALIZER_LANG_ENCODING as encoding" +else + LANG_CACHE=yes +fi trap '' 1 2 15 @@ -2148,7 +2157,7 @@ s%@GDLOC@%$GDLOC%g s%@GDLIB@%$GDLIB%g s%@ETCDIR@%$ETCDIR%g - +s%@WEBALIZER_LANG_ENCODING@%$WEBALIZER_LANG_ENCODING%g CEOF EOF diff -ruN webalizer-2.01-10/graphs.c webalizer-work/graphs.c --- webalizer-2.01-10/graphs.c 2001-06-15 12:34:24.000000000 +0400 +++ webalizer-work/graphs.c 2006-08-30 15:24:37.000000000 +0400 @@ -26,7 +26,12 @@ most recent version of the library and supporting documentation. */ +/* +Russian support added by Dmitry Saychenko +*/ + #include +#include #include #include #include @@ -34,6 +39,7 @@ #include #include #include +#include #include "webalizer.h" #include "lang.h" @@ -60,6 +66,10 @@ void init_graph(char *, int, int); struct pie_data *calc_arc(float, float); +//int koi2utf(char *code, char *buf, int out_len); +int any2utf(char *code, char *buf, int out_len); +void gdImageStringRus(gdImagePtr im, gdFontPtr font, int x, int y, unsigned char *s, int color); +void gdImageStringUpRus(gdImagePtr im, gdFontPtr font, int x, int y, unsigned char *s, int color); /* common public declarations */ @@ -73,6 +83,67 @@ float percent; /* percent storage */ u_long julday; /* julday value */ +#ifdef WEBALIZER_LANG_ENCODING +int any2utf(char *code, char *buf, int out_len) { + iconv_t cd; + size_t k, f, t; + const char* in = code; + char* out = buf; + + cd = iconv_open("UTF-8", WEBALIZER_LANG_ENCODING); + if( cd == (iconv_t)(-1) ) + perror("iconv_open"); + f = strlen(code); + t = out_len; + memset( buf, 0, out_len + 1); + k = iconv(cd, (char **)&in, &f, &out, &t); + if(k == (size_t)(-1) ) { + perror("Error converting"); + return 1; + } + iconv_close(cd); + return 0; +} +#endif + +void gdImageStringRus(gdImagePtr im, gdFontPtr font, int x, int y, unsigned char *s, int color) +{ +int rect[8]; +char *buf; +int buflen; + + buflen = strlen(s) * 2; // Unicode string + buf = (char *)malloc(buflen + 1); +#ifdef WEBALIZER_LANG_ENCODING + any2utf(s, buf, buflen); + gdImageStringFT(NULL, &rect[0], color, FontName, FontSize, 0.0, x, y, buf); + gdImageStringFT(im, &rect[0], color, FontName, FontSize, 0.0, x, y+FontSize, buf); +#else + gdImageStringFT(NULL, &rect[0], color, FontName, FontSize, 0.0, x, y, s); + gdImageStringFT(im, &rect[0], color, FontName, FontSize, 0.0, x, y+FontSize, s); +#endif + free(buf); +} + +void gdImageStringUpRus(gdImagePtr im, gdFontPtr font, int x, int y, unsigned char *s, int color) +{ +int rect[8]; +char *buf; +int buflen; + + buflen = strlen(s) * 2; // Unicode string + buf = (char *)malloc(buflen + 1); +#ifdef WEBALIZER_LANG_ENCODING + any2utf(s, buf, buflen); + gdImageStringFT(NULL, &rect[0], color, FontName, FontSize, 1.57, x, y, buf); + gdImageStringFT(im, &rect[0], color, FontName, FontSize, 1.57, x+FontSize, y, buf); +#else + gdImageStringFT(NULL, &rect[0], color, FontName, FontSize, 1.57, x, y, s); + gdImageStringFT(im, &rect[0], color, FontName, FontSize, 1.57, x+FontSize, y, s); +#endif + free(buf); +} + struct pie_data { int x; int y; /* line x,y */ int mx; int my; }; /* midpoint x,y */ /* colors */ @@ -128,7 +199,7 @@ s_mth = fmonth; for (i=0;i<12;i++) { - gdImageString(im,gdFontSmall,28+(i*23), /* use language */ + gdImageStringRus(im,gdFontSmall,28+(i*23), /* use language */ 238,s_month[s_mth-1],black); /* specific array */ s_mth++; if (s_mth > 12) s_mth = 1; @@ -138,38 +209,38 @@ } if (maxval <= 0) maxval = 1; sprintf(maxvaltxt, "%lu", maxval); - gdImageStringUp(im,gdFontSmall,8,26+(strlen(maxvaltxt)*6),maxvaltxt,black); + gdImageStringUpRus(im,gdFontSmall,8,26+(strlen(maxvaltxt)*6),maxvaltxt,black); if (graph_legend) /* print color coded legends? */ { /* Kbytes Legend */ i = (strlen(msg_h_xfer)*6); - gdImageString(im,gdFontSmall,491-i,239,msg_h_xfer,dkgrey); - gdImageString(im,gdFontSmall,490-i,238,msg_h_xfer,COLOR4); + gdImageStringRus(im,gdFontSmall,491-i,239,msg_h_xfer,dkgrey); + gdImageStringRus(im,gdFontSmall,490-i,238,msg_h_xfer,COLOR4); /* Sites/Visits Legend */ i = (strlen(msg_h_visits)*6); j = (strlen(msg_h_sites)*6); - gdImageString(im,gdFontSmall,491-i-j-12,11,msg_h_visits,dkgrey); - gdImageString(im,gdFontSmall,490-i-j-12,10,msg_h_visits,COLOR6); - gdImageString(im,gdFontSmall,491-j-9,11,"/",dkgrey); - gdImageString(im,gdFontSmall,490-j-9,10,"/",black); - gdImageString(im,gdFontSmall,491-j,11,msg_h_sites,dkgrey); - gdImageString(im,gdFontSmall,490-j,10,msg_h_sites,COLOR3); + gdImageStringRus(im,gdFontSmall,491-i-j-12,11,msg_h_visits,dkgrey); + gdImageStringRus(im,gdFontSmall,490-i-j-12,10,msg_h_visits,COLOR6); + gdImageStringRus(im,gdFontSmall,491-j-9,11,"/",dkgrey); + gdImageStringRus(im,gdFontSmall,490-j-9,10,"/",black); + gdImageStringRus(im,gdFontSmall,491-j,11,msg_h_sites,dkgrey); + gdImageStringRus(im,gdFontSmall,490-j,10,msg_h_sites,COLOR3); /* Hits/Files/Pages Legend */ i = (strlen(msg_h_pages)*6); j = (strlen(msg_h_files)*6); - gdImageStringUp(im,gdFontSmall,8,231,msg_h_pages,dkgrey); - gdImageStringUp(im,gdFontSmall,7,230,msg_h_pages,COLOR5); - gdImageStringUp(im,gdFontSmall,8,231-i-3,"/",dkgrey); - gdImageStringUp(im,gdFontSmall,7,230-i-3,"/",black); - gdImageStringUp(im,gdFontSmall,8,231-i-12,msg_h_files,dkgrey); - gdImageStringUp(im,gdFontSmall,7,230-i-12,msg_h_files,COLOR2); - gdImageStringUp(im,gdFontSmall,8,231-i-j-15,"/",dkgrey); - gdImageStringUp(im,gdFontSmall,7,230-i-j-15,"/",black); - gdImageStringUp(im,gdFontSmall,8,231-i-j-24,msg_h_hits,dkgrey); - gdImageStringUp(im,gdFontSmall,7,230-i-j-24,msg_h_hits,COLOR1); + gdImageStringUpRus(im,gdFontSmall,8,231,msg_h_pages,dkgrey); + gdImageStringUpRus(im,gdFontSmall,7,230,msg_h_pages,COLOR5); + gdImageStringUpRus(im,gdFontSmall,8,231-i-3,"/",dkgrey); + gdImageStringUpRus(im,gdFontSmall,7,230-i-3,"/",black); + gdImageStringUpRus(im,gdFontSmall,8,231-i-12,msg_h_files,dkgrey); + gdImageStringUpRus(im,gdFontSmall,7,230-i-12,msg_h_files,COLOR2); + gdImageStringUpRus(im,gdFontSmall,8,231-i-j-15,"/",dkgrey); + gdImageStringUpRus(im,gdFontSmall,7,230-i-j-15,"/",black); + gdImageStringUpRus(im,gdFontSmall,8,231-i-j-24,msg_h_hits,dkgrey); + gdImageStringUpRus(im,gdFontSmall,7,230-i-j-24,msg_h_hits,COLOR1); } /* data1 */ @@ -222,7 +293,7 @@ } if (maxval <= 0) maxval = 1; sprintf(maxvaltxt, "%lu", maxval); - gdImageStringUp(im, gdFontSmall,493,26+(strlen(maxvaltxt)*6), + gdImageStringUpRus(im, gdFontSmall,493,26+(strlen(maxvaltxt)*6), maxvaltxt, black); /* data6 */ @@ -258,7 +329,7 @@ if (data4[i] > fmaxval) fmaxval = data4[i]; /* get max val */ if (fmaxval <= 0.0) fmaxval = 1.0; sprintf(maxvaltxt, "%.0f", fmaxval); - gdImageStringUp(im, gdFontSmall,493,130+(strlen(maxvaltxt)*6), + gdImageStringUpRus(im, gdFontSmall,493,130+(strlen(maxvaltxt)*6), maxvaltxt,black); /* data4 */ @@ -340,9 +411,9 @@ for (i=0;i<31;i++) { if ((julday % 7 == 6) || (julday % 7 == 0)) - gdImageString(im,gdFontSmall,25+(i*15),382,numchar[i+1],COLOR1); + gdImageStringRus(im,gdFontSmall,25+(i*15),382,numchar[i+1],COLOR1); else - gdImageString(im,gdFontSmall,25+(i*15),382,numchar[i+1],black); + gdImageStringRus(im,gdFontSmall,25+(i*15),382,numchar[i+1],black); julday++; } @@ -355,38 +426,38 @@ } if (maxval <= 0) maxval = 1; sprintf(maxvaltxt, "%lu", maxval); - gdImageStringUp(im, gdFontSmall,8,26+(strlen(maxvaltxt)*6), + gdImageStringUpRus(im, gdFontSmall,8,26+(strlen(maxvaltxt)*6), maxvaltxt,black); if (graph_legend) /* Print color coded legends? */ { /* Kbytes Legend */ - gdImageStringUp(im,gdFontSmall,494,376,msg_h_xfer,dkgrey); - gdImageStringUp(im,gdFontSmall,493,375,msg_h_xfer,COLOR4); + gdImageStringUpRus(im,gdFontSmall,494,376,msg_h_xfer,dkgrey); + gdImageStringUpRus(im,gdFontSmall,493,375,msg_h_xfer,COLOR4); /* Sites/Visits Legend */ i = (strlen(msg_h_sites)*6); - gdImageStringUp(im,gdFontSmall,494,276,msg_h_sites,dkgrey); - gdImageStringUp(im,gdFontSmall,493,275,msg_h_sites,COLOR3); - gdImageStringUp(im,gdFontSmall,494,276-i-3,"/",dkgrey); - gdImageStringUp(im,gdFontSmall,493,275-i-3,"/",black); - gdImageStringUp(im,gdFontSmall,494,276-i-12,msg_h_visits,dkgrey); - gdImageStringUp(im,gdFontSmall,493,275-i-12,msg_h_visits,COLOR6); + gdImageStringUpRus(im,gdFontSmall,494,276,msg_h_sites,dkgrey); + gdImageStringUpRus(im,gdFontSmall,493,275,msg_h_sites,COLOR3); + gdImageStringUpRus(im,gdFontSmall,494,276-i-3,"/",dkgrey); + gdImageStringUpRus(im,gdFontSmall,493,275-i-3,"/",black); + gdImageStringUpRus(im,gdFontSmall,494,276-i-12,msg_h_visits,dkgrey); + gdImageStringUpRus(im,gdFontSmall,493,275-i-12,msg_h_visits,COLOR6); /* Pages/Files/Hits Legend */ s = ( i=(strlen(msg_h_pages)*6) )+ ( j=(strlen(msg_h_files)*6) )+ ( strlen(msg_h_hits)*6 )+ 52; - gdImageStringUp(im,gdFontSmall,494,s,msg_h_pages,dkgrey); - gdImageStringUp(im,gdFontSmall,493,s-1,msg_h_pages,COLOR5); - gdImageStringUp(im,gdFontSmall,494,s-i-3,"/",dkgrey); - gdImageStringUp(im,gdFontSmall,493,s-i-4,"/",black); - gdImageStringUp(im,gdFontSmall,494,s-i-12,msg_h_files,dkgrey); - gdImageStringUp(im,gdFontSmall,493,s-i-13,msg_h_files,COLOR2); - gdImageStringUp(im,gdFontSmall,494,s-i-j-15,"/",dkgrey); - gdImageStringUp(im,gdFontSmall,493,s-i-j-16,"/",black); - gdImageStringUp(im,gdFontSmall,494,s-i-j-24,msg_h_hits,dkgrey); - gdImageStringUp(im,gdFontSmall,493,s-i-j-25,msg_h_hits,COLOR1); + gdImageStringUpRus(im,gdFontSmall,494,s,msg_h_pages,dkgrey); + gdImageStringUpRus(im,gdFontSmall,493,s-1,msg_h_pages,COLOR5); + gdImageStringUpRus(im,gdFontSmall,494,s-i-3,"/",dkgrey); + gdImageStringUpRus(im,gdFontSmall,493,s-i-4,"/",black); + gdImageStringUpRus(im,gdFontSmall,494,s-i-12,msg_h_files,dkgrey); + gdImageStringUpRus(im,gdFontSmall,493,s-i-13,msg_h_files,COLOR2); + gdImageStringUpRus(im,gdFontSmall,494,s-i-j-15,"/",dkgrey); + gdImageStringUpRus(im,gdFontSmall,493,s-i-j-16,"/",black); + gdImageStringUpRus(im,gdFontSmall,494,s-i-j-24,msg_h_hits,dkgrey); + gdImageStringUpRus(im,gdFontSmall,493,s-i-j-25,msg_h_hits,COLOR1); } /* data1 */ @@ -435,7 +506,7 @@ } if (maxval <= 0) maxval = 1; sprintf(maxvaltxt, "%lu", maxval); - gdImageStringUp(im, gdFontSmall,8,180+(strlen(maxvaltxt)*6), + gdImageStringUpRus(im, gdFontSmall,8,180+(strlen(maxvaltxt)*6), maxvaltxt, black); /* data 6 */ @@ -468,7 +539,7 @@ if (data4[i]>fmaxval) fmaxval = data4[i]; if (fmaxval <= 0.0) fmaxval = 1.0; sprintf(maxvaltxt, "%.0f", fmaxval/1024); - gdImageStringUp(im, gdFontSmall,8,280+(strlen(maxvaltxt)*6), + gdImageStringUpRus(im, gdFontSmall,8,280+(strlen(maxvaltxt)*6), maxvaltxt, black); for (i=0; i<31; i++) @@ -525,14 +596,14 @@ /* x-axis legend */ for (i=0;i<24;i++) { - gdImageString(im,gdFontSmall,33+(i*19),238,numchar[i],black); + gdImageStringRus(im,gdFontSmall,33+(i*19),238,numchar[i],black); if (data1[i] > maxval) maxval = data1[i]; /* get max val */ if (data2[i] > maxval) maxval = data2[i]; if (data3[i] > maxval) maxval = data3[i]; } if (maxval <= 0) maxval = 1; sprintf(maxvaltxt, "%lu", maxval); - gdImageStringUp(im, gdFontSmall, 8, 26+(strlen(maxvaltxt)*6), + gdImageStringUpRus(im, gdFontSmall, 8, 26+(strlen(maxvaltxt)*6), maxvaltxt, black); if (graph_legend) /* print color coded legends? */ @@ -541,16 +612,16 @@ s = ( i=(strlen(msg_h_pages)*6) )+ ( j=(strlen(msg_h_files)*6) )+ ( strlen(msg_h_hits)*6 )+ 52; - gdImageStringUp(im,gdFontSmall,494,s,msg_h_pages,dkgrey); - gdImageStringUp(im,gdFontSmall,493,s-1,msg_h_pages,COLOR5); - gdImageStringUp(im,gdFontSmall,494,s-i-3,"/",dkgrey); - gdImageStringUp(im,gdFontSmall,493,s-i-4,"/",black); - gdImageStringUp(im,gdFontSmall,494,s-i-12,msg_h_files,dkgrey); - gdImageStringUp(im,gdFontSmall,493,s-i-13,msg_h_files,COLOR2); - gdImageStringUp(im,gdFontSmall,494,s-i-j-15,"/",dkgrey); - gdImageStringUp(im,gdFontSmall,493,s-i-j-16,"/",black); - gdImageStringUp(im,gdFontSmall,494,s-i-j-24,msg_h_hits,dkgrey); - gdImageStringUp(im,gdFontSmall,493,s-i-j-25,msg_h_hits,COLOR1); + gdImageStringUpRus(im,gdFontSmall,494,s,msg_h_pages,dkgrey); + gdImageStringUpRus(im,gdFontSmall,493,s-1,msg_h_pages,COLOR5); + gdImageStringUpRus(im,gdFontSmall,494,s-i-3,"/",dkgrey); + gdImageStringUpRus(im,gdFontSmall,493,s-i-4,"/",black); + gdImageStringUpRus(im,gdFontSmall,494,s-i-12,msg_h_files,dkgrey); + gdImageStringUpRus(im,gdFontSmall,493,s-i-13,msg_h_files,COLOR2); + gdImageStringUpRus(im,gdFontSmall,494,s-i-j-15,"/",dkgrey); + gdImageStringUpRus(im,gdFontSmall,493,s-i-j-16,"/",black); + gdImageStringUpRus(im,gdFontSmall,494,s-i-j-24,msg_h_hits,dkgrey); + gdImageStringUpRus(im,gdFontSmall,493,s-i-j-25,msg_h_hits,COLOR1); } /* data1 */ @@ -656,8 +727,8 @@ sprintf(buffer,"%s (%d%%)",legend[i], percent); x=480-(strlen(buffer)*7); - gdImageString(im,gdFontMediumBold, x+1, y+1, buffer, black); - gdImageString(im,gdFontMediumBold, x, y, buffer, i+4); + gdImageStringRus(im,gdFontMediumBold, x+1, y+1, buffer, black); + gdImageStringRus(im,gdFontMediumBold, x, y, buffer, i+4); y+=20; } } @@ -669,8 +740,8 @@ gdImageFill(im, gdata.mx, gdata.my, white); sprintf(buffer,"%s (%d%%)",msg_h_other,100-(int)(s_arc*100)); x=480-(strlen(buffer)*7); - gdImageString(im,gdFontMediumBold, x+1, y+1, buffer, black); - gdImageString(im,gdFontMediumBold, x, y, buffer, white); + gdImageStringRus(im,gdFontMediumBold, x+1, y+1, buffer, black); + gdImageStringRus(im,gdFontMediumBold, x, y, buffer, white); } /* save png image */ @@ -746,7 +817,7 @@ gdImageRectangle(im, 0, 0, xsize-1, ysize-1, black); /* display the graph title */ - gdImageString(im, gdFontMediumBold, 20, 8, title, blue); + gdImageStringRus(im, gdFontMediumBold, 20, 8, title, blue); return; } diff -ruN webalizer-2.01-10/Makefile.in webalizer-work/Makefile.in --- webalizer-2.01-10/Makefile.in 2000-10-17 08:15:53.000000000 +0400 +++ webalizer-work/Makefile.in 2006-08-30 15:29:39.000000000 +0400 @@ -43,7 +43,7 @@ dns_resolv.o dns_resolv.h parser.o parser.h \ output.o output.h graphs.o graphs.h lang.h \ webalizer_lang.h - $(CC) ${LDFLAGS} -o webalizer webalizer.o hashtab.o linklist.o preserve.o parser.o output.o dns_resolv.o graphs.o ${LIBS} + $(CC) ${LDFLAGS} -o webalizer webalizer.o hashtab.o linklist.o preserve.o parser.o output.o dns_resolv.o graphs.o ${LIBS} -liconv rm -f webazolver @LN_S@ webalizer webazolver @@ -72,7 +72,7 @@ $(CC) ${CFLAGS} ${DEFS} -c dns_resolv.c graphs.o: graphs.c graphs.h webalizer.h lang.h - $(CC) ${CFLAGS} ${DEFS} -I${GDLIB} -c graphs.c + $(CC) ${CFLAGS} ${DEFS} -I${GDLIB} -DWEBALIZER_LANG_ENCODING=\"@WEBALIZER_LANG_ENCODING@\" -c graphs.c clean: rm -f webalizer webazolver *.o usage*.png daily*.png hourly*.png diff -ruN webalizer-2.01-10/webalizer.c webalizer-work/webalizer.c --- webalizer-2.01-10/webalizer.c 2002-04-17 02:11:31.000000000 +0400 +++ webalizer-work/webalizer.c 2006-04-21 21:57:58.000000000 +0400 @@ -166,6 +166,8 @@ int dump_search = 0; /* Search strings */ int dump_header = 0; /* Dump header as first rec */ char *dump_path = NULL; /* Path for dump files */ +char *FontName = NULL; /* Font name for garphs */ +int FontSize = 0; int cur_year=0, cur_month=0, /* year/month/day/hour */ cur_day=0, cur_hour=0, /* tracking variables */ @@ -1449,7 +1451,9 @@ "DNSCache", /* DNS Cache file name 84 */ "DNSChildren", /* DNS Children (0=no DNS) 85 */ "DailyGraph", /* Daily Graph (0=no) 86 */ - "DailyStats" /* Daily Stats (0=no) 87 */ + "DailyStats", /* Daily Stats (0=no) 87 */ + "FontName", /* Font name for graphs 88 */ + "FontSize" /* Font size for graphs 89 */ }; FILE *fp; @@ -1593,8 +1597,12 @@ #endif /* USE_DNS */ case 86: daily_graph=(value[0]=='n')?0:1; break; /* HourlyGraph */ case 87: daily_stats=(value[0]=='n')?0:1; break; /* HourlyStats */ + case 88: FontName=save_opt(value); break; /* FontName */ + case 89: FontSize=atoi(value); break; /* FontSize */ } } + if(FontName == NULL) { FontName = "/usr/share/fonts/arial.ttf"; } + if(FontSize == 0) { FontSize = 10; } fclose(fp); } diff -ruN webalizer-2.01-10/webalizer.h webalizer-work/webalizer.h --- webalizer-2.01-10/webalizer.h 2001-02-10 03:58:18.000000000 +0300 +++ webalizer-work/webalizer.h 2006-04-21 21:49:18.000000000 +0400 @@ -259,5 +259,7 @@ extern void init_counters(); extern int ispage(char *); extern u_long jdate(int,int,int); +extern char *FontName; +extern int FontSize; #endif /* _WEBALIZER_H */