年単位で真面目にコード書いてませんが、一応職業はプログラマだと言い続けております( ´ ▽ ` )ノ
自分のコーディングスタイルを晒すために 簡単なプログラムを書いてみた。 …
こういうのを見ると、自分もやりたくなる!ということで、僕もやってみることに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みたいな感じということで(^_^;)