--- sort.c	2009-05-04 01:08:15.000000000 -0400
+++ new-sort.c	2009-07-16 16:44:55.000000000 -0400
@@ -174,6 +174,7 @@
 				   strings of digits with optional decimal
 				   point, but no exponential notation. */
   bool random;			/* Sort by random hash of key.  */
+  bool bylength;		/* Sort by length of key string.  */
   bool general_numeric;		/* Flag for general, numeric comparison.
 				   Handle numbers in exponential notation. */
   bool month;			/* Flag for comparison by month name. */
@@ -264,6 +265,9 @@
    they were read if all keys compare equal.  */
 static bool stable;
 
+/* Flag to sort by length of string (B comes before AA) */
+static bool bylength;
+
 /* If TAB has this value, blanks separate fields.  */
 enum { TAB_DEFAULT = CHAR_MAX + 1 };
 
@@ -334,6 +338,7 @@
       fputs (_("\
   -g, --general-numeric-sort  compare according to general numerical value\n\
   -i, --ignore-nonprinting    consider only printable characters\n\
+  -l, --length-sort           compare strings by length (A, B, C...AA, AB)\n\
   -M, --month-sort            compare (unknown) < `JAN' < ... < `DEC'\n\
 "), stdout);
       fputs (_("\
@@ -426,7 +431,7 @@
   SORT_OPTION
 };
 
-static char const short_options[] = "-bcCdfgik:mMno:rRsS:t:T:uVy:z";
+static char const short_options[] = "-bcCdfgik:lmMno:rRsS:t:T:uVy:z";
 
 static struct option const long_options[] =
 {
@@ -439,6 +444,7 @@
   {"general-numeric-sort", no_argument, NULL, 'g'},
   {"ignore-nonprinting", no_argument, NULL, 'i'},
   {"key", required_argument, NULL, 'k'},
+  {"length-sort", no_argument, NULL, 'l'},
   {"merge", no_argument, NULL, 'm'},
   {"month-sort", no_argument, NULL, 'M'},
   {"numeric-sort", no_argument, NULL, 'n'},
@@ -1917,6 +1923,10 @@
 
       if (key->random)
 	diff = compare_random (texta, lena, textb, lenb);
+      else if (key->bylength)
+        diff = (lena < lenb ? -1
+	  : lena > lenb ? 1
+	  : 0);
       else if (key->numeric | key->general_numeric)
 	{
 	  char savea = *lima, saveb = *limb;
@@ -2888,7 +2898,7 @@
   struct keyfield const *key;
 
   for (key = keylist; key; key = key->next)
-    if ((1 < (key->random + key->numeric + key->general_numeric + key->month
+    if ((1 < (key->random + key->numeric + key->general_numeric + key->bylength + key->month
 	      + key->version + !!key->ignore))
 	|| (key->random && key->translate))
       {
@@ -2903,6 +2913,8 @@
 	  *p++ = 'g';
 	if (key->ignore == nonprinting)
 	  *p++ = 'i';
+	if (key->bylength)
+	  *p++ = 'l';
 	if (key->month)
 	  *p++ = 'M';
 	if (key->numeric)
@@ -2998,6 +3010,9 @@
 	  if (! key->ignore)
 	    key->ignore = nonprinting;
 	  break;
+	case 'l':
+	  key->bylength = true;
+	  break;
 	case 'M':
 	  key->month = true;
 	  break;
@@ -3140,7 +3155,7 @@
   gkey.sword = gkey.eword = SIZE_MAX;
   gkey.ignore = NULL;
   gkey.translate = NULL;
-  gkey.numeric = gkey.general_numeric = gkey.random = gkey.version = false;
+  gkey.numeric = gkey.general_numeric = gkey.random = gkey.version = gkey.bylength = false;
   gkey.month = gkey.reverse = false;
   gkey.skipsblanks = gkey.skipeblanks = false;
 
@@ -3220,6 +3235,7 @@
 	case 'f':
 	case 'g':
 	case 'i':
+	case 'l':
 	case 'M':
 	case 'n':
 	case 'r':
@@ -3467,6 +3483,7 @@
 	     || (key->skipsblanks
 		 | key->reverse
 		 | key->skipeblanks
+		 | key->bylength
 		 | key->month
 		 | key->numeric
 		 | key->version
@@ -3477,6 +3494,7 @@
           key->translate = gkey.translate;
           key->skipsblanks = gkey.skipsblanks;
           key->skipeblanks = gkey.skipeblanks;
+          key->bylength = gkey.bylength;
           key->month = gkey.month;
           key->numeric = gkey.numeric;
           key->general_numeric = gkey.general_numeric;
@@ -3492,6 +3510,7 @@
 		   || gkey.translate
 		   || (gkey.skipsblanks
 		       | gkey.skipeblanks
+		       | gkey.bylength
 		       | gkey.month
 		       | gkey.numeric
 		       | gkey.general_numeric
