2013年7月25日木曜日

UTF-8の全角を表示するプログラム改良版の出力結果

e598b0:嘰嘱嘲嘳嘴嘵嘶嘷嘸嘹嘺嘻嘼嘽嘾嘿
e59980:噀噁噂噃噄噅噆噇噈噉噊噋噌噍噎噏
e59990:噐噑噒噓噔噕噖噗噘噙噚噛噜噝噞噟
e599a0:噠噡噢噣噤噥噦噧器噩噪噫噬噭噮噯
e599b0:噰噱噲噳噴噵噶噷噸噹噺噻噼噽噾噿
e59a80:嚀嚁嚂嚃嚄嚅嚆嚇嚈嚉嚊嚋嚌嚍嚎嚏
e59a90:嚐嚑嚒嚓嚔嚕嚖嚗嚘嚙嚚嚛嚜嚝嚞嚟
e59aa0:嚠嚡嚢嚣嚤嚥嚦嚧嚨嚩嚪嚫嚬嚭嚮嚯
e59ab0:嚰嚱嚲嚳嚴嚵嚶嚷嚸嚹嚺嚻嚼嚽嚾嚿
e59b80:囀囁囂囃囄囅囆囇囈囉囊囋囌囍囎囏
e59b90:囐囑囒囓囔囕囖囗囘囙囚四囜囝回囟
e59ba0:因囡团団囤囥囦囧囨囩囪囫囬园囮囯
e59bb0:困囱囲図围囵囶囷囸囹固囻囼国图囿
e59c80:圀圁圂圃圄圅圆圇圈圉圊國圌圍圎圏
e59c90:圐圑園圓圔圕圖圗團圙圚圛圜圝圞土
e59ca0:圠圡圢圣圤圥圦圧在圩圪圫圬圭圮圯
e59cb0:地圱圲圳圴圵圶圷圸圹场圻圼圽圾圿
e59d80:址坁坂坃坄坅坆均坈坉坊坋坌坍坎坏
e59d90:坐坑坒坓坔坕坖块坘坙坚坛坜坝坞坟
e59da0:坠坡坢坣坤坥坦坧坨坩坪坫坬坭坮坯
e59db0:坰坱坲坳坴坵坶坷坸坹坺坻坼坽坾坿
e59e80:垀垁垂垃垄垅垆垇垈垉垊型垌垍垎垏
e59e90:垐垑垒垓垔垕垖垗垘垙垚垛垜垝垞垟
e59ea0:垠垡垢垣垤垥垦垧垨垩垪垫垬垭垮垯
e59eb0:垰垱垲垳垴垵垶垷垸垹垺垻垼垽垾垿
e59f80:埀埁埂埃埄埅埆埇埈埉埊埋埌埍城埏

UTF-8の全角を表示するプログラム改良版

/*ひな型Hello*/
#include <stdio.h>

main(){
   int a,b,c;
   FILE *fp;

   fp=fopen("725a.txt","wb");
   if(fp==NULL){
      printf("fail\n");
      return;
   }

   for(a=0xe1;a<=0xec;a++){
      for(b=0x80;b<=0xbf;b++){
         for(c=0x80;c<=0xbf;c++){
           if((c%16)==0){
               printf("%x",a);
               printf("%x",b);
               printf("%x",c);
               printf(":");
               fprintf(fp,"%x",a);
               fprintf(fp,"%x",b);
               fprintf(fp,"%x",c);
               fprintf(fp,":");
           }
            printf("%c",a);
            printf("%c",b);
            printf("%c",c);
            fprintf(fp,"%c",a);
            fprintf(fp,"%c",b);
            fprintf(fp,"%c",c);
            if((c%16)==15){
               printf("\n");
               fprintf(fp,"\n");
            }
         }
     }
  }
   fclose(fp);
}

UTF-8の全角を出力するプログラム

/*ひな型Hello*/
#include <stdio.h>

main(){
   int a,b,c;
   FILE *fp;

   fp=fopen("723a.txt","wb");
   if(fp==NULL){
      printf("fail\n");
      return;
   }

   for(a=0xe1;a<=0xec;a++){
      for(b=0x80;b<=0xbf;b++){
         for(c=0x80;c<=0xbf;c++){
            printf("%c",a);
            printf("%c",b);
            printf("%c",c);
            fprintf(fp,"%c",a);
            fprintf(fp,"%c",b);
            fprintf(fp,"%c",c);
            if((c%16)==15){
               printf("\n");
               fprintf(fp,"\n");
            }
         }
     }
  }
  fclose(fp);
}

2013年7月21日日曜日

イラストロジック解析ソルバーで解いたブレーメンの音楽隊


イラストロジック解析(ソルバー)で解いた絵、イタリアです




lsコマンドの真似事lss.c


lss.c

$ gcc -o lss lss.c

$ ./lss

$ ./lss .c  (エルエスエス空白ポチシー)

$ ./lss dir

$ ./lss lss

などなど


#include <sys/syscall.h>
#include <unistd.h>

#ifdef __linux__
# include <linux/types.h>
/* # include <linux/dirent.h> */
# include <linux/unistd.h>
# include <errno.h>
#else
# include <dirent.h>
#endif

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
#define AMAX 256

struct dirent {
   long d_ino;
   off_t d_off;
   unsigned short d_reclen;
   char d_name[256];
};

struct node {
   long fileno;
   char filename[AMAX];
   char atime[AMAX];
   char rwxx[AMAX];
   off_t asize;
   struct node *back,*next;
};

char atime[AMAX];
char filename[AMAX];
char rwxx[AMAX];
off_t asize,sumsize1=0,sumsize2=0;
void timecpy(char a[AMAX],char b[AMAX]);
void rwx(char a[AMAX],long b);
long ic=0,sumcnt1=0,sumcnt2=0;

struct node *node_create();
struct node *shojun(struct node *temp);
struct node *sttc1,*stt;
struct node *startc1,*endc1;
struct node *info,*start,*last,*gcdata,*gc2;


struct stat buf2;
char *search(char *text,char *key);
int kensaku(char *ss);

long cnt=0;
char tt[100];
int j;
int ynflg;
int overflg=0;
int argc1;
char *argv1,p[AMAX];

int main(int argc,char *argv[]){
   int i,im,d_size;
   int fd;
   char buf[4096],ch;
   char ss[500],*p;
   char yn[20];

   argc1=argc;
   argv1=argv[1];
   strcpy(ss,".");
   j=1;
   kensaku(ss);

}

int kensaku(char *ss){
   int i,im,d_size,k;
   int fd;
   char buf[4096],ss1[100][500];
   char *p;

   j++;
   if((fd=open(ss,O_RDONLY))<0){
      perror("open");
      j--;
      return 1;
   }

   while((d_size=syscall(SYS_getdents,fd,(struct dirent *)&buf,sizeof buf))>0){
      for(i=0;i<d_size;i+=((struct dirent *)&buf[i])->d_reclen){
         strcpy(ss1[j],ss);
         strcat(ss1[j],"/");
         strcat(ss1[j],((struct dirent *)&buf[i])->d_name);
         if(stat(ss1[j],&buf2)<0){
              perror("stat");
              j--;
              return 1;
         }

if(ic==0){
startc1=sttc1=gcdata=gc2=node_create();
                ic++;
strcpy(gcdata->filename,((struct dirent *)&buf[i])->d_name);
                timecpy(gcdata->atime,ctime(&buf2.st_mtime));
                rwx(gcdata->rwxx,buf2.st_mode);
                gcdata->asize=buf2.st_size;
         }
         else{
       gcdata->next=node_create();
          gcdata=gcdata->next;
gcdata->back=gc2;
gc2=gc2->next;
strcpy(gcdata->filename,((struct dirent *)&buf[i])->d_name);
                timecpy(gcdata->atime,ctime(&buf2.st_mtime));
                rwx(gcdata->rwxx,buf2.st_mode);
                gcdata->asize=buf2.st_size;
         }
      }
   }

   info=startc1;
   last=NULL;
   while(info){
      startc1     =info->next;
      info->next=NULL;
      stt       =shojun(info);
      info      =startc1;
   }
   startc1=stt;
   endc1=last;

   ic=1;
   info=startc1;
   while(info){
      info->fileno=ic;
      info=info->next;
      ic++;
   }

   if(argc1==1){
      info=startc1;
      while(info){
         sumcnt1++;
         sumsize1+=info->asize;
         printf("%5ld: %-10s %s %s %8ld\33[0m\n",info->fileno,info->filename,info->rwxx,info->atime,info->asize);
         info=info->next;
      }
      printf("\nこのフォルダの総数は %ld でファイルの総和は %ld\n",sumcnt1,sumsize1);
   }
   if(argc1==2){
      info=startc1;
      while(info){
         sumcnt1++;
         sumsize1+=info->asize;
         p=search(info->filename,argv1);
         if(!strcmp(argv1,"dir")&&info->rwxx[0]=='d'){
            sumcnt2++;
            sumsize2+=info->asize;
            printf("%5ld: %-10s %s %s %8ld\33[0m\n",info->fileno,info->filename,info->rwxx,info->atime,info->asize);
         }
         else if(!strcmp(argv1,"file")&&info->rwxx[1]=='f'){
            sumcnt2++;
            sumsize2+=info->asize;
            printf("%5ld: %-10s %s %s %8ld\33[0m\n",info->fileno,info->filename,info->rwxx,info->atime,info->asize);
         }
          else if(p){
            sumcnt2++;
            sumsize2+=info->asize;
            printf("%5ld: %-10s %s %s %8ld\33[0m\n",info->fileno,info->filename,info->rwxx,info->atime,info->asize);
         }
        info=info->next;
      }
      printf("\nカレントディレクトリの総数は %ld でファイルの総和は %ld\n",sumcnt1,sumsize1);
      printf("検索ワードは %s\n検索ワードの総数は %ld でファイルの総和は %ld\n",argv1,sumcnt2,sumsize2);
   }
   if(d_size<0){
      perror("getdents");
      j--;
      return 0;
   }
}



char *search(char *text,char *key){

   int m,n;
   char *p;

   m=strlen(text);
   n=strlen(key);
   for(p=text;p<=text+m-n;p++){
      if(strncmp(p,key,n)==0) return p;
   }
   return NULL;
}

void timecpy(char a[AMAX],char b[AMAX]){

   a[ 0]='\33';
   a[ 1]='[';
   a[ 2]='3';
   a[ 3]='1'+b[23]%5;
   a[ 4]='m';
   a[ 5]=b[20];
   a[ 6]=b[21];
   a[ 7]=b[22];
   a[ 8]=b[23];
   a[ 9]='/';
   a[10]='\33';
   a[11]='[';
   a[12]='3';
   if(b[4]=='J'&&b[5]=='a') a[13]='1';
   else if(b[4]=='F'&&b[5]=='e') a[13]='2';
   else if(b[4]=='M'&&b[6]=='r') a[13]='3';
   else if(b[4]=='A'&&b[5]=='p') a[13]='4';
   else if(b[4]=='M'&&b[6]=='y') a[13]='5';
   else if(b[4]=='J'&&b[5]=='u'&&b[6]=='n') a[13]='6';
   else if(b[4]=='J'&&b[5]=='u'&&b[6]=='l') a[13]='1';
   else if(b[4]=='A'&&b[5]=='u') a[13]='2';
   else if(b[4]=='S'&&b[5]=='e') a[13]='3';
   else if(b[4]=='O'&&b[5]=='c') a[13]='4';
   else if(b[4]=='N'&&b[5]=='o') a[13]='5';
   else if(b[4]=='D'&&b[5]=='e') a[13]='6';
   else a[13]='1';
   a[14]='m';
   a[15]=b[4];
   a[16]=b[5];
   a[17]=b[6];
   a[18]='/';
   a[19]='\33';
   a[20]='[';
   a[21]='3';
   a[22]='1'+b[9]%5;
   a[23]='m';
   if(b[8]==' ') a[24]='0';
   else          a[24]=b[8];
   a[25]=b[9];
   a[26]='\33';
   a[27]='[';
   a[28]='3';
   if(b[0]=='S'&&b[1]=='u') a[29]='1';
   else if(b[0]=='S'&&b[1]=='a') a[29]='2';
   else if(b[0]=='M') a[29]='2';
   else if(b[0]=='T'&&b[1]=='u') a[29]='3';
   else if(b[0]=='T'&&b[1]=='h') a[29]='6';
   else if(b[0]=='W') a[29]='4';
   else if(b[0]=='F') a[29]='5';
   else a[29]='1';
   a[30]='m';
   a[31]='(';
   a[32]=b[0];
   a[33]=b[1];
   a[34]=b[2];
   a[35]=')';
   a[36]='\33';
   a[37]='[';
   a[38]='3';
   a[39]='1'+b[12]%5;
   a[40]='m';
   a[41]=b[11];
   a[42]=b[12];
   a[43]=b[13];
   a[44]='\33';
   a[45]='[';
   a[46]='3';
   a[47]='1'+b[15]%5;
   a[48]='m';
   a[49]=b[14];
   a[50]=b[15];
   a[51]=b[16];
   a[52]='\33';
   a[53]='[';
   a[54]='3';
   a[55]='1'+b[18]%5;
   a[56]='m';
   a[57]=b[17];
   a[58]=b[18];
   a[59]='\0';
   if(b[0]==' ') strcpy(a,"  \33[31mファイルがありません  ");

}

struct node *node_create()
{
   struct node *from;
   int size;

   size=sizeof(struct node);

   from = (struct node*)malloc(size);
   if(!from){
      printf("out of memory ¥n");
      exit(0);
   }
   from->next=NULL;
   from->back=NULL;
   from->fileno=0;
   strcpy(from->filename,"");
   strcpy(from->atime,"");
   from->asize=0;
   return from;
}


struct node *shojun(struct node *temp)
{
   struct node *old;
   struct node *now;

   now=stt;
   old=NULL;

   if(!last){
      temp->next=NULL;
      temp->back=NULL;
      last      =temp;
      return temp;
   }
   while(now){
      if(strcmp(now->filename,temp->filename) < 0){
         old=now;
         now=now->next;
      }
      else{
         if(old){
            old ->next=temp;
   now->back=temp;
            temp->next=now;
   temp->back=old;
            return stt;
         }
         else{
            temp->next=now;
   now->back=temp;
   temp->back=NULL;
            return temp;
         }
      }
   }
   last->next=temp;
   temp->back=last;
   temp->next=NULL;
   last      =temp;
   return stt;
}

void rwx(char a[AMAX],long b){
   strcpy(a,"_________________");
   if((b&0x8000)==0x8000) a[1]='f';
   if((b&0x4000)==0x4000) a[0]='d';
/*
   if((b&0x2000)==0x2000) a[2]='c';
   if((b&0x1000)==0x1000) a[3]='d';
   if((b&0x0800)==0x0800) a[4]='e';
   if((b&0x0400)==0x0400) a[5]='f';
   if((b&0x0200)==0x0200) a[6]='g';
*/
   if((b&0x0100)==0x0100) a[3]='r';
   if((b&0x0080)==0x0080) a[4]='w';
   if((b&0x0040)==0x0040) a[5]='x';
   if((b&0x0020)==0x0020) a[6]='r';
   if((b&0x0010)==0x0010) a[7]='w';
   if((b&0x0008)==0x0008) a[8]='x';
   if((b&0x0004)==0x0004) a[9]='r';
   if((b&0x0002)==0x0002) a[10]='w';
   if((b&0x0001)==0x0001) a[11]='x';
   a[12]=0;
}

2013年7月18日木曜日

英大文字を小文字に、小文字を大文字にするアセンブラ(dynabook AZ)


/*ひな型Hello*/
#include <stdio.h>

main(){
   char s[100]="                                                  ";
   char s1[20]="%s";
   char s2[20]="%s\n";
   char s3[20]=" input: ";
   char s4[20]="output: %s\n";
   int i;
/*
s[0]=0;
s1[0]=0;
s2[0]=0;
s3[0]=0;
s4[0]=0;
*/

   asm("   add r0,r7,#0");
   asm("   add r1,r7,#40");
   asm("   bl printf");

   asm("   add r0,r7,#0");
   asm("   add r1,r7,#80");
   asm("   bl __isoc99_scanf");
   asm("   mov r5,#0");

   asm("   b T2");
   asm("T5:   ");
   asm("   add r2,r7,#80");
   asm("   ldrb r4,[r2,r5]");
   asm("   cmp r4,#64");
   asm("   bls T3");
   asm("   cmp r4,#90");
   asm("   bhi T3");
   asm("   adds r4,r4,#32");
   asm("   strb r4,[r2,r5]");
   asm("   b T4");

   asm("T3:   ");
   asm("   cmp r4,#96");
   asm("   bls T4");
   asm("   cmp r4,#122");
   asm("   bhi T4");
   asm("   subs r4,r4,#32");
   asm("   strb r4,[r2,r5]");

   asm("T4:   ");
   asm("   adds r5,r5,#1");

   asm("T2:   ");
   asm("   add r2,r7,#80");
   asm("   ldrb r4,[r2,r5]");
   asm("   cmp r4,#0");
   asm("   bne T5");
   asm("   add r0,r7,#60");
   asm("   add r1,r7,#80");
   asm("   bl printf");

}