Человеко-читабельный размер файла на M4
Как вывести размер файла в понятном для человека виде?
define(`m4_filesize_human',`ifelse(m4_is_int10(`$1'),m4_false,`m4_error(`Invalid filesize `$1'')',
eval(m4_len(`$1')<= 3), m4_true, `$1 m4_default(`$3',`b')',
eval(m4_len(`$1')<= 6), m4_true,`m4_trim_float(m4_calc(`$1'/1024), m4_default(`$2',3)) m4_default(`$4',`Kb')',
eval(m4_len(`$1')<= 9), m4_true,`m4_trim_float(m4_calc(`$1'/1024**2),m4_default(`$2',3)) m4_default(`$5',`Mb')',
eval(m4_len(`$1')<=12), m4_true,`m4_trim_float(m4_calc(`$1'/1024**3),m4_default(`$2',3)) m4_default(`$6',`Gb')',
eval(m4_len(`$1')<=15), m4_true,`m4_trim_float(m4_calc(`$1'/1024**4),m4_default(`$2',3)) m4_default(`$7',`Tb')',
eval(m4_len(`$1')<=18), m4_true,`m4_trim_float(m4_calc(`$1'/1024**5),m4_default(`$2',3)) m4_default(`$8',`Pb')',
`m4_error(`Too big file size $1')'
)')
define(`m4_error', `errprint(m4_crlf`'__file__ line __line__ : `$1'm4_crlf)m4exit(1)')
define(`m4_trim_float', `regexp(`$1',`^\([+-]?[0-9]*\)\(\.?[0-9]*\)',`\1substr(\2,0,eval(`$2'+1))')')
define(`m4_len', defn(`len')) undefine(`len')
define(`m4_false', 0)
define(`m4_true', eval(!m4_false))
define(`m4_ifval', `ifelse(`$1',`',`$3',`$2')')
define(`m4_default', `m4_ifval(`$1',`$1',`$2')')
define(`m4_is_int10', `eval(regexp(`$1',`^\s*[-+]*[0-9]+\s*$')==0)')
define(`m4_is_int16', `eval(regexp(`$1',`^\s*0[xX][0-9A-F]+\s*$')==0)')
define(`m4_is_int', `eval(m4_is_int10(`$1') || m4_is_int16(`$1'))')
Вызывается как-то так:
m4_filesize_human(99999,3,bytes,kilobytes,megab,g,tera,penta)
Вариант для Lua: Байты, килобайты и терабайты
