yamamoto #9171(2009/06/15 02:54 GMT) [ Scala ] Rating-2/2=-1.00
完成度低めですが、ErlangとCの書式変換など。 はじめ、Erlangで書こうとしたが挫折。 ScalaのExtractorで実装しはじめたものの、 Erlangの書式の柔軟さに負けた感のある今日この頃。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
// printf書式文字列変換(お題 : http://ja.doukaku.org/259/) // // Erlangの書式文字文字列 <--> C言語の書式文字列 // コマンドラインargs先頭で処理を指定、残りの引数で書式指定 // c2e : C --> Erlang // e2c : Erlang --> C // 例) // c2e %f %020d %.20d %+20.10d %-20f %-20.10f // e2c ~f ~20.0p ~.20p ~20.10p ~-20f ~-20.10f // e2c ~10s ~-10s ~10.3.+s ~10.10.+s ~10.7.+s // ( ~10.3.+s ~10.10.+s ~10.7.+s はCの書式では正確に対応できません ) object Main { def main(args : Array[String]) : Unit = { args.toList match { case "e2c" :: xs => for(x<-xs ; ErlFormatTerm(flag,termF,termP,termPad,termMod,termC) = x ) { //println(flag,termF,termP,termPad,termMod,termC) print (x + " ---> ") val flags = (flag,termPad) match{ case ("-","" ) => "-" case ("-"," ") => "-" case ("-","0") => "-" case ("" ," ") => " " case ("" ,"0") => "0" case _ => "" } termC match { case "B" if termP=="8" => println ( CFormatTerm(flags,termF, "","o") ) case "B" if termP=="16" => println ( CFormatTerm(flags,termF, "","x") ) case "c" => println ( CFormatTerm(flags,termF,termP,"c") ) case "s" => println ( CFormatTerm(flags,termF,termP,"s") ) case "f" => println ( CFormatTerm(flags,termF,termP,"f") ) case "e" => println ( CFormatTerm(flags,termF,termP,"e") ) case "g" => println ( CFormatTerm(flags,termF,termP,"g") ) // case _ => println ( "未対応" ) } } case "c2e" :: xs => for(x<-xs ; CFormatTerm(flags,fieldWidth,precision,specifier) = x ) { print (x + " ---> ") val pad = flags match{ case "+" => "" case "-" => "" case " " => "" case "0" => "0" case _ => "" } val flag = flags match{ case "-" => "-" // case "+" => "" case " " => "" case "0" => "" case _ => "" } specifier match{ // F P Pad Mod C case "d" | "i" => println ( ErlFormatTerm(flag,fieldWidth,precision,pad,"","p") ) case "u" => println ( ErlFormatTerm(flag,fieldWidth,precision,pad,"","p") ) case "o" => println ( ErlFormatTerm(flag,fieldWidth, "8", "","","B") ) case "x" => println ( ErlFormatTerm(flag,fieldWidth, "16", "","","B") ) case "X" => println ( ErlFormatTerm(flag,fieldWidth, "16", "","","B") ) case "f" => println ( ErlFormatTerm(flag,fieldWidth,precision, "","","f") ) case "e" | "E" => println ( ErlFormatTerm(flag,fieldWidth,precision, "","","e") ) case "a" | "A" => println ( ErlFormatTerm(flag,fieldWidth,precision, "","","p") ) case "g" | "G" => println ( ErlFormatTerm(flag,fieldWidth,precision, "","","g") ) case "c" => println ( ErlFormatTerm(flag,fieldWidth,precision,pad,"","c") ) case "s" => println ( ErlFormatTerm(flag,fieldWidth,precision,pad,"","s") ) case "N" => println ( ErlFormatTerm(flag,fieldWidth,precision, "","","p") ) case "p" => println ( ErlFormatTerm(flag,fieldWidth, "16","0","","B") ) //case "%" => case _ => println ( "未対応" ) } } case Nil => case _ => } () } } object ErlFormatTerm{ // F.P.PadModC def apply(flag :String , termF:String , termP:String , termPad:String , termMod:String , termC:String) : String = { val tail = termMod+termC (termF,termP,termPad) match { // fmt0 case ("" ,"",_) => "~"+tail // // fmt1 case (f ,"", "") if f != "" => "~" + flag + f + tail // fmt2 case (f ,"",pad) if f != "" => "~" + flag + f +"."+pad+ tail // // fmt3 case ("" , p, _) if p != "" => "~."+p + tail // // fmt4 case (f , p, "") => "~"+ flag + f+"."+p +tail // fmt5 case (f , p,pad) => "~"+ flag + f+"."+p+"."+pad+tail } } // def unapply(format:String) : Option[(String,String,String,String,String,String)] ={ if ( format(0) != '~' ) return None val reFmt0 = """~([^.\d])""".r // ~s val reFmt1 = """~(-?)(\d+)([^.\d])""".r // ~10s , ~-10s val reFmt2 = """~(-?)(\d+)\.(.)([^.\d])""".r // ~10.+s val reFmt3 = """~\.(\d+)([^.\d])""".r // ~.5s val reFmt4 = """~(-?)(\d+)\.(\d+)([^.\d])""".r // ~-10.5s val reFmt5 = """~(-?)(\d+)\.(\d+)\.(.)([^.\d])""".r // ~-10.5.+s // format match { case reFmt0( termC) => Some("" , "","", "","",termC) case reFmt1(flag,termF ,termC) => Some(flag,termF,"", "","",termC) case reFmt2(flag,termF,termPad ,termC) => Some(flag,termF,"", termPad,"",termC) case reFmt3( termP ,termC) => Some("" , "","", "","",termC) case reFmt4(flag,termF,termP ,termC) => Some(flag,termF,termP, "","",termC) case reFmt5(flag,termF,termP,termPad,termC) => Some(flag,termF,termP,termPad,"",termC) case _ => None } } } object CFormatTerm{ // %[flags][fieldWidth][.precision]specifier def apply(flags:String , fieldWidth:String, precision:String , specifier:String ) : String = { "%"+flags+fieldWidth + {if(precision!="") "."+ precision else ""} +specifier } // def unapply(format:String) : Option[(String,String,String,String)] ={ if ( format(0) != '%' ) return None // val reFmt0 = """%([a-zA-Z])""".r val reFmt1 = """%([-+ 0#])([\d*]+)([a-zA-Z])""".r val reFmt2 = """%([\d*]+)([a-zA-Z])""".r val reFmt3 = """%([-+ 0#])([\d*]+)\.([\d*]+)([a-zA-Z])""".r val reFmt4 = """%([\d*]+)\.([\d*]+)([a-zA-Z])""".r val reFmt5 = """%\.([\d*]+)([a-zA-Z])""".r format match { case reFmt0( specifier) => Some( "", "", "",specifier) case reFmt1(flags,fieldWidth, specifier) => Some(flags,fieldWidth, "",specifier) case reFmt2( fieldWidth, specifier) => Some( "",fieldWidth, "",specifier) case reFmt3(flags,fieldWidth,precision,specifier) => Some(flags,fieldWidth,precision,specifier) case reFmt4( fieldWidth,precision,specifier) => Some( "",fieldWidth,precision,specifier) case reFmt5( precision,specifier) => Some( "", "",precision,specifier) case _ => None } } }
Rating-2/2=-1.00-0+
[ reply ]
yamamoto
#9171()
[
Scala
]
Rating-2/2=-1.00
完成度低めですが、ErlangとCの書式変換など。 はじめ、Erlangで書こうとしたが挫折。 ScalaのExtractorで実装しはじめたものの、 Erlangの書式の柔軟さに負けた感のある今日この頃。
// printf書式文字列変換(お題 : http://ja.doukaku.org/259/) // // Erlangの書式文字文字列 <--> C言語の書式文字列 // コマンドラインargs先頭で処理を指定、残りの引数で書式指定 // c2e : C --> Erlang // e2c : Erlang --> C // 例) // c2e %f %020d %.20d %+20.10d %-20f %-20.10f // e2c ~f ~20.0p ~.20p ~20.10p ~-20f ~-20.10f // e2c ~10s ~-10s ~10.3.+s ~10.10.+s ~10.7.+s // ( ~10.3.+s ~10.10.+s ~10.7.+s はCの書式では正確に対応できません ) object Main { def main(args : Array[String]) : Unit = { args.toList match { case "e2c" :: xs => for(x<-xs ; ErlFormatTerm(flag,termF,termP,termPad,termMod,termC) = x ) { //println(flag,termF,termP,termPad,termMod,termC) print (x + " ---> ") val flags = (flag,termPad) match{ case ("-","" ) => "-" case ("-"," ") => "-" case ("-","0") => "-" case ("" ," ") => " " case ("" ,"0") => "0" case _ => "" } termC match { case "B" if termP=="8" => println ( CFormatTerm(flags,termF, "","o") ) case "B" if termP=="16" => println ( CFormatTerm(flags,termF, "","x") ) case "c" => println ( CFormatTerm(flags,termF,termP,"c") ) case "s" => println ( CFormatTerm(flags,termF,termP,"s") ) case "f" => println ( CFormatTerm(flags,termF,termP,"f") ) case "e" => println ( CFormatTerm(flags,termF,termP,"e") ) case "g" => println ( CFormatTerm(flags,termF,termP,"g") ) // case _ => println ( "未対応" ) } } case "c2e" :: xs => for(x<-xs ; CFormatTerm(flags,fieldWidth,precision,specifier) = x ) { print (x + " ---> ") val pad = flags match{ case "+" => "" case "-" => "" case " " => "" case "0" => "0" case _ => "" } val flag = flags match{ case "-" => "-" // case "+" => "" case " " => "" case "0" => "" case _ => "" } specifier match{ // F P Pad Mod C case "d" | "i" => println ( ErlFormatTerm(flag,fieldWidth,precision,pad,"","p") ) case "u" => println ( ErlFormatTerm(flag,fieldWidth,precision,pad,"","p") ) case "o" => println ( ErlFormatTerm(flag,fieldWidth, "8", "","","B") ) case "x" => println ( ErlFormatTerm(flag,fieldWidth, "16", "","","B") ) case "X" => println ( ErlFormatTerm(flag,fieldWidth, "16", "","","B") ) case "f" => println ( ErlFormatTerm(flag,fieldWidth,precision, "","","f") ) case "e" | "E" => println ( ErlFormatTerm(flag,fieldWidth,precision, "","","e") ) case "a" | "A" => println ( ErlFormatTerm(flag,fieldWidth,precision, "","","p") ) case "g" | "G" => println ( ErlFormatTerm(flag,fieldWidth,precision, "","","g") ) case "c" => println ( ErlFormatTerm(flag,fieldWidth,precision,pad,"","c") ) case "s" => println ( ErlFormatTerm(flag,fieldWidth,precision,pad,"","s") ) case "N" => println ( ErlFormatTerm(flag,fieldWidth,precision, "","","p") ) case "p" => println ( ErlFormatTerm(flag,fieldWidth, "16","0","","B") ) //case "%" => case _ => println ( "未対応" ) } } case Nil => case _ => } () } } object ErlFormatTerm{ // F.P.PadModC def apply(flag :String , termF:String , termP:String , termPad:String , termMod:String , termC:String) : String = { val tail = termMod+termC (termF,termP,termPad) match { // fmt0 case ("" ,"",_) => "~"+tail // // fmt1 case (f ,"", "") if f != "" => "~" + flag + f + tail // fmt2 case (f ,"",pad) if f != "" => "~" + flag + f +"."+pad+ tail // // fmt3 case ("" , p, _) if p != "" => "~."+p + tail // // fmt4 case (f , p, "") => "~"+ flag + f+"."+p +tail // fmt5 case (f , p,pad) => "~"+ flag + f+"."+p+"."+pad+tail } } // def unapply(format:String) : Option[(String,String,String,String,String,String)] ={ if ( format(0) != '~' ) return None val reFmt0 = """~([^.\d])""".r // ~s val reFmt1 = """~(-?)(\d+)([^.\d])""".r // ~10s , ~-10s val reFmt2 = """~(-?)(\d+)\.(.)([^.\d])""".r // ~10.+s val reFmt3 = """~\.(\d+)([^.\d])""".r // ~.5s val reFmt4 = """~(-?)(\d+)\.(\d+)([^.\d])""".r // ~-10.5s val reFmt5 = """~(-?)(\d+)\.(\d+)\.(.)([^.\d])""".r // ~-10.5.+s // format match { case reFmt0( termC) => Some("" , "","", "","",termC) case reFmt1(flag,termF ,termC) => Some(flag,termF,"", "","",termC) case reFmt2(flag,termF,termPad ,termC) => Some(flag,termF,"", termPad,"",termC) case reFmt3( termP ,termC) => Some("" , "","", "","",termC) case reFmt4(flag,termF,termP ,termC) => Some(flag,termF,termP, "","",termC) case reFmt5(flag,termF,termP,termPad,termC) => Some(flag,termF,termP,termPad,"",termC) case _ => None } } } object CFormatTerm{ // %[flags][fieldWidth][.precision]specifier def apply(flags:String , fieldWidth:String, precision:String , specifier:String ) : String = { "%"+flags+fieldWidth + {if(precision!="") "."+ precision else ""} +specifier } // def unapply(format:String) : Option[(String,String,String,String)] ={ if ( format(0) != '%' ) return None // val reFmt0 = """%([a-zA-Z])""".r val reFmt1 = """%([-+ 0#])([\d*]+)([a-zA-Z])""".r val reFmt2 = """%([\d*]+)([a-zA-Z])""".r val reFmt3 = """%([-+ 0#])([\d*]+)\.([\d*]+)([a-zA-Z])""".r val reFmt4 = """%([\d*]+)\.([\d*]+)([a-zA-Z])""".r val reFmt5 = """%\.([\d*]+)([a-zA-Z])""".r format match { case reFmt0( specifier) => Some( "", "", "",specifier) case reFmt1(flags,fieldWidth, specifier) => Some(flags,fieldWidth, "",specifier) case reFmt2( fieldWidth, specifier) => Some( "",fieldWidth, "",specifier) case reFmt3(flags,fieldWidth,precision,specifier) => Some(flags,fieldWidth,precision,specifier) case reFmt4( fieldWidth,precision,specifier) => Some( "",fieldWidth,precision,specifier) case reFmt5( precision,specifier) => Some( "", "",precision,specifier) case _ => None } } }Rating-2/2=-1.00-0+
[ reply ]