Annotation of nono/lib/macaddr.cpp, revision 1.1

1.1     ! root        1: //
        !             2: // nono
        !             3: // Copyright (C) 2021 nono project
        !             4: // Licensed under nono-license.txt
        !             5: //
        !             6: 
        !             7: //
        !             8: // MAC アドレス
        !             9: //
        !            10: 
        !            11: #include "macaddr.h"
        !            12: #include "mystring.h"
        !            13: #include <random>
        !            14: 
        !            15: // この MAC アドレスが 00:00:00:00:00:00 なら true を返す
        !            16: bool
        !            17: macaddr_t::Empty() const
        !            18: {
        !            19:        for (const auto v : *this) {
        !            20:                if (v != 0) {
        !            21:                        return false;
        !            22:                }
        !            23:        }
        !            24:        return true;
        !            25: }
        !            26: 
        !            27: // MAC アドレスを適当に生成する。
        !            28: // 02:00:01 はローカルだし割り当てもされてなさそうなので使っちゃえ。
        !            29: // 下3バイトは乱数。
        !            30: void
        !            31: macaddr_t::Generate()
        !            32: {
        !            33:        std::random_device rnd;
        !            34:        uint32 x = rnd();
        !            35: 
        !            36:        (*this)[0] = 0x02;
        !            37:        (*this)[1] = 0x00;
        !            38:        (*this)[2] = 0x01;
        !            39:        (*this)[3] = (x >> 16) & 0xff;
        !            40:        (*this)[4] = (x >>  8) & 0xff;
        !            41:        (*this)[5] = x & 0xff;
        !            42: }
        !            43: 
        !            44: // 文字列から MAC アドレスを作成する。"HH:HH:HH:HH:HH:HH" 形式のみ。
        !            45: // 成功すれば true を返す。
        !            46: bool
        !            47: macaddr_t::FromString(const std::string& src)
        !            48: {
        !            49:        const char *p;
        !            50:        char *e;
        !            51: 
        !            52:        p = src.data();
        !            53:        for (int i = 0; ; ) {
        !            54:                unsigned long val = strtoul(p, &e, 16);
        !            55: 
        !            56:                if (p == e) {
        !            57:                        return false;
        !            58:                }
        !            59:                if (val > 0xff) {
        !            60:                        return false;
        !            61:                }
        !            62:                (*this)[i++] = val;
        !            63:                p = e;
        !            64: 
        !            65:                // 最後だけ ':' をチェックしないので
        !            66:                if (i == 6) {
        !            67:                        break;
        !            68:                }
        !            69: 
        !            70:                if (*p++ != ':') {
        !            71:                        return false;
        !            72:                }
        !            73:        }
        !            74:        if (*p != '\0') {
        !            75:                return false;
        !            76:        }
        !            77:        return true;
        !            78: }
        !            79: 
        !            80: // 区切り文字なしの文字列形式を返す。主に ROM 埋め込み用で英字は大文字。
        !            81: // 01:23:AB なら "0123AB" のような感じ。
        !            82: std::string
        !            83: macaddr_t::ToString() const
        !            84: {
        !            85:        return string_format("%02X%02X%02X%02X%02X%02X",
        !            86:                (*this)[0],
        !            87:                (*this)[1],
        !            88:                (*this)[2],
        !            89:                (*this)[3],
        !            90:                (*this)[4],
        !            91:                (*this)[5]);
        !            92: }
        !            93: 
        !            94: // sep を区切り文字とする文字列形式を返す。主に表示用で英字は小文字。
        !            95: // 01:23:AB で sep = ":" なら "01:23:ab" のような感じ。
        !            96: std::string
        !            97: macaddr_t::ToString(char sep) const
        !            98: {
        !            99:        return string_format("%02x:%02x:%02x:%02x:%02x:%02x",
        !           100:                (*this)[0],
        !           101:                (*this)[1],
        !           102:                (*this)[2],
        !           103:                (*this)[3],
        !           104:                (*this)[4],
        !           105:                (*this)[5]);
        !           106: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.