コーディングスタイル晒し

年単位で真面目にコード書いてませんが、一応職業はプログラマだと言い続けております( ´ ▽ ` )ノ

Mitzyuki’s Blog :: コーディングスタイル
自分のコーディングスタイルを晒すために 簡単なプログラムを書いてみた。 …

こういうのを見ると、自分もやりたくなる!ということで、僕もやってみることにw

お題は@bsdhackさんが書かれていたprintbと同じ物を好き勝手に実装するという方向で!

# 一応、事前にコードは見てしまったのですが、ほぼ気にせずに書いています。ちょっとだけぱk(r

とりあえずC++で、このレベルの構造だとクラス考えるのが面倒なので平たく…

でも、何となくあぶれた変数がグローバルに居たりという感じで(^_^;)

# 設計が悪いというご指摘は甘んじて承けますが、面倒くさがりは仕様なのでいたしかたないのです

/**
 * -*-coding: utf-8: -*-
 *
 * printb.cc
 *
 * USAGE:
 *  printb [-v] [-h|-o] num [num ...]
 *
 * NOTE:
 *  Original Code and Idea from Mitzyuki IMAIZUMI
 *  http://blog.bsdhack.org/index.cgi/Computer/20120619.htm
 *
 * Authors:: Ken AKASHI <ks at ksworks.org>
 * Version:: 2012-06-19
 * License:: NYSL Version 0.9982
 * Copyright:: Copyright (C) ksworks, 2012. All rights reserved.
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sysexits.h>
#include <libgen.h>


//! (-v) 詳細表示を行うか?
bool        gOptVerposeMode = false;

//! (-h|-o) 表示モード
enum PB_VMODE {
        PBVM_DEC,       // 10進数
        PBVM_HEX,       // 16進数
        PBVM_OCT,       // 8進数
}       gOptViewMode = PBVM_DEC;

//! bit per byte.
static const int        PB_BIT_PER_BYTE = 8;

//! integer most top bits count.
static const int        PB_INTEGER_MTB = ((sizeof(int) * PB_BIT_PER_BYTE) - 1);

//! ヘッダ表示行数
static const int        PB_VIEW_HEADER_COLUMNS = 23;

//! 表示済み行数
static int              gViewedColumns = 0;

//! プログラム名
static const char       *gMyName = "printb";


/**
 *  Usage - show usage.
 */
void
Usage ()
{
        (void) ::fprintf (stderr,
                          "Usage: %s [-v] [-h|-o] num [num ...]\n", gMyName);
        return ;
}


/**
 *  printHeaderLine -  print header line
 *        per PB_VIEW_HEADER_COLUMNS lines.
 */
void
printHeaderLine ()
{
        for (size_t i=0; i<sizeof(int); ++i)
                (void) ::fprintf (stdout, "       *");

        (void) ::fprintf (stdout, "\n");
        return ;
}


/**
 * getBaseMode - get strtol base
 */
int
getBaseMode ()
{
        switch (gOptViewMode) {
        case PBVM_DEC:  return 10;
        case PBVM_HEX:  return 16;
        case PBVM_OCT:  return 8;
        default:
                break;
        }
        return 0;        // not error :p
}


/**
 * myStrToL - my strtol(3)
 *        \param value : strings to convert
 *        \param result : return converted value
 *        \return boolean : convert success or error
 */
bool
myStrToL (const char *value, int &result)
{
        char *endptr = NULL;
        errno = 0;
        int i_value = ::strtol (value, &endptr, getBaseMode());
        if (((errno != 0) && (i_value == 0)) || (endptr == value))
                return false;

        result = i_value;
        return true;
}


/**
 *  printb - print integer as binary
 */
void
printb (const char *s_value)
{
        int i_value = 0;
        if (myStrToL (s_value, i_value) != true) {
                (void) ::fprintf (stderr,
                                  "Illegal value: \"%s\"\n", s_value);
                return ;
        }

        // most top bit -> zero :(
        unsigned int shift = 1U << PB_INTEGER_MTB;
        while (shift != 0) {
                (void) ::fprintf (stdout, "%c",
                                  ((i_value & shift) ? '1' : '0'));
                shift >>= 1;
        }

        (void) ::fprintf (stdout, "  (%d)\n", i_value);
        return ;
}


/**
 *  parsArg - parse command line arguments.
 *        \param argc : argc
 *        \param argv : argv
 *        \retval EX_OK    : successed
 *        \retval EX_USAGE : usage
 */
int
parsArg (int argc, char *argv[]) {
        gMyName = ::basename (argv[0]);

        for (;;) {
                switch (::getopt (argc, argv, "vho")) {
                case -1: // No More Options
                        goto finished;
                        /* NOTREACHED */

                case 'v':
                        gOptVerposeMode = true;
                        break;
                case 'h':
                        gOptViewMode = PBVM_HEX;
                        break;
                case 'o':
                        gOptViewMode = PBVM_OCT;
                        break;

                default: // Unknwon parameters...
                        Usage ();
                        return EX_USAGE;
                        /* NOTREACHED */
                }
        }

finished:
        return EX_OK;
}


/**
 * main
 */
int
main (int argc, char *argv[])
{
        int r;
        r = parsArg (argc, argv);
        if (r != EX_OK)
                return r;

        for (int i=optind; i<argc; ++i) {
                if (gOptVerposeMode &&
                    ((gViewedColumns++ % PB_VIEW_HEADER_COLUMNS) == 0))
                        printHeaderLine ();

                printb (argv[i]);
        }
        return EX_OK;
}

因みに、基本的には8TabでEmacs自体は”bsd”スタイルで設定。 そこに若干”gnu”が混ざっている感じというかw

おそらく余り掛け離れた状態にはなっていないとは思うのですが( ´ ▽ ` )ノ

# まぁ、C++と言いつつ、C++屋が書いたCみたいな感じということで(^_^;)