Форум » [x]Harbour » Различить - "где я?" - под Harbour или xHarbour? » Ответить

Различить - "где я?" - под Harbour или xHarbour?

Sergey Spirin: Доброго времени суток. Возможно ли "определение" внутри блока #pragma BEGINDUMP/#pragma ENDDUMP под чем компилится код? Какие-нибудь define-ы и т.п. Дело в том, что похоже начали они "расходится" даже на уровне базового API. Например, появился DateTime-тип, в Xailer (с xHarbour) уже начал использоваться. А добавленное API в обеих ветках чуть-чуть, но разнится....

Ответов - 13

gfilatov: Sergey Spirin пишет: Возможно ли "определение" внутри блока #pragma BEGINDUMP/#pragma ENDDUMP под чем компилится код? Да, конечно #ifdef __XHARBOUR__ #define HB_STORNL( n, x, y ) hb_stornl( n, x, y ) #else #define HB_STORNL( n, x, y ) hb_storvnl( n, x, y ) #endif

Sergey Spirin: Спасибо И еще в догонку А чтобы такое присвоить переменной на prg-уровне, чтобы она стала типом DateTime. Мне просто для тестов, что-нибудь типа: ААА := CTODwithTime('200910272040000')

Петр: Скорее всего вы имеете ввиду HB_STOT + added new .prg functions to mange date and timestamp values: HB_DATETIME() -> <tTimeStamp> HB_CTOD( <cDate> [, <cDateFormat> ] ) -> <dDate> HB_DTOC( <dDate> [, <cDateFormat> ] ) -> <cDate> HB_NTOT( <nValue> ) -> <tTimeStamp> HB_TTON( <tTimeStamp> ) -> <nValue> HB_TTOC( <tTimeStamp>, [ <cDateFormat> ] [, <cTimeFormat> ] ) -> <cTimeStamp> HB_CTOT( <cTimeStamp>, [ <cDateFormat> ] [, <cTimeFormat> ] ) -> <tTimeStamp> HB_TTOS( <tTimeStamp> ) -> <cYYYYMMDDHHMMSSFFF> HB_STOT( <cDateTime> ) -> <tTimeStamp> <cDateTime> should be in one of the above form: - "YYYYMMDDHHMMSSFFF" - "YYYYMMDDHHMMSSFF" - "YYYYMMDDHHMMSSF" - "YYYYMMDDHHMMSS" - "YYYYMMDDHHMM" - "YYYYMMDDHH" - "YYYYMMDD" - "HHMMSSFFF" - "HHMMSSF" - "HHMMSS" - "HHMM" - "HH" Important is number of digits. HB_TSTOSTR( <tTimeStamp> ) -> <cTimeStamp> // YYYY-MM-DD HH:MM:SS.fff HB_STRTOTS( <cTimeStamp> ) -> <tTimeStamp> <cTimeStamp> should be in one of the above form: YYYY-MM-DD [H[H][:M[M][:S[.f[f[f[f]]]]]]] [PM|AM] YYYY-MM-DDT[H[H][:M[M][:S[.f[f[f[f]]]]]]] [PM|AM] The folowing characters can be used as date delimiters: "-", "/", "." T - is literal "T" - it's for XML timestamp format if PM or AM is used HH is in range < 1 : 12 > otherwise in range < 0 : 23 > HB_HOUR( <tTimeStamp> ) -> <nHour> HB_MINUTE( <tTimeStamp> ) -> <nMinute> HB_SEC( <tTimeStamp> ) -> <nSeconds> // with milliseconds * harbour/source/rtl/datec.c + accept timestamp parameters in CMONTH() and CDOW() functions * harbour/source/rtl/empty.c + added support for timestamp items * harbour/source/rtl/itemseri.c + added support for timestamp items serialization * harbour/source/rtl/minmax.c + added support for timestamp values to MIN() and MAX() functions. when only one of given parameters is timestamp value and other is date value and date parts are equal then always date item is returned as both MIN() or MAX() value. * harbour/source/rtl/dates.c + added new C functions: hb_timeFormat(), hb_timeUnformat(), hb_timeStampFormat(), hb_timeStampUnformat() * harbour/source/rtl/valtype.c + added .prg functions: HB_ISDATETIME(), HB_ISTIMESTAMP() можно и таким путем + added support for timestamp constant values in the form: t"YYYY-MM-DD HH:MM:SS.fff" The exact accepted timestamp pattern is is: YYYY-MM-DD [H[H][:M[M][:S[.f[f[f[f]]]]]]] [PM|AM] i.e.: tValue := t"2009-03-21 5:31:45.437 PM" or: YYYY-MM-DDT[H[H][:M[M][:S[.f[f[f[f]]]]]]] [PM|AM] with literal "T" as date and time part delimiters (XML timestamp format), i.e.: tValue := t"2009-03-21T17:31:45.437" The folowing characters can be used as date delimiters: "-", "/", "." if PM or AM is used HH is in range < 1 : 12 > otherwise in range < 0 : 23 >


Петр: Странно как то форум отформатировал сообщение.. Тем не менее, все написанное мной относится к Harbour, как дела обстоят в xhb - я не знаю.

Sergey Spirin: Петр пишет: Скорее всего вы имеете ввиду HB_STOT Да, спасибо, то что надо.

Sergey Spirin: И еще, пожалуй, одна "проблема". Если я добавляю использование новой api-функции, то автоматом отрезаю совместимость с предыдущими версиями. Кроме как введение собственных define-ов, с предложением юзеру их править под себя ничего в голову не приходит. А правок юзером, хоть и минимальных, сильно хочется избежать. А нельзя ли как-то исхитриться и сделать без необходимости юзерской правки?

Pasha: Sergey Spirin пишет: А нельзя ли как-то исхитриться и сделать без необходимости юзерской правки? Для Harbour - можно. __HARBOUR__, определенный в hbver.h, принимает значение #define __HARBOUR__ 0x020000 /* Three bytes: Major + Minor + Release. This is recommented for 3rd party .c and .prg level code. */ В коде можно проверять версию: #if (__HARBOUR__ - 0) < 0x020000 ... Но если изменение в api было для одинаковой версии, так проверять не получится. Для xHb этот способ не подходит.

gfilatov: Sergey Spirin пишет: Кроме как введение собственных define-ов Можно попробовать сделать так, как это реализовано в библиотеке LetoDB: #if defined( __XHARBOUR__ ) #define HARBOUR_VER_AFTER_101 #elif defined( __HARBOUR__ ) #if __HARBOUR__ - 0 >= 0x010100 #define HARBOUR_VER_AFTER_101 #elif __HARBOUR__ - 0 < 0x000100 #define HARBOUR_VER_BEFORE_100 #endif #endif

Pasha: Лучше проверять другие #define, которые определены для обеих компиляторов: #define HB_VER_MAJOR 1 /* Major version number */ #define HB_VER_MINOR 1 /* Minor version number */ #define HB_VER_REVISION 0 /* Revision number */

Sergey Spirin: Pasha пишет: Но если изменение в api было для одинаковой версии, так проверять не получится. Что называется, не бровь, а в глаз В xHarbour-е так и есть. Версия 1.2.1, в Xailer-е уже есть использование HB_IT_DATETIME, в версии с тем же номером, которую можно скачать с xharbour.org (binary pack) этого еще нет..... При внимательном рассмотрении различаются только номера билдов...

Pasha: для HB_IT_DATETIME можно просто поставить #ifdef

Sergey Spirin: Pasha пишет: для HB_IT_DATETIME можно просто поставить #ifdef Супер! Точно, а я и забыл, что в С-ях так можно (В дельфи, просто, так не прокатит) Что-то я ступил То есть, схематично это будет выглядеть так: #ifdef HB_IT_DATETIME #ifdef __XHARBOUR__ // Инициализирую у себя hb_itemGetDTS #else // Инициализирую у себя hb_itemGetTS #endif #else // Все ставлю у себя в nil. #endif Спасибо большое

Петр: Sergey Spirin пишет: Дело в том, что похоже начали они "расходится" В SVN хранилище Harbour появился файлик xhb-diff.txt This text describes most important differences between Harbour and xHarbour with some references to Clipper and other compatible compilers like xBase++, CLIP, FlagShip. Many thanks to Pritpal and Viktor for updating this text. I hope that it will be updated in the future also by xHarbour developers, It describes status of both compiler at the end of October 2009: Harbour 2.0.0 beta3 (revision 12788) xHarbour 1.2.1 (revision 6629) Przemek В числе других, там можно найти раздел ### C LEVEL COMPATIBILITY ### Я думаю, что для программистов [x]Harbour это очень познавательный материал



полная версия страницы