AS/400でもBrainFuckを!

初めに

AS/400にはC言語の開発環境があるので、これでBrainFuckインタープリタを作ってみます。

BrainFuckについて

BrainFuckについての説明はBrainFuckとはを参照してください。

ソース

#include <stdio.h>                                                      
#include <string.h>                                                     
                                                                        
int main(int argc, char *argv[]) {                                      
  char mem[256];                                                        
  int  point = 0;                                                       
  int  c     = 0;                                                       
  char *p;                                                              
                                                                        
  if (argc < 2) return 1;                                               
                                                                        
  p = argv[1];                                                          
  memset(mem, 0, sizeof(mem)/sizeof(mem[0]));                           
                                                                        
  while (*p) {                                                          
    switch (*p) {                                                       
      case '>': ++point; break;                                         
      case '<': --point; break;                                         
      case '+': ++mem[point]; break;                                    
      case '-': --mem[point]; break;                                    
      case '.': putchar(mem[point]); break;                             
      case ',': mem[point] = getchar(); break;                          
      case '[':                                                         
        if (!mem[point]) {                                              
          c = 0;                                                        
          while (1) {                                                   
            p++;                                                        
            if (*p == '[') c++;                                         
            if (*p == ']' && c == 0) break;                             
            if (*p == ']') c--;                                         
          }                                                             
        }                                                               
        break;                                                          
      case ']':                                                         
        if (mem[point]) {                                               
          c = 0;                                                        
          while (1) {                                                   
            p--;                                                        
            if (*p == ']') c++;                                         
            if (*p == '[' && c == 0) break;                             
            if (*p == '[') c--;                                         
          }                                                             
        }                                                               
        break;                                                          
    }                                                                   
    ++p;                                                                
  }                                                                     
  return 0;                                                             
}                                                                       

ちなみに

ちなみに、BrainFuckスレの189氏のソースをパクって、そのままだと2重ループがうまくいかないから、手直ししただけだったりします。

以下のようなCLから呼び出すと楽かもしれません。

PGM                               
  DCL &BFCHAR *CHAR 1000          
  CHGVAR &BFCHAR VALUE('-[>+.<-]')
  CALL BF PARM(&BFCHAR)           
ENDPGM