SQLRU.net
Разработка приложений баз данных

Начало » Использование СУБД » Firebird, HQbird, InterBase » isc_vax_integer() и isc_portable_integer() (как оно там нонче)
isc_vax_integer() и isc_portable_integer() [сообщение #1705] Tue, 28 February 2023 18:14 Переход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 768
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
Помню давно, когда деревья были большими, Dmitry Kovalenko бодался за чистоту кода в isc_vax_integer() апеллируя к isc_portable_integer().
Борманы с Дебаркадера насколько мне известно вообще объявили isc_vax_integer() депрекатедом.
Полез на гитхаб в исходники, посмотреть как оно нынче и нихрена не нашел.
То ли поиск такой, то ли лыжи не смазал.
Ткните в нужный файл, плс.

Re: isc_vax_integer() и isc_portable_integer() [сообщение #1706 является ответом на сообщение #1705] Tue, 28 February 2023 20:59 Переход к предыдущему сообщениюПереход к следующему сообщению
Dmitry Kovalenko в настоящее время не в онлайне  Dmitry Kovalenko
Сообщений: 51
Зарегистрирован: December 2022
Member
isc_portable_integer:
https://github.com/FirebirdSQL/firebird/blob/96013f48b185078 245117a1553be0aec14190ad7/src/yvalve/gds.cpp#L681-L721

gds__vax_integer (isc_vax_integer):
https://github.com/FirebirdSQL/firebird/blob/96013f48b185078 245117a1553be0aec14190ad7/src/yvalve/gds.cpp#L2633-L2660
Re: isc_vax_integer() и isc_portable_integer() [сообщение #1707 является ответом на сообщение #1706] Wed, 01 March 2023 12:27 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 768
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
СПАСИБО! Smile
Re: isc_vax_integer() и isc_portable_integer() [сообщение #1712 является ответом на сообщение #1705] Wed, 01 March 2023 17:03 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 768
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
просьба к билингвам, гляньте пожалуйста, правильно ли я перевёл на Pascal.

исходник
SLONG API_ROUTINE gds__vax_integer(const UCHAR* ptr, SSHORT length)
{
	if (!ptr || length <= 0 || length > 4)
		return 0;

	SLONG value = 0;
	int shift = 0;

	while (--length > 0)
	{
		value += ((SLONG) *ptr++) << shift;
		shift += 8;
	}

	value += ((SLONG)(SCHAR) *ptr) << shift;

	return value;
}
Pascal
function gds__vax_integer(ptr: PChar; length: Smallint): Longint;
var
  value: Longint;
  shift: Integer;
begin
  Result := 0;
  if (ptr = nil) or (length <= 0) or (length > 4) then
    Exit;

  value := 0;
  shift := 0;

  while PreDec(length) > 0 do
    begin
      value := value + (Longint(PostInc(ptr)^) shl shift);
      shift := shift + 8;
    end;

  value := value + (Longint(Shortint(ptr^)) shl shift);
  Result := value;
end;
Re: isc_vax_integer() и isc_portable_integer() [сообщение #1714 является ответом на сообщение #1712] Thu, 02 March 2023 01:48 Переход к предыдущему сообщениюПереход к следующему сообщению
SD в настоящее время не в онлайне  SD
Сообщений: 328
Зарегистрирован: August 2022
Senior Member
Вот тебе набор кейсов, которыми я тестировал isc_portable_integer:
0000000000000000 = 00  (length 1)
0000000000000001 = 01  (length 1)
ffffffffffffffff = ff  (length 1)
000000000000007f = 7f  (length 1)
ffffffffffffff7f = 7f ff  (length 2)
0000000000000080 = 80 00  (length 2)
fffffffffffffed5 = d5 fe  (length 2)
0000000012345678 = 78 56 34 12  (length 4)
Слева шестнадцатеричное значение на выходе, справа, соответственно, входной буфер и его длина. Две засады: чтобы знак последнего байта расширялся, а всех остальных - нет.
Re: isc_vax_integer() и isc_portable_integer() [сообщение #1738 является ответом на сообщение #1714] Fri, 03 March 2023 15:04 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 768
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
SD
Вот тебе набор кейсов, которыми я тестировал isc_portable_integer.
Спасибо! Smile
потестировал, всё Ок.
procedure Test_vax_integer;

  function DumpBuff(S: string): string;
  var
    i: Integer;
  begin
    Result := '';
    for i := 1 to Length(S) do
      if Result = '' then
        Result := Result + IntToHex(Ord(S[i]), 2)
      else
        Result := Result + ' ' + IntToHex(Ord(S[i]), 2);
  end;

  procedure DoTest(S: string);
  var
    Res: Integer;
    HexSrc: string;
    HexRes: string;
  begin
    HexSrc := DumpBuff(S);
    Res := gds__vax_integer(@S[1], Length(S));
    HexRes := IntToHex(Res, 8);
    Writeln(format('%s = %s (length %d)', [HexRes, HexSrc, Length(S)]));
  end;

begin
  DoTest(#0);
  DoTest(#1);
  DoTest(#$FF);
  DoTest(#$7F);
  DoTest(#$7F#$FF);
  DoTest(#$80#$00);
  DoTest(#$D5#$FE);
  DoTest(#$78#$56#$34#$12);
end;
Re: isc_vax_integer() и isc_portable_integer() [сообщение #1778 является ответом на сообщение #1738] Thu, 09 March 2023 13:48 Переход к предыдущему сообщениюПереход к следующему сообщению
VladF в настоящее время не в онлайне  VladF
Сообщений: 16
Зарегистрирован: September 2022
Junior Member
А зачем оно тебе на Delphi?
Re: isc_vax_integer() и isc_portable_integer() [сообщение #1780 является ответом на сообщение #1778] Thu, 09 March 2023 14:09 Переход к предыдущему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 768
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
ну а нахрена для такой мелочи импортировать внешнюю функцию?

зы: всё началось с перекодирования ISC_DATE, ISC_TIME и TISC_TIMESTAMP в дельфийские TDate и TDateTime.
туда и обратно.
а isc_vax_integer уже "за компанию".
Предыдущая тема: Производительность firebird 4 + node-firebird на Windows и Ubuntu
Следующая тема: ругательно-восхвалятельная тема
Переход к форуму:
  


Текущее время: Thu Mar 28 12:08:18 GMT+3 2024

Общее время, затраченное на создание страницы: 0.00834 секунд