linux-merge-config.awk

来自「lustre 1.6.5 source code」· AWK 代码 · 共 318 行

AWK
318
字号
#!/bin/awk -fBEGIN {	nsects = 0}{	ARCH = $1	ARCHES[ARCH] = 1	TYPE = $2	TYPES[TYPE] = 1	NTOTAL++	ARCHTYPES[ARCH ":" TYPE] = 1	NARCHES[TYPE]++	if (NARCHES[TYPE] == 1)	    NTOTALTYPES++	NTYPES[ARCH]++	if (NTYPES[ARCH] == 1)	    NTOTALARCHES++	FILE = $3	cursects = nsects	while ((getline < FILE) > 0) {		if ($0 ~ /^\/\*/ || $0 ~ /^ \*\// || $0 ~ /^[ 	]*$/)			continue		if ($0 ~ /^ * /) {			SECTION = gensub(/^ \* /,"",$0)			if (!(SECTION in sectno)) {				sectno[SECTION] = nsects				counts[SECTION] = 0				nsects++			} else if (cursects && cursects != nsects) {				no = sectno[SECTION]				diff = nsects - cursects				for (s in sectno) {					if (sectno[s] >= cursects)						sectno[s] = sectno[s] - cursects + no					else if (sectno[s] >= no)						sectno[s] += diff				}			}			cursects = nsect			cursym[SECTION] = counts[SECTION]			continue		}		if ($1 != "#define" && $1 != "#undef")			exit 1		SYMBOL = $2		n = index($0,SYMBOL)+length(SYMBOL)		if ($1 == "#define") {			n = index($0,SYMBOL)+length(SYMBOL)			VALUE = gensub(/^[ 	]*/,"","",substr($0,n))			if (VALUE == "") VALUE = "__novalue__"		} else			VALUE = "__undefined__"		if (values[SYMBOL]) {			if (present[SYMBOL,ARCH,TYPE]) continue			present[SYMBOL,ARCH,TYPE] = 1			values[SYMBOL] = values[SYMBOL] SUBSEP ARCH ":" TYPE ":" VALUE			if (SECTION == sections[SYMBOL] && cursym[SECTION] && cursym[SECTION] != counts[SECTION]) {				no = pos[SYMBOL]				diff = counts[SECTION]-cursym[SECTION]				for (s in pos)					if (sections[s] == SECTION) {						if (pos[s] >= cursym[SECTION])							pos[s] = pos[s] - cursym[SECTION] + no						else if (pos[s] >= no)							pos[s] += diff					}				cursym[SECTION] = counts[SECTION]			}		} else {			present[SYMBOL,ARCH,TYPE] = 1			values[SYMBOL] = ARCH ":" TYPE ":" VALUE			sections[SYMBOL] = SECTION			pos[SYMBOL] = counts[SECTION]			counts[SECTION]++		}	}	close(FILE)}END {	for (SECTION in sectno)		x[sectno[SECTION]] = SECTION	for (i = 0; i < nsects; i++) {		SECTION = x[i]		if (i > 0)			printf "\n"		printf "/*\n * %s\n */\n", SECTION		split("",lines)		lastelse = ""		for (SYMBOL in sections)			if (sections[SYMBOL] == SECTION)				y[pos[SYMBOL]] = SYMBOL		for (j = 0; j < counts[SECTION]; j++) {			SYMBOL = y[j]			split("",ntype)			split("",total)			split(values[SYMBOL],z,SUBSEP)			split("",val)			totalsum = 0			for (k in z) {				split(z[k],l,":")				ARCH = l[1]				TYPE = l[2]				VALUE = substr(z[k],length(ARCH)+length(TYPE)+3)				if (val[VALUE])					val[VALUE] = val[VALUE] " "				val[VALUE] = val[VALUE] ARCH ":" TYPE				ntype[VALUE,TYPE] += 1				total[VALUE] += 1				totalsum += 1			}			split("",curlines)			append = 1			for (VALUE in val) {			    if (total[VALUE] == NTOTAL) {				if (VALUE == "__undefined__")				    curlines["1"] = "#undef  " SYMBOL "\n"				else if (VALUE == "__novalue__")				    curlines["1"] = "#define " SYMBOL "\n"				else				    curlines["1"] = "#define " SYMBOL " " VALUE "\n"				if (!lines["1"])				    append = 0				break			    }			    shorteststr = ""			    curcount = 0			    for (m = 0; m < 4; m++) {				str = ""				split(val[VALUE],yy)				if (total[VALUE] > 1 && total[VALUE] == NTOTAL - 1) {				    found = 0				    for (arch in ARCHES) {					for (type in TYPES) {					    archtype = arch ":" type					    if (ARCHTYPES [archtype] == 1) {						for (n in yy)						    if (yy[n] == archtype)							break						if (yy[n] != archtype) {						    found = 1						    break						}					    }					}					if (found)					    break				    }				    if (NARCHES[type] > 1 && NTYPES[arch] > 1) {					str = "!defined(__module__" arch "_" type ")"					shorteststr = str					break				    }				}				if (m == 0 || m == 2) {				    nfull = 0				    split("",yysave)				    for (type in TYPES)					if (ntype[VALUE,type] == NARCHES[type]) {					    if (str) str = str " || "					    str = str "defined(__module__" type ")"					    for (k in yy) {						split(yy[k], z, ":")						if (z[2] == type) {						    yysave[k] = yy[k]						    delete yy[k]						}					    }					    nfull++					} else					    NOTYPE = type				    if (m < 2 && nfull > 1 && nfull == NTOTALTYPES - 1) {					str = "!defined(__module__" NOTYPE ")"					for (k in yysave)					    yy[k] = yysave[k]					for (k in yy) {					    split(yy[k], z, ":")					    if (z[2] != NOTYPE)						delete yy[k]					}				    }				}				savestr = str				nfull = 0				split("",yysave)				for (arch in ARCHES) {				    narch = 0				    for (k in yy) {					split(yy[k], z, ":")					if (z[1] == arch)					    narch++				    }				    if (narch == NTYPES[arch]) {					if (str) str = str " || "					str = str "defined(__module__" arch ")"					for (k in yy) {					    split(yy[k], z, ":")					    if (z[1] == arch) {						yysave[k] = yy[k]						delete yy[k]					    }					}					nfull++				    } else					NOARCH = arch				}				if (m < 2 && nfull > 1 && nfull == NTOTALARCHES - 1) {				    str = savestr				    for (k in yysave)					yy[k] = yysave[k]				    if (str) str = str " || "				    str = str "!defined(__module__" NOARCH ")"				    for (k in yy) {					split(yy[k], z, ":")					if (z[1] != NOARCH)					    delete yy[k]				    }				}				if (m == 1 || m == 3) {				    savestr = str				    nfull = 0				    split("",yysave)				    for (type in TYPES) {					ntypex = 0					for (k in yy) {					    split(yy[k], z, ":")					    if (z[2] == type)						ntypex++					}					if (ntypex == NARCHES[type]) {					    if (str) str = str " || "					    str = str "defined(__module__" type ")"					    for (k in yy) {						split(yy[k], z, ":")						if (z[2] == type) {						    yysave[k] = yy[k]						    delete yy[k]						}					    }					    nfull++					} else					    NOTYPE = type				    }				    if (m < 2 && nfull > 1 && nfull == NTOTALTYPES - 1) {					str = savestr				 	for (k in yysave)					    yy[k] = yysave[k]					if (str) str = str " || "					str = "!defined(__module__" NOTYPE ")"					for (k in yy) {					    split(yy[k], z, ":")					    if (z[2] != NOTYPE)						delete yy[k]					}				    }				}				for (k in yy) {				    split(yy[k], z, ":")				    if (str) str = str " || "				    str = str "defined(__module__" z[1] "_" z[2] ")"				}				if (m == 0 || length(str) < length(shorteststr))				    shorteststr = str			    }			    str = shorteststr			    if (VALUE == "__undefined__")				curlines[str] = "#undef  " SYMBOL "\n"			    else if (VALUE == "__novalue__")				curlines[str] = "#define " SYMBOL "\n"			    else				curlines[str] = "#define " SYMBOL " " VALUE "\n"			    if (!lines[str])				append = 0			}			if (append) {			    for (str in curlines)				if (curlines[str])				    lines[str] = lines[str] curlines[str]			} else {			    if (lines["1"])				printf "%s", lines["1"]			    else if (j > 0) {				ifstr = "#if "				for (str in lines)				    if (lines[str] && str != lastelse) {					printf "%s %s\n%s", ifstr, str, lines[str]					ifstr = "#elif "				    }				if (lastelse != "")				    printf "#else\n%s", lines[lastelse]				printf "#endif\n"			    }			    split("",lines)			    lastelse = ""			    for (str in curlines)				if (curlines[str]) {				    lines[str] = curlines[str]				    if (totalsum == NTOTAL && length(str) > length(lastelse)) {					lastelse = str				    }				}			}		}		if (lines["1"])		    printf "%s", lines["1"]		else if (j > 0) {		    ifstr = "#if "		    for (str in lines)			if (lines[str] && str != lastelse) {			    printf "%s %s\n%s", ifstr, str, lines[str]			    ifstr = "#elif "			}		    if (lastelse != "")			printf "#else\n%s", lines[lastelse]		    printf "#endif\n"		}	}}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?