■■■■■■□■■■■■■□■■■■■■□□□□□■■□■■■■■■
■■□□■■□■■□□■■□■■□□□□□■■■■■■□■■□□□□
■■□□■■□■■□□■■□■■□□□□□■■□□■■□■■■■■■
■■□□■■□■■□□■■□■■□□□□□■■□□■■□□□□□■■
■■□□■■□■■■■■■□■■■■■■□■■■■■■□■■■■■■

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告

連番展開スクリプト(ruby版ver.2.2)

すいません、間違えて16進数の展開が出来なくなっていたので修正しました…


#!/usr/bin/env ruby
###############################################
# expand serial number                        #
# syntax  : foo[nStart-nEnd][...]             #
# example : before                            #
#             0: foo[0-1][3-2]bar[1+\2][\1-1] #
#           after                             #
#             0: foo03bar4-1                  #
#             1: foo02bar3-1                  #
#             2: foo13bar40                   #
#             3: foo12bar30                   #
###############################################

IS_START_UPPER = 0
IS_START_LOWER = 1
IS_END_UPPER   = 2
IS_END_LOWER   = 3

####### SUB FUNCTIONS
### TO_S UNDER HEX
def to_hs(sFoo, isHex)
    return sprintf((isHex[IS_START_UPPER] == 1) ? "%X" :
                   (isHex[IS_START_LOWER] == 1) ? "%x" :
                                                  "%d", sFoo)
end
### DIGIT ALIGNMENT
def aligndigit(sFoo, nLen)
    return sFoo = "0" * [nLen - sFoo.length, 0].max + sFoo
end
### DECREMENT INDEX OF BACK-REFERENCE
def decrefindex(sFoo)
  if (sFoo =~ /(.*?\[.*?\\)(\d)(.*?\].*)/)
    return $1 + ($2.to_i-1).to_s + decrefindex($3)
  end
  return sFoo
end
### SUBSTITUTE BACK-REFERENCE "\1"
def substbackref(sFoo, sBar, isHex)
  if (sFoo =~ /.*\[(.*?)\\1(.*?)\]/)
    sEvl = aligndigit(to_hs(eval($1 + (isHex != 0 ? "0x" + sBar : sBar.to_i.to_s) + $2), isHex), sBar.length)
    substbackref(sFoo.gsub!(/\[#{Regexp.escape($1 + '\1' + $2)}\]/, sEvl), sBar, isHex)
  end
  return decrefindex(sFoo)
end
### SERIAL NUMBER EXPANTION
def expand(sFoo)
  if (sFoo =~ /(.*?)\[\s*((?:0[xX])?(?:^0+?)?[0-9a-fA-F]+)\s*-\s*((?:0[xX])?[0-9a-fA-F]+)\s*\](.*)/)
    sPre   = $1
    sStart = $2
    sEnd   = $3
    sSuf   = $4

    isHex = 0
    isHex |= (1<<IS_START_UPPER) if (sStart[0..1] == "0X")
    isHex |= (1<<IS_START_LOWER) if (sStart[0..1] == "0x")
    isHex |= (1<<IS_END_UPPER)   if (sEnd[0..1] == "0X")
    isHex |= (1<<IS_END_LOWER)   if (sEnd[0..1] == "0x")

    if (isHex[IS_START_UPPER] == 1 || isHex[IS_START_LOWER] == 1)
      nStart = eval(sStart)
    else
      nStart = sStart.to_i
    end
    if (isHex[IS_END_UPPER] == 1 || isHex[IS_END_LOWER] == 1)
      nEnd = eval(sEnd)
    else
      nEnd = sEnd.to_i
    end

    # increment/decrement
    nStep = nStart < nEnd ? 1 : -1
    nLen  = nStart < nEnd ? $2.length : $3.length

    nStart.step(nEnd, nStep){ |i|
      sAligned = aligndigit(to_hs(i, isHex), isHex != 0 ? nLen - 2 : nLen)
      expand(substbackref(sPre + sAligned + sSuf, sAligned, isHex))
    }
  else
    puts(sFoo)
  end
end

####### MAIN
ARGF.each_line{ |line| expand(line) }

# vim: expandtab ts=2 sw=2

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2010/08/01(日) 01:48:14|
  2. フリーソフト
  3. | トラックバック:0
  4. | コメント:0
<<初物 | ホーム | 連番展開スクリプト(ruby版ver.2.1)>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://nocd5.blog59.fc2.com/tb.php/423-fd1a271f
この記事にトラックバックする(FC2ブログユーザー)
home

プロフィール

Author:nocd5
30歳(男)
会社員

Last.fm



最近の記事

カテゴリー

カレンダー

07 | 2017/08 | 09
Sun Mon Tue Wed Thu Fri Sat
- - 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 - -

最近のコメント

最近のトラックバック

ブロとも申請フォーム

この人とブロともになる

ブログ内検索

Amazonアソシエイト

RSSフィード

リンク

このブログをリンクに追加する

FC2ブログランキング

FC2Blog Ranking

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。