#!/usr/local/bin/gawk -f # determine file type and output information in plain2html.awk format # $Id: magic.awk,v 1.4 1999/12/22 10:55:47 aonuma Exp aonuma $ # $Log: magic.awk,v $ # Revision 1.4 1999/12/22 10:55:47 aonuma # Added NOHEADER, HEADERONLY, FOOTERONLY (for xargs) # # If resource is temporarily unavailable, try `unlimit'. BEGIN { CURRENTFILE="unknownmagic.xxx" READLINES=10 IGNORECASE=1 MONTHS="00JanFebMarAprMayJunJulAugSepOctNovDec" # TOP # NOHEADER # HEADERONLY # FOOTERONLY if (FOOTERONLY) NOHEADER=1 #LIST or TABLE TABLE=1 # default is TABLE if (LIST) TABLE=0 # set LIST=non-zero to output list format. if (!NOHEADER) { print ".LANG en" print ".TI directory listing" if (TABLE) { print ".TTAG 1" print ".TS ///" print "#name /// file type and description ///>size /// YYYY/MM/DD" if (!TOP) print "../ /// UP /// . /// ." } } if (HEADERONLY || FOOTERONLY) exit } END { if (!SKIP && CURRENTFILE!="unknownmagic.xxx") { if (TABLE) PrintOutTable() else PrintOutList() } if (!HEADERONLY && (!NOHEADER || FOOTERONLY) ) PrintFooter() } (FILENAME != CURRENTFILE) { if (!SKIP && CURRENTFILE!="unknownmagic.xxx") { if (TABLE) PrintOutTable() else PrintOutList() } CLINE=1 SKIP=0 FRCS="" CURRENTFILE=BASE=FILENAME if (FILENAME ~ /~$/) SKIP=1 else { "ls -LTl "FILENAME | getline tmp split(tmp, FINFO) # 1 2 3 4 5 6 7 8 9 10 # -rwxr-xr-x 1 aonuma zoo 4424 Nov 21 22:29:23 1999 magic.awk FSIZE=FINFO[5] if (FSIZE<1024) FSIZE=sprintf("%i bytes", FSIZE) else { FSIZE=FSIZE/1024 if (FSIZE<1024) FSIZE=sprintf("%i Kbytes", FSIZE) else { FSIZE=FSIZE/1024 FSIZE=sprintf("%i Mbytes", FSIZE) } } FDATE=sprintf("%04i/%02i/%02i", FINFO[9], index(MONTHS, FINFO[6])/3, FINFO[7]) } while (index(BASE, "/")) BASE=substr(BASE, index(BASE, "/")+1) EXT=BASE while (index(EXT, ".")) EXT=substr(EXT, index(EXT, ".")+1) } ($0 && CLINE<=READLINES && !SKIP) { LINE[CLINE++]=$0 } ($0 ~ /\$Id: / && !SKIP) { n=split(substr($0, index($0, "$Id: ")), RCS) # if (RCS[4]) FDATE=RCS[4] if (n>6 && RCS[3]) FRCS=RCS[3] } (CLINE==READLINES && !SKIP) {# Analyze file type TYPE=DESC="" if (EXT=="Makefile") TypeMakefile() if (EXT ~ /,v$/ ) TypeRcs() if (EXT=="nn") TypeNn() if (EXT=="tex") TypeTex() if (EXT=="html" || EXT=="htm") TypeHtml() if (LINE[1] ~ /^%!/ && LINE[1] ~ "PS-Adobe") TypeFile() if (LINE[2] ~ /^#/) TypeFile() if (!TYPE) TypeASCII() if (!TYPE) TypeFile() sub("^[ \t]+", "", DESC) sub("[ \t]+$", "", DESC) CLINE++ } function PrintOutList(){ printf("@%s", CURRENTFILE, CURRENTFILE) TYPE=TYPE" "DESC if (FRCS) TYPE=sprintf("%s (RCS rev. %s)", TYPE, FRCS) printf("
     %50s%10s, %10s
\n", TYPE, FSIZE, FDATE) DESC=TYPE="" } function PrintOutTable(){ printf("%s///", CURRENTFILE, CURRENTFILE) printf("%s, %s", TYPE, DESC) if (FRCS) printf(" (RCS rev. %s)", FRCS) printf("///%s///%s", FSIZE, FDATE) printf "\n" DESC=TYPE="" } function Type(type){ TYPE=type } function TypeMakefile(){ TYPE="Makefile text" if (LINE[1] ~ /^#/) DESC=substr(LINE[1], 2) } function TypeHtml(){ TYPE="html document" i=1 while (LINE[i] !~ "" && i<= READLINES) i++ j=i while (LINE[j] !~ "" && j<= READLINES) j++ if (i==j) DESC=LINE[i] else for (n=i; n<=j; n++) DESC=sprintf("%s %s", DESC, LINE[n]) sub("]*>", "", DESC) sub("", "", DESC) if (CURRENTFILE ~ "guide." && DESC ~ /^\[SA\] /) DESC=DESC", index of this directory" i=1 while (LINE[i] !~ "%s", i, i) } function TypePs(){ TYPE="postscript" i=1 while (LINE[i] !~ /^%%Title: / && i<= READLINES) i++ DESC=substr(LINE[i], 10) } function TypeTex(){ if (EXT=="tex") { TYPE="plain TeX" i=1 while (LINE[i] !~ "\\document" && i<= READLINES) i++ if (LINE[i] ~ "\\documentstyle") TYPE="LaTeX209" if (LINE[i] ~ "\\documentclass") TYPE="LaTeX" while (LINE[i] !~ "\\title" && i<= READLINES) i++ DESC=LINE[i] return } TYPE="TeX" } function TypeASCII() { MUL=PLN=TAB=TXT=TEX=TITLE=0 if (EXT=="txt") {MUL+=2; PLN+=2; TAB+=2; TXT+=2} if (LINE[1] ~ "[a-z][a-z]/[a-z][a-z]") {MUL+=2; TXT++} if (LINE[1] ~ /^\.TI/) {PLN+=2; TXT++; TITLE=substr(LINE[1], 4)} if (LINE[1] ~ /^#/) {TAB+=1; TXT++} if (MUL && LINE[2] ~ /\.TI/) {MUL+=2; TXT++; TITLE=substr(LINE[2], 4)} # print MUL, PLN, TAB, TXT gsub("^[ \t]+", "", TITLE) for (i in LINE) { if (LINE[i] ~ /^[a-z][a-z][\>]/) {MUL++; TXT++} if (LINE[i] ~ /^\.[A-Z][A-Z]/) {MUL++; PLN++; TXT++} if (LINE[i] ~ /[;/]/) {TAB++; TXT++;} if (LINE[i] ~ /[\{\}\\]/) {TEX++; TXT++;} } # print MUL, PLN, TAB, TXT if (TAB>=CLINE && MUL+PLNPLN) { TYPE="plain txt" DESC="multilingual source file for html" if (TITLE) DESC=sprintf("%s (%s)", DESC, TITLE) return } if (PLN>CLINE/2) { TYPE="plain txt" DESC="source file for html" if (TITLE) DESC=sprintf("%s (%s)", DESC, TITLE) return } if (TEX>CLINE/2) { TYPE="TeX" DESC="" return } } function TypeFile(){ "file -L "FILENAME | getline TYPE TYPE=substr(TYPE, index(TYPE, ":")+2) if (LINE[2] ~ /^#/) DESC=substr(LINE[2], 2) } function PrintFooter() { printf("Generated by magic.awk on %s\n", strftime("%Y-%m-%dT%T+0900")) }