header
- это указатель на struct indxheader
Он приводится к altkptr
, который является struct keydat
Это:
altkptr = (struct keydat *)(++header);
Это эквивалентно:
++header;
altkptr = (struct keydat *) header;
Вопрос о том, было ли приведение в действие в 1989 году, может быть предметом споров. Но ...
Приращение header
является проблемой.
В 1989 году long
имело такое же sizeof
[и, следовательно, выравнивание struct
], что и ан int
. Это произошло потому, что большинство / все процессоры были 32-битными (или 16-битными).
Теперь вы, вероятно, работаете на 64-битной машине. Итак, long
- это 64 бита.
Итак, в 1989 году размер каждого struct
[вероятно] совпадал. Теперь размеры [вероятно] разные.
Итак, приращение header
недействительно.
Вам может повезло с компиляцией с -m32
для принудительная компиляция в 32-битном режиме. Но в остальном этот код настолько шаткий, что я бы сказал, используйте его как [свободное] руководство и перепишите все, что сможете.
ОБНОВЛЕНИЕ:
Я пишу код C с 1981 года, поэтому я немного знаком с системами, которые были доступны тогда.
Одна из проблем заключается в том, что структура keydat
имеет встроенный указатель, который сохраняются в файл ISAM и считываются из него.
Если это так, разыменование такого обратного указателя почти наверняка приведет к сбою или выдаче неверных результатов.
Это потому, что нет гарантии, что программа загружен в память в том же месте.
Ключевой вопрос заключается в том, пытаетесь ли вы перенести этот код, чтобы вы могли читать существующие старые файлы ISAM, которые были созданы длинной go. В противном случае было бы лучше использовать существующий код в качестве руководства и переписать с нуля.
Если вам нужно нужно читать старые файлы, это поможет точно узнать тип системы, на которой выполнялось программное обеспечение.
Если оно запускалось на P C той эпохи под MS / DOS, int
, вероятно, было 16 бит, а long
было 32 бит. 1062 но int
может быть 16- или 32-битным. В большинстве систем для int
использовалось 32 бита, но это был выбор компилятора.
Кроме того, ПК были / были с прямым порядком байтов, но системы mc68000
Unix были с прямым порядком байтов.
Итак, сначала вам нужно определить sizeof
для int
, long
и указатель для системы той эпохи.
Кроме того, вам нужно определить, какое выравнивание были использованы элементы структуры.
Затем вам, возможно, придется переписать функцию, которая читает эти данные, почти побайтово, и выполнить преобразование для каждого поля, чтобы получить правильное количество байтов в прочитать поле и его порядок следования байтов.
Это похоже на то, что должен делать XDR
.