|
SortParagraph |
Pipelines v2.0 |
/* Example by TenFiftyTwo(c). */ |
/* arg 1. The number of the paragraph to sort. arg 2. The sort type (a)scending or (d)escending. The pipeline reads its input and selects the specified paragraph and sorts it, writing the result back to its caller. Note. that if any input record contains the hexadecimal characters x'fc' through x'ff'; you will need to substitute the character for another character not present in the record. */ Address Rxpipe Parse Arg pnumber type pipe (endchar ?), in, /* Input. */ | literal xfdfe, /* Ensure paragraph is marked. */ | strip, /* Trim off whitespace. */ | a: locate, /* Route out blank records. */ , /* Concatenate groups of records that make up a paragraph. */ , | specs xfc 1 1-* n, /* Insert start of line flag. */ | split after str xfc, /* Split into individual records. */ | b: faninany, /* Feed blank records back into pipeline. */ | join until str xfc, /* Join records in current paragraph. */ | c: nlocate xfd, /* Go and mark start of paragraph. */ | d: faninany, /* Feed paragraph marker back into pipeline. */ | split before str xfd, /* Separate records back into paragraph format. */ , /* Select the paragraph that we want to sort. , | e: fromlab pat /Para#pnumber1*/, /* Select records between the start of the.. */ | f: tolabel pat xfd2a, /* ..paragraph and the start of the next. */ | sort anycase type , /* Sort the paragraph. */ | nlocate /Para#/, /* Discard the paragraph marker. */ | specs recno 1 1-* nw, /* Insert leading record number. */ | g: fanin 1 0 2, /* Merge all the streams. */ | nlocate /Para#/, /* Discard all paragraph markers. */ | nlocate xfdfe, /* Discard start of file marker. */ | change xfd //, /* Discard blank record marker. */ | out, /* Output. */ ?, a:, | specs xfd 1, /* Indicate blank records with a marker. */ | b:, ?, c:, | specs 1-* 1 write, /* Mark the start of a paragraph. */ /Para#/ n, recno strip n, | d:, ?, e:, | elastic, /* Handle records that come before start.. */ | g:, /* ..of a paragraph. */ ?, f:, | elastic, /* Handle records that come after the end of.. */ | g: /* ..a paragraph. */ Exit 0