#99 Article 1009 Posted at 1995/12/10 17:22:54 by S.C.T. (MAP5606) [SAHOU.2]

Subject: Re: プログラミング作法・お題2 /995

面白いので参加します。

  1: #include <stdio.h>
  2: #include <sys/stat.h>
  3: 
  4: #define LITTLE_ENDIAN
  5: 
  6: void main( void )
  7: {
  8:   char idx;
  9: 
 10: #ifdef LITTLE_ENDIAN
 11:   /* リトルエンディアンってや~ね。 */
 12:   unsigned long int MAPL = ( 'L' << 24 ) | ( 'P' << 16 ) | 
 13:                                               ( 'A' << 8 ) | 'M';
 14: #else
 15:   /* ビッグエンディアン用 */
 16:   unsigned long int MAPL = ( 'M' << 24 ) | ( 'A' << 16 ) |
 17:                                               ( 'P' << 8 ) | 'L';
 18: #endif
 19: 
 20:   char *str;
 21:   struct stat st;
 22:   int cnt = 0;
 23:   unsigned long int *ulptr;
 24: 
 25:   FILE *fp;
 26: 
 27:   if ( stat( "LOG", &st ) ) {
 28:     perror( NULL );
 29:     exit( 1 );
 30:   }
 31: 
 32:   if ( !(str = malloc( st.st_size )) ) {
 33:     perror( NULL );
 34:     exit( 1 );
 35:   }
 36: 
 37: 
 38:   if ( ( fp = fopen( "LOG", "r" ) ) == NULL ) {
 39:     perror( NULL );
 40:     exit( 1 );
 41:   }
 42:   
 43:   idx = fread( str, 1, st.st_size, fp );
 44: 
 45:   for( ; idx > 0; idx-- ) {
 46:     if ( str[idx] == 'E' ) {
 47:       ulptr = (unsigned long int *)(&str[idx -= 4]);
 48:       if ( *ulptr == MAPL ) {
 49:         cnt++;
 50:       }
 51:     }
 52:   }
 53: 
 54:   printf( "%d\n", cnt );
 55: }


環境        : x86 + Linux + gcc

              ビッグエンディアンのマシンでは
	      4: #define LITTLE_ENDIAN 
	      をはずす

アルゴリズム: ファイルをすべて読み込んで、後ろの方から 'E' を探し、
              見つかったら、そこから前の 4 バイトをあらかじめ用意していた
              unsigned long int 型の変数 'MAPL' と比較する。

一言        : x86 はリトルエンディアンだったことを忘れていた。


---
S.C.T