RSS

GNU Cのテスト (Ubuntu 8.04)

17 11月

/workspace/C/gnuC/Main.c

#include <stdio.h>
#include <string.h>

/* ********************************************************

 GNU Cのテスト (Ubuntu 8.04)

 **********************************************************/

/*  定数の定義   */
#define STS_ERR  9   /* メインの戻り値 (エラーの場合)  */
#define STS_OK   0   /* メインの戻り値 (正常の場合)  */
#define MAX_PARAMS   10   /* パラメータの最大個数(制限値)  */

/*  関数プロトタイプ宣言  */
int get_params(int argc, char* argv[]);
int test_arith();
int test_getcwd();
int test_opendir();
int test_fopen();

/* パラメータ */
char* params[MAX_PARAMS];  /* パラメータの配列  */
int n_params;              /* パラメータの個数  */
char* commands[] = {       /* コマンド一覧 */
   "arith",
   "getcwd",
   "opendir",
   "fopen"
};

/* メインプログラム  */
int main(int argc, char* argv[]) {
   int i, n;

  printf("<<< gnuC Main started >>>\n");

   if (argc < 2) {
     printf("Usage: gnuC <switch> <param1> <param2> ...\n");
 return STS_ERR;
 }

 if (argc > MAX_PARAMS + 1) {
 printf("!! Error: Too many parameters. !!\n");
 return STS_ERR;
 }

 /* パラメータを取得する(結果はparams[]に格納される */
 n_params = get_params(argc, argv);

 /* パラメータを表示する */
 for (i = 0; i < n_params; i++) {
 printf("params[%d] = \"%s\"\n", i, params[i]);
 }

 /* 第一パラメータをコマンド名として対応する関数をコールする。 */
 n = -1;
 for (i = 0; sizeof(commands); i++) {
   if (strcmp(commands[i], params[0]) == 0) {
     n = i;
     break;
   }
 }

 switch (n) {
 case 0:
   test_arith();
   break;

 case 1:
   test_getcwd();
   break;

 case 2:
   test_opendir();
   break;

 case 3:
   test_fopen();
   break;

 default:
   printf("!! Illegal command !!\n");
   break;
 }

 /* 終わり */
 printf("<<< gnuC Main end >>>\n");
 return STS_OK;
}

/*
 * パラメータを取得してparams[]に保存する
 * 戻り値は取得した個数
 *
 *  */
int get_params(int argc, char* argv[]) {
 int i;

 for (i = 1; i <= argc - 1; i++) {
   params[i-1] = strdup(argv[i]);       
 }

 return argc - 1;   
}

/workspace/C/gnuC/funcs.c

#include <stdio.h>
#include <unistd.h>
#include <math.h>
#include <dirent.h>

/* 関数プロトタイプ宣言  */
int test_arith();
int test_getcwd();
int test_opendir();
int test_fopen();

const void* null = (void*)0;
extern char* params[];
extern int n_params;

/*
 *   test_arith:
 *      arithmetic functions
 * */
int test_arith() {

 printf("::: test_arith : arithmetic function :::\n");
 printf("abs(-1.0)=%d\n", abs(-1.0));
 printf("fabs(-1.0)=%f\n", fabs(-1.0));
 printf("fabs(1.0)=%f\n", fabs(1.0));
 printf("ceil(1.12)=%f\n", ceil(1.12));
 printf("floor(1.1)=%f\n", floor(1.1));
 printf("floor(-1.9)=%f\n", floor(-1.9));
 return 0;
}

/*
 *   test_getcwd
 *       get working directory
 * */
int test_getcwd() {
 char buffer[512];
 char *retv;
 printf("::: test_getcwd : get working directory\n");
 retv = getcwd(buffer, sizeof(buffer));
 if (retv == buffer) {
   printf("getcwd: %s\n", retv);
 }
 else {
   printf("!! Error !!\n");
   return 9;
 }
 return 0;
}

/*
 *   test_opendir :
 *       opendir closedir
 * */
int test_opendir() {
 DIR* dir;
 struct dirent* pDirent;
 printf("::: test3 : opendir :::\n");
 dir = opendir("/home/user");
 if (dir == null) {
   printf("!! Error !!\n");
   return 9;
 }

 pDirent = readdir(dir);
 while (pDirent != null) {
   puts(pDirent->d_name);
   pDirent = readdir(dir);
 }

 closedir(dir);
 return 0;
}

/*
 *   test_fopen
 *      fopen, fclose, fgets
 *
 * */
int test_fopen() {
 FILE *fp;
 char s[2048];

 if (n_params < 2) {
   return 9;
 }

 fp = fopen(params[1], "r");
 if (fp == null) {
   return 9;
 }

 while (! feof(fp)) {
   fgets(s, sizeof(s), fp);
   puts(s);
 }

 fclose(fp);   
}

 
GNU Cのテスト (Ubuntu 8.04) はコメントを受け付けていません。

投稿者: : 2010/11/17 投稿先 C

 

コメントは受け付けていません。