鳳鳴は祖父の俳号

日記 メモ そんなの

GNU APL1.0 MacOSX10.8での作業メモ 2

 64bitのエンディアン変換、コピペで書いたよチキショー

ftp://ftp.irisa.fr/pub/OpenBSD/src/sys/sys/endian.h

htobe64()はホストのエンディアンからビッグエンディアンへ、
be64toh()はビッグエンディアンからホストのエンディアンへ変換する。x86の場合変換が必要だが、PowerPC系のMacOSXだと無変換になる。

 テスト。

// #include <arpa/inet.h>
// #include "endian.h"
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>

// #define __STDC_FORMAT_MACROS
// #include <inttype.h>

/// BEGIN
#define __swap64gen(x)                                                  \
        (__uint64_t)((((__uint64_t)(x) & 0xff) << 56) |                 \
            ((__uint64_t)(x) & 0xff00ULL) << 40 |                       \
            ((__uint64_t)(x) & 0xff0000ULL) << 24 |                     \
            ((__uint64_t)(x) & 0xff000000ULL) << 8 |                    \
            ((__uint64_t)(x) & 0xff00000000ULL) >> 8 |                  \
            ((__uint64_t)(x) & 0xff0000000000ULL) >> 24 |               \
            ((__uint64_t)(x) & 0xff000000000000ULL) >> 40 |             \
            ((__uint64_t)(x) & 0xff00000000000000ULL) >> 56)

#define htobe64 __swap64gen
#define be64toh __swap64gen
/// END

int
main(int argc, char *argv[])
{
    union {
        uint64_t u64;
        uint8_t arr[8];
    } x;

    x.arr[0] = 0x11;    /* Lowest-address byte */
    x.arr[1] = 0x22;
    x.arr[2] = 0x33;
    x.arr[3] = 0x44;
    x.arr[4] = 0x55;
    x.arr[5] = 0x66;
    x.arr[6] = 0x77;
    x.arr[7] = 0x88;    /* Highest-address byte */

    printf("x.u64 = 0x%lx\n", x.u64);

    printf("htobe64(x.u64) = 0x%lx\n", htobe64(x.u64));
    printf("htobe64(x.u64) = 0x%lx\n", htobe64(x.u64));
    printf("be64toh(x.u64) = 0x%lx\n", be64toh(x.u64));

    exit(EXIT_SUCCESS);
}

x.u64 = 0x8877665544332211
htobe64(x.u64) = 0x1122334455667788
be64toh(x.u64) = 0x1122334455667788

 うまくいったので/// BEGIN から /// ENDまでを my_byteorder.hとして新規作成、CDR.hhから#includeする。

g++ -DLOCALEDIR=\"/usr/local/share/locale\" -DHAVE_CONFIG_H -I. -I.. -rdynamic -g -O2 -MT apl-ComplexCell.o -MD -MP -MF .deps/apl-ComplexCell.Tpo -c -o apl-ComplexCell.o `test -f 'ComplexCell.cc' || echo './'`ComplexCell.cc
ComplexCell.cc: In member function ‘virtual void ComplexCell::bif_power(Cell*, const Cell*) const’:
ComplexCell.cc:395: error: no matching function for call to ‘std::complex::real(double)’
/usr/include/c++/4.2.1/complex:1199: note: candidates are: double& std::complex::real()
/usr/include/c++/4.2.1/complex:1203: note: const double& std::complex::real() const
ComplexCell.cc:396: error: no matching function for call to ‘std::complex::imag(double)’
/usr/include/c++/4.2.1/complex:1207: note: candidates are: double& std::complex::imag()
/usr/include/c++/4.2.1/complex:1211: note: const double& std::complex::imag() const
make[3]: *** [apl-ComplexCell.o] Error 1
make[3]: *** Waiting for unfinished jobs....
mv -f .deps/apl-Command.Tpo .deps/apl-Command.Po
make[2]: *** [all-recursive] Error 1
make[1]: *** [all-recursive] Error 1
make: *** [all] Error 2

 わからんけど必要なライブラリを入れていないせいかもしれないと思い確認。
brew install readline
brew install gettext
はやったがlapackはない。根性があればつづく。