summaryrefslogtreecommitdiff
path: root/plugins/TrafficCounter/src/misc.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/TrafficCounter/src/misc.c')
-rw-r--r--plugins/TrafficCounter/src/misc.c303
1 files changed, 303 insertions, 0 deletions
diff --git a/plugins/TrafficCounter/src/misc.c b/plugins/TrafficCounter/src/misc.c
new file mode 100644
index 0000000000..6320117246
--- /dev/null
+++ b/plugins/TrafficCounter/src/misc.c
@@ -0,0 +1,303 @@
+/*
+Traffic Counter plugin for Miranda IM
+Copyright 2007-2011 Mironych.
+
+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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include "commonheaders.h"
+
+/* Функция разбирает строку и возвращает список тегов и соответствующих им строк.
+Аргументы:
+InputString - строка для разбора;
+RowItemsList - список найденных элементов.
+Возвращаемое значение - количество элементов в списках. */
+WORD GetRowItems(TCHAR *InputString, RowItemInfo **RowItemsList)
+{
+ TCHAR *begin, *end;
+ WORD c = 0;
+
+ // Ищем слева открывающую скобку.
+ begin = _tcschr(InputString, '{');
+ // Если скобка найдена...
+ if (begin)
+ {
+ // Выделяем память под указатели
+ *RowItemsList = (RowItemInfo*)mir_alloc(sizeof(RowItemInfo));
+ }
+ else return 0;
+
+ do
+ {
+ // Сразу вслед за ней ищем закрывающую.
+ end = _tcschr(begin, '}');
+
+ // Выделяем память под указатели
+ *RowItemsList = (RowItemInfo*)mir_realloc(*RowItemsList, sizeof(RowItemInfo) * (c + 1));
+
+ // Разбираем тег.
+ _stscanf(begin + 1, _T("%c%d"),
+ &((*RowItemsList)[c].Alignment),
+ &((*RowItemsList)[c].Interval));
+
+ // Ищем далее открывающую скобку - это конец строки, соответствующей тегу.
+ begin = _tcschr(end, '{');
+
+ if (begin)
+ {
+ // Выделяем память под строку.
+ (*RowItemsList)[c].String = (TCHAR*)mir_alloc(sizeof(TCHAR) * (begin - end));
+ // Копируем строку.
+ _tcsncpy((*RowItemsList)[c].String, end + 1, begin - end - 1);
+ (*RowItemsList)[c].String[begin - end - 1] = 0;
+ }
+ else
+ {
+ // Выделяем память под строку.
+ (*RowItemsList)[c].String = (TCHAR*)mir_alloc(sizeof(TCHAR) * _tcslen(end));
+ // Копируем строку.
+ _tcsncpy((*RowItemsList)[c].String, end + 1, _tcslen(end));
+ }
+
+ c++;
+ } while (begin);
+
+ return c;
+}
+
+/* Функция возвращает количество дней в указанном месяце указанного года. */
+BYTE DaysInMonth(BYTE Month, WORD Year)
+{
+ switch (Month)
+ {
+ case 1:
+ case 3:
+ case 5:
+ case 7:
+ case 8:
+ case 10:
+ case 12: return 31;
+ case 4:
+ case 6:
+ case 9:
+ case 11: return 30;
+ case 2: return 28 + (BYTE)!((Year % 4) && ( (Year % 100) || !(Year % 400) ));
+ }
+ return 0;
+}
+
+// Функция определяет день недели по дате
+// 7 - ВС, 1 - ПН и т. д.
+BYTE DayOfWeek(BYTE Day, BYTE Month, WORD Year)
+{
+ WORD a, y, m;
+
+ a = (14 - Month) / 12;
+ y = Year - a;
+ m = Month + 12 * a - 2;
+
+ a = (7000 + (Day + y + (y >> 2) - y / 100 + y / 400 + (31 * m) / 12)) % 7;
+ if (!a) a = 7;
+
+ return a;
+}
+
+/*
+Аргументы:
+ Value - количество байт;
+ Unit - единицы измерения (0 - байты, 1 - килобайты, 2 - мегабайты, 3 - автоматически);
+ Buffer - адрес строки для записи результата;
+ Size - размер буфера.
+Возвращаемое значение: требуемый размер буфера.
+*/
+WORD GetFormattedTraffic(DWORD Value, BYTE Unit, TCHAR *Buffer, WORD Size)
+{
+ TCHAR Str1[32], szUnit[4] = {' ', 0};
+ DWORD Divider;
+ NUMBERFMT nf = {0, 1, 3, _T(","), _T(" "), 0};
+ TCHAR *Res; // Промежуточный результат.
+ WORD l;
+
+ switch (Unit)
+ {
+ case 0: //bytes
+ Divider = 1;
+ nf.NumDigits = 0;
+ szUnit[0] = 0;
+ break;
+ case 1: // KB
+ Divider = 0x400;
+ nf.NumDigits = 2;
+ break;
+ case 2: // MB
+ Divider = 0x100000;
+ nf.NumDigits = 2;
+ break;
+ case 3: // Adaptive
+ nf.NumDigits = 2;
+ if (Value < 0x100000) { Divider = 0x400; szUnit[1] = 'K'; szUnit[2] = 'B'; }
+ else { Divider = 0x100000; szUnit[1] = 'M'; szUnit[2] = 'B'; }
+ break;
+ }
+
+ mir_sntprintf(Str1, 32, _T("%d.%d"), Value / Divider, Value % Divider);
+ l = GetNumberFormat(LOCALE_USER_DEFAULT, 0, Str1, &nf, NULL, 0);
+ if (!l) return 0;
+ l += _tcslen(szUnit) + 1;
+ Res = (TCHAR*)malloc(l * sizeof(TCHAR));
+ if (!Res) return 0;
+ GetNumberFormat(LOCALE_USER_DEFAULT, 0, Str1, &nf, Res, l);
+ _tcscat(Res, szUnit);
+
+ if (Size && Buffer)
+ {
+ _tcscpy(Buffer, Res);
+ l = _tcslen(Buffer);
+ }
+ else
+ {
+ l = _tcslen(Res) + 1;
+ }
+
+ free(Res);
+ return l;
+}
+
+/* Преобразование интервала времени в его строковое представление
+Аргументы:
+Duration: интервал времени в секундах;
+Format: строка формата;
+Buffer: адрес буфера, куда функция помещает результат.
+Size - размер буфера. */
+WORD GetDurationFormatM(DWORD Duration, TCHAR *Format, TCHAR *Buffer, WORD Size)
+{
+ DWORD q;
+ WORD TokenIndex, FormatIndex, Length;
+ TCHAR Token[256], // Аккумулятор.
+ *Res; // Промежуточный результат.
+
+ Res = (TCHAR*)malloc(sizeof(TCHAR)); // Выделяем чуть-чуть памяти под результат, но это только начало.
+ SecureZeroMemory(Res, sizeof(TCHAR));
+
+ for (FormatIndex = 0; Format[FormatIndex];)
+ {
+ // Ищем токены. Считается, что токен - только буквы.
+ TokenIndex = 0;
+ q = _istalpha(Format[FormatIndex]);
+ // Копируем символы в аккумулятор до смены флага.
+ do
+ {
+ Token[TokenIndex++] = Format[FormatIndex++];
+ } while (q == _istalpha(Format[FormatIndex]));
+ Token[TokenIndex] = 0;
+
+ // Что получили в аккумуляторе?
+ if (!_tcscmp(Token, _T("d")))
+ {
+ q = Duration / (60 * 60 * 24);
+ mir_sntprintf(Token, 256, _T("%d"), q);
+ Duration -= q * 60 * 60 * 24;
+ }
+ else
+ if (!_tcscmp(Token, _T("h")))
+ {
+ q = Duration / (60 * 60);
+ mir_sntprintf(Token, 256, _T("%d"), q);
+ Duration -= q * 60 * 60;
+ }
+ else
+ if (!_tcscmp(Token, _T("hh")))
+ {
+ q = Duration / (60 * 60);
+ mir_sntprintf(Token, 256, _T("%02d"), q);
+ Duration -= q * 60 * 60;
+ }
+ else
+ if (!_tcscmp(Token, _T("m")))
+ {
+ q = Duration / 60;
+ mir_sntprintf(Token, 256, _T("%d"), q);
+ Duration -= q * 60;
+ }
+ else
+ if (!_tcscmp(Token, _T("mm")))
+ {
+ q = Duration / 60;
+ mir_sntprintf(Token, 256, _T("%02d"), q);
+ Duration -= q * 60;
+ }
+ else
+ if (!_tcscmp(Token, _T("s")))
+ {
+ q = Duration;
+ mir_sntprintf(Token, 256, _T("%d"), q);
+ Duration -= q;
+ }
+ else
+ if (!_tcscmp(Token, _T("ss")))
+ {
+ q = Duration;
+ mir_sntprintf(Token, 256, _T("%02d"), q);
+ Duration -= q;
+ }
+
+ // Добавим памяти, если нужно.
+ Length = _tcslen(Res) + _tcslen(Token) + 1;
+ Res = (TCHAR*)realloc(Res, Length * sizeof(TCHAR));
+ _tcscat(Res, Token);
+ }
+
+ if (Size && Buffer)
+ {
+ _tcsncpy(Buffer, Res, Size);
+ Length = _tcslen(Buffer);
+ }
+ else
+ {
+ Length = _tcslen(Res) + 1;
+ }
+
+ free(Res);
+ return Length;
+}
+
+/* Результат:
+-1 - st1 < st2
+ 0 - st1 = st2
++1 - st1 > st2
+*/
+signed short int TimeCompare(SYSTEMTIME st1, SYSTEMTIME st2)
+{
+ signed short int a, b, c, d;
+
+ a = st1.wYear - st2.wYear;
+ b = st1.wMonth - st2.wMonth;
+ c = st1.wDay - st2.wDay;
+ d = st1.wHour - st2.wHour;
+
+ if (a < 0) return -1;
+ if (a > 0) return +1;
+
+ if (b < 0) return -1;
+ if (b > 0) return +1;
+
+ if (c < 0) return -1;
+ if (c > 0) return +1;
+
+ if (d < 0) return -1;
+ if (d > 0) return +1;
+
+ return 0;
+}