[Top Page][All Pages][Recent Changes]

Edit History:Diff

Changes of 改行コードを変換するモジュール between Epoch and 2015/09/09 09:49:10 JST

  • + added lines
  • - deleted lines

Return to the edit history

+ 改行コードを変換するモジュール
+ 複数の種類の改行コードが混在していても変換できるはず
+ CR+LF、CR、LFの改行コードに対応しています
+ {{{
+ #module
+ 
+ 	//改行コードを変換する
+ 	//使い方
+ 	//kaigyohen p1 ,p2 ,p3 ,p4 ,p5 ,p6
+ 	//p1=変数名 : 変換先の変数
+ 	//p2=変数名 : 変換元の変数
+ 	//p3=0~2(0) : どの改行コードに変換するか変換 ( 0=CR+LF , 1=CR , 2=LF )
+ 	//p4=0~2(0) : 処理方法 ( 0=実際に処理 , 1=使われている改行コードの種類を求める(返し値 0=不明 , 1=CR+LF , 2=CR , 3=LF) , 2=実際の処理はせずに変換後の文字列の長さだけを計算(末尾の0は含まず)
+ 	//p5=0~(0)  : 変換後の文字列が入るバッファーのサイズ (0の際は自動確保)
+ 	//p6=0~(0)  : 変換する文字列の長さ (0の際は自動計算)
+ 
+ 	#define CR 13//先頭に戻る
+ 	#define LF 10//一行下に送る
+ 	#deffunc kaigyohenkan var henkanato , var henkanmae , int shurui , int dosuru , int nagasaato , int nagasamae , local j , local tmp , local motoshurui
+ 
+ 		if dosuru<0 | dosuru>2 : return 0
+ 		if shurui<0 | shurui>2 : return 0
+ 
+ 		if dosuru==1{
+ 			motoshurui=0 //motoshurui=0 不明 , motoshurui=1 CR+LF , motoshurui=2 CRだけ , motoshurui=3 LFだけ
+ 			repeat//元の改行コードの種類を求める
+ 
+ 				if nagasamae>0 : if cnt>=nagasamae : break
+ 				tmp=peek(henkanmae,cnt)
+ 				if tmp==0 : break
+ 				if tmp==CR{
+ 					if nagasamae>0 & cnt+1<nagasamae{
+ 						if peek(henkanmae,cnt+1)==LF : motoshurui=1 : break
+ 						motoshurui=2 : break
+ 					}
+ 					if nagasamae<=0 {
+ 						if peek(henkanmae,cnt+1)==LF : motoshurui=1 : break
+ 						motoshurui=2 : break
+ 					}
+ 					motoshurui=2 : break
+ 				}
+ 				if tmp==LF : motoshurui=3 : break
+ 
+ 			loop
+ 			return motoshurui
+ 		}
+ 
+ 		j=0
+ 		repeat
+ 
+ 			if nagasamae>0 : if cnt>=nagasamae : break
+ 			if nagasaato>0 & j>= nagasaato-1 : break
+ 			if nagasaato<=0 & dosuru!=2 : memexpand henkanato,j+2
+ 			tmp=peek(henkanmae,cnt)
+ 			if tmp==0 : break
+ 
+ 			if tmp==CR{
+ 				if (nagasamae>0 & cnt+1<nagasamae) | (nagasamae<=0) {
+ 					if peek(henkanmae,cnt+1)==LF{//CR+LFの組み合わせの時
+ 						if shurui==0{
+ 							if nagasaato<=0 & dosuru!=2 : memexpand henkanato,j+3
+ 							if nagasaato>0 & j>= nagasaato-2 : break
+ 							if dosuru!=2 : poke henkanato,j,CR : poke henkanato,j+1,LF
+ 							j+=2
+ 						}
+ 						if shurui==1{
+ 							if nagasaato>0 & j>= nagasaato-1 : break
+ 							if dosuru!=2 : poke henkanato,j,CR
+ 							j++
+ 						}
+ 						if shurui==2{
+ 							if nagasaato>0 & j>= nagasaato-1 : break
+ 							if dosuru!=2 : poke henkanato,j,LF
+ 							j++
+ 						}
+ 						continue cnt+2
+ 					}
+ 				}
+ 			}
+ 
+ 			if tmp==LF | tmp==CR{//CR単体 または LF単体の時
+ 				if shurui==0{
+ 					if nagasaato<=0 & dosuru!=2 : memexpand henkanato,j+3
+ 					if nagasaato>0 & j>= nagasaato-2 : break
+ 					if dosuru!=2 : poke henkanato,j,CR : poke henkanato,j+1,LF
+ 					j+=2
+ 				}
+ 				if shurui==1{
+ 					if nagasaato>0 & j>= nagasaato-1 : break
+ 					if dosuru!=2 : poke henkanato,j,CR
+ 					j++
+ 				}
+ 				if shurui==2{
+ 					if nagasaato>0 & j>= nagasaato-1 : break
+ 					if dosuru!=2 : poke henkanato,j,LF
+ 					j++
+ 				}
+ 				continue
+ 			}
+ 
+ 			 if dosuru!=2 : poke henkanato,j,tmp
+ 			j++
+ 
+ 		loop
+ 
+ 		if dosuru!=2 : poke henkanato,j,0
+ 		return j
+ 
+ #global
+ 
+ moto="ちくわ1234567890a0123456789味噌1233211az- ここから前は入る\nmiso ここから後ろは入らない"
+ sdim buf
+ kaigyohenkan buf,moto,,1
+ if stat==0:mes "改行コードはわかりません"
+ if stat==1:mes "改行コードはCR+LF"
+ if stat==2:mes "改行コードはCRだけ"
+ if stat==3:mes "改行コードはLFだけ"
+ kaigyohenkan buf,moto,2,2,64,67
+ mes "67バイト分を改行コードをCR+LFからLFに変換した後の\n文字列の長さの計算(末尾の0は含みません) "+stat+"バイト"
+ mes "strlen(moto)="+strlen(moto)+"\n\n元の文字列\n"+moto+"\n\n67バイト分を改行コードをCR+LFからLFに変換"
+ kaigyohenkan buf,moto,2,,64,67
+ mes "返し値="+stat+" strlen(buf)="+strlen(buf)+"\n\nLFへの変換結果\n"+buf+"\n"
+ 
+ moto=buf
+ sdim buf
+ kaigyohenkan buf,moto,,1
+ if stat==0:mes "改行コードはわかりません"
+ if stat==1:mes "改行コードはCR+LF"
+ if stat==2:mes "改行コードはCRだけ"
+ if stat==3:mes "改行コードはLFだけ"
+ kaigyohenkan buf,moto,1,2,64
+ mes "最後までを改行コードをLFからCRに変換した後の\n文字列の長さの計算(末尾の0は含みません) "+stat+"バイト"
+ mes "最後までを改行コードをLFからCRに変換"
+ kaigyohenkan buf,moto,1,,64,//変換前の長さ(第6引き数)を省略すれば自動計算
+ mes "返し値="+stat+" strlen(buf)="+strlen(buf)+"\n\nCRへの変換結果\n"+buf+"\n"
+ 
+ button "次へ",*tsugi
+ stop
+ 
+ *tsugi
+ 
+ cls
+ 
+ moto=buf
+ sdim buf
+ kaigyohenkan buf,moto,,1
+ if stat==0:mes "改行コードはわかりません"
+ if stat==1:mes "改行コードはCR+LF"
+ if stat==2:mes "改行コードはCRだけ"
+ if stat==3:mes "改行コードはLFだけ"
+ kaigyohenkan buf,moto,,2
+ mes "改行コードをCRからCR+LFに変換した後の\n文字列の長さの計算(末尾の0は含みません) "+stat+"バイト"
+ mes "変換後の変数のメモリを自動確保させて改行コードをCRからCR+LFに変換"
+ kaigyohenkan buf,moto,,,,//変換後の結果が入る変数のサイズ(第5引き数)を省略すれば自動確保 ここで第5引き数に65以上の数を指定するとバッファーオーバーフロー
+ mes "返し値="+stat+" strlen(buf)="+strlen(buf)+"\n\nCR+LFへの変換結果\n"+buf
+ }}}