fopenとか、似非OOスタイルとか

 試してみた。

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

typedef struct fc {
  int length;
  int line_count;
  int byte;
  char *filename;
  char **lineList;
} FileClass;

char *getLine(FileClass *fp)
{
  return *(fp->lineList + ((fp->line_count)++));
}

int getByte(FileClass *fp)
{
  return fp->byte;
}

int getLength(FileClass *fp)
{
  return fp->length;
}

char **__fp_to_str_list(FileClass *fp, FILE *ff)
{
  char c, tmp_str[64], **linelist;
  int i, j;
  i = j = 0;
  linelist = (char **)malloc(sizeof(char *));
  while((c = getc(ff)) != EOF) {
	switch (c) {
	case '\n':
	  tmp_str[j] = '\0';
	  *(linelist + i) = (char *)malloc(64);
	  assert(*(linelist + i) != NULL);
	  strcpy(*(linelist + i), tmp_str);
	  linelist = (char **)realloc(linelist, (++i + 1) * sizeof(char *));
	  assert(linelist != NULL);
	  j = 0, fp->length++, fp->byte++;
	  break;
	default:
	  tmp_str[j++] = c;
	  fp->byte++;
	  break;
	}
  }
  *(linelist + i) = "\0";
  return linelist;
}

void new_FileClass(FileClass *fp, char *filename, char *mode)
{
  FILE *tfp;
  tfp = fopen(filename, mode);
  assert(tfp != NULL);
  fp->filename = filename;
  fp->length = fp->line_count = fp->byte = 0;
  fp->lineList = __fp_to_str_list(fp, tfp);
}

void del_FileClass(FileClass *fp)
{
  char *str;
  fp->line_count = 0;
  while((str = getLine(fp)) != "\0") free(str);
  free(fp->lineList);
}

int main(int argc, char **argv)
{
  FileClass f_obj;
  char *str;
  assert(argc > 1);
  new_FileClass(&f_obj, *(++argv), "r");
  printf("lines: %d\nbytes: %d\n\n", getLength(&f_obj), getByte(&f_obj));
  while((str = getLine(&f_obj)) != "\0")
	printf("%s\n", str);
  del_FileClass(&f_obj);
  return 0;
}

 構造体に関数ポインタを定義しておいて、それこそOOスタイルっ「ぽく」することができることも確認したけど、結局インスタンス(OO風に言えば)の参照渡しをしなくてはならないので、激しくカッコ悪い。恐らく、CLOSの様に書くのがそれっぽいのだろうけど、それ以前に名前空間が分離できないのがなぁ…。だから、カプセル化多態性もできないし。