mirror of
				https://sourceware.org/git/glibc.git
				synced 2025-10-26 00:57:39 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			90 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Awk
		
	
	
	
	
	
			
		
		
	
	
			90 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Awk
		
	
	
	
	
	
| # Script to preprocess Versions.all lists based on "earliest version"
 | |
| # specifications in the shlib-versions file.
 | |
| 
 | |
| # Return -1, 0 or 1 according to whether v1 is less than, equal to or
 | |
| # greater than v2 as a version string. Simplified from GNU Autoconf
 | |
| # version; this one does not need to handle .0x fraction-style versions.
 | |
| function vers_compare (v1, v2)
 | |
| {
 | |
|   while (length(v1) && length(v2)) {
 | |
|     if (v1 ~ /^[0-9]/ && v2 ~ /^[0-9]/) {
 | |
|       for (len1 = 1; substr(v1, len1 + 1) ~ /^[0-9]/; len1++) continue;
 | |
|       for (len2 = 1; substr(v2, len2 + 1) ~ /^[0-9]/; len2++) continue;
 | |
|       d1 = substr(v1, 1, len1); v1 = substr(v1, len1 + 1);
 | |
|       d2 = substr(v2, 1, len2); v2 = substr(v2, len2 + 1);
 | |
|       d1 += 0;
 | |
|       d2 += 0;
 | |
|     } else {
 | |
|       d1 = substr(v1, 1, 1); v1 = substr(v1, 2);
 | |
|       d2 = substr(v2, 1, 1); v2 = substr(v2, 2);
 | |
|     }
 | |
|     if (d1 < d2) return -1;
 | |
|     if (d1 > d2) return 1;
 | |
|   }
 | |
|   if (length(v2)) return -1;
 | |
|   if (length(v1)) return 1;
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| NF > 2 && $2 == ":" {
 | |
|   for (i = 0; i <= NF - 3; ++i)
 | |
|     firstversion[$1, i] = $(3 + i);
 | |
|   idx[$1] = 0;
 | |
|   next;
 | |
| }
 | |
| 
 | |
| NF == 2 && $2 == "{" { thislib = $1; print; next }
 | |
| 
 | |
| $1 == "}" {
 | |
|   if ((thislib, idx[thislib]) in firstversion) {
 | |
|     # We haven't seen the stated version, but have produced
 | |
|     # others pointing to it, so we synthesize it now.
 | |
|     printf "  %s\n", firstversion[thislib, idx[thislib]];
 | |
|     idx[thislib]++;
 | |
|   }
 | |
|   print;
 | |
|   next;
 | |
| }
 | |
| 
 | |
| /GLIBC_PRIVATE/ { print; next }
 | |
| 
 | |
| {
 | |
|   if ((thislib, idx[thislib]) in firstversion) {
 | |
|     f = v = firstversion[thislib, idx[thislib]];
 | |
|     while (vers_compare($1, v) >= 0) {
 | |
|       delete firstversion[thislib, idx[thislib]];
 | |
|       idx[thislib]++;
 | |
|       if ((thislib, idx[thislib]) in firstversion) {
 | |
|         # If we're skipping a referenced version to jump ahead to a
 | |
|         # later version, synthesize the earlier referenced version now.
 | |
|         if (v != $1 && (thislib, v) in usedversion)
 | |
|           print "  " v;
 | |
|         v = firstversion[thislib, idx[thislib]];
 | |
|       } else
 | |
|         break;
 | |
|     }
 | |
|     if ($1 == v || $1 == f)
 | |
|       # This version was the specified earliest version itself.
 | |
|       print;
 | |
|     else if (vers_compare($1, v) < 0) {
 | |
|       # This version is older than the specified earliest version.
 | |
|       print "  " $1, "=", v;
 | |
|       # Record that V has been referred to, so we will be sure to emit it
 | |
|       # if we hit a later one without hitting V itself.
 | |
|       usedversion[thislib, v] = 1;
 | |
|     }
 | |
|     else {
 | |
|       # This version is newer than the specified earliest version.
 | |
|       # We haven't seen that version itself or else we wouldn't be here
 | |
|       # because we would have removed it from the firstversion array.
 | |
|       # If there were any earlier versions that used that one, emit it now.
 | |
|       if ((thislib, v) in usedversion) {
 | |
|         print "  " v;
 | |
|       }
 | |
|       print "  " $1;
 | |
|     }
 | |
|   }
 | |
|   else
 | |
|     print;
 | |
| }
 |