コーディングスタイル晒し
年単位で真面目にコード書いてませんが、一応職業はプログラマだと言い続けております( ´ ▽ ` )ノ
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みたいな感じということで(^_^;)
- スポンサードリンク -

