git.sophuwu.com > bashprompt   
              71
            
             /*
 * ip.hpp
 * this is to get the ip address of the machine and convert it to a color
 */

#ifndef BASHPROMPT_IP_H
#define BASHPROMPT_IP_H
#include "common.hpp"

struct IP {
    int values[4];
    int fromString(str s) {
        // anything shorter than 0.0.0.0 cannot be valid
        if (s.length() < 7) return 0;
        int pos = 0;
        int c = 0;
        for (int i=0;i<4;i++) {
            values[i] = 0;
        }
        for (int i=0;pos<s.length()&&i<4;pos++){
            c=(int)(s.c_str()[pos]);
            if (c>=48&&c<=57) values[i] = (values[i]*10) + (c - 48);
            else if (i>=3) break;
            else i++;
        }
        c = 0;
        for (int i=0;i<4;i++) {
            if (values[i]>255||values[i]<0) return 0;
            c += values[i];
        }
        if (c == 0) return 0;
        return 1;
    }
    int fromEnv() {
        str v;
        if (strEnv(v, "IPStr")) return fromString(v);
        return 0;
    }
    int fromCmd() {
        str s = "hostname -I";
        strEnv(s, "IPCmd");
        if (fromString(docmd(s.c_str()))) exportenv("IPStr", toString());
        return fromString(s);
    }
    int get() {
        if (fromEnv()) return 1;
        if (fromCmd()) {
            exportenv("IPStr", toString());
            return 1;
        }
        return 0;
    }
    str toColor() {
        str ret = "";
        ret+= color2(int2col(values[0]), int2col(values[1]));
        ret+= color2(int2col(values[2]), int2col(values[3]));
        return ret;
    }
    str toString() {
        str s="";
        for (int i = 0; i < 4; i++) {
            s+=std::to_string(values[i]);
            s+= ".";
        }
        s.pop_back();
        return s;
    }
};


#endif //BASHPROMPT_IP_H