https://git.reactos.org/?p=reactos.git;a=commitdiff;h=b552901df59fee398990bc...
commit b552901df59fee398990bc329c93397e7c501c7e Author: Katayama Hirofumi MZ katayama.hirofumi.mz@gmail.com AuthorDate: Wed Jun 9 23:30:30 2021 +0900 Commit: GitHub noreply@github.com CommitDate: Wed Jun 9 23:30:30 2021 +0900
[MORE][CONUTILS] Implement missing features of the MORE command (#3658)
Implement missing features of the MORE command. Special thanks to @HBelusca. CORE-4019 --- base/applications/cmdutils/more/lang/bg-BG.rc | 33 +- base/applications/cmdutils/more/lang/ca-ES.rc | 33 +- base/applications/cmdutils/more/lang/cs-CZ.rc | 34 +- base/applications/cmdutils/more/lang/de-DE.rc | 34 +- base/applications/cmdutils/more/lang/el-GR.rc | 33 +- base/applications/cmdutils/more/lang/en-US.rc | 33 +- base/applications/cmdutils/more/lang/es-ES.rc | 33 +- base/applications/cmdutils/more/lang/et-EE.rc | 33 +- base/applications/cmdutils/more/lang/fr-FR.rc | 33 +- base/applications/cmdutils/more/lang/it-IT.rc | 33 +- base/applications/cmdutils/more/lang/lt-LT.rc | 36 +- base/applications/cmdutils/more/lang/no-NO.rc | 33 +- base/applications/cmdutils/more/lang/pl-PL.rc | 33 +- base/applications/cmdutils/more/lang/ro-RO.rc | 34 +- base/applications/cmdutils/more/lang/ru-RU.rc | 33 +- base/applications/cmdutils/more/lang/sk-SK.rc | 34 +- base/applications/cmdutils/more/lang/sq-AL.rc | 33 +- base/applications/cmdutils/more/lang/sv-SE.rc | 33 +- base/applications/cmdutils/more/lang/tr-TR.rc | 33 +- base/applications/cmdutils/more/lang/uk-UA.rc | 34 +- base/applications/cmdutils/more/lang/zh-CN.rc | 33 +- base/applications/cmdutils/more/lang/zh-TW.rc | 33 +- base/applications/cmdutils/more/more.c | 556 +++++++++++++++++++++++--- base/applications/cmdutils/more/resource.h | 4 + sdk/lib/conutils/pager.c | 335 +++++++++++++--- sdk/lib/conutils/pager.h | 47 ++- 26 files changed, 1416 insertions(+), 260 deletions(-)
diff --git a/base/applications/cmdutils/more/lang/bg-BG.rc b/base/applications/cmdutils/more/lang/bg-BG.rc index 8b05eba611e..28a942377cd 100644 --- a/base/applications/cmdutils/more/lang/bg-BG.rc +++ b/base/applications/cmdutils/more/lang/bg-BG.rc @@ -3,13 +3,34 @@ LANGUAGE LANG_BULGARIAN, SUBLANG_DEFAULT STRINGTABLE BEGIN IDS_USAGE "Показва данните на екрана, разделени на страници.\n\n\ - MORE < [Устройство:][Път]Файлово име\n\ - Команда | MORE\n\ - MORE [Устройство:][Път]Файлово име\n\n\ - [Устройство:][Път]Файлово име Файл, чието съдържание да бъде показано.\n\ - Команда\t\t Команда, чийто изход да бъде показан.\n\n\ - При въпроса ""-- Продължаване --"" натиснете произволен клавиш, за показаване на следващата страница.\n" + MORE [options] < [Drive:][Path]Filename\n\ + Command | MORE [options]\n\ + MORE [options] [Drive:][Path]Filename\n\n\ +Options:\n\ + /E Enable extended features.\n\ + /C Clear screen before displaying page.\n\ + /P Expand form-feed characters.\n\ + /S Shrink multiple blank lines to a single line.\n\ + /Tn Expand tabs to n spaces (default: 8).\n\ + +n Start displaying the first file at line n.\n\n\ + [Drive:][Path]Filename A file, whose content shall be displayed.\n\ + Command A command, whose output shall be displayed.\n\n\ +If extended features are enabled, the following commands are available\n\ +at ""-- Continue --"" prompt:\n\ + P n Display n lines.\n\ + S n Skip n lines.\n\ + F Display next file.\n\ + Q Quit.\n\ + ? Show help line.\n\ + = Show line number.\n\ + <Space> Display next page.\n\ + <Enter> Display next line.\n" + IDS_CONTINUE "-- Продължаване --" IDS_CONTINUE_PROGRESS "-- Продължаване (%d%%) --" IDS_FILE_ACCESS "Няма достъп до файл %s.\n" + IDS_BAD_FLAG "Invalid argument - '%ls'\n" + IDS_CONTINUE_OPTIONS "-- Continue (%d%%) [Options: psfq=<Space><Enter>] --" + IDS_CONTINUE_LINES "-- Continue (%d%%) -- Lines: " + IDS_CONTINUE_LINE_AT "-- Continue (%d%%) [Line:%d] --" END diff --git a/base/applications/cmdutils/more/lang/ca-ES.rc b/base/applications/cmdutils/more/lang/ca-ES.rc index 9c10620ed72..8762861dc4d 100644 --- a/base/applications/cmdutils/more/lang/ca-ES.rc +++ b/base/applications/cmdutils/more/lang/ca-ES.rc @@ -3,13 +3,34 @@ LANGUAGE LANG_CATALAN, SUBLANG_DEFAULT STRINGTABLE BEGIN IDS_USAGE "Mostra en pantalla el contingut pàgina per pàgina.\n\n\ - MORE < [Unitat:][Ruta]Nom del fitxer\n\ - Instrucció | MORE\n\ - MORE [Unitat:][Ruta]Nom del fitxer\n\n\ - [Unitat:][Ruta]Nom del fitxer Un fitxer, el contingut del qual serà mostrat.\n\ - Instrucció\t\t Una instrucció, el resultat de la qual serà mostrada.\n\n\ - Al visualitzar ""-- Continua --"" heu de premer qualsevol tecla per visualitzar la següent pàgina.\n" + MORE [options] < [Drive:][Path]Filename\n\ + Command | MORE [options]\n\ + MORE [options] [Drive:][Path]Filename\n\n\ +Options:\n\ + /E Enable extended features.\n\ + /C Clear screen before displaying page.\n\ + /P Expand form-feed characters.\n\ + /S Shrink multiple blank lines to a single line.\n\ + /Tn Expand tabs to n spaces (default: 8).\n\ + +n Start displaying the first file at line n.\n\n\ + [Drive:][Path]Filename A file, whose content shall be displayed.\n\ + Command A command, whose output shall be displayed.\n\n\ +If extended features are enabled, the following commands are available\n\ +at ""-- Continue --"" prompt:\n\ + P n Display n lines.\n\ + S n Skip n lines.\n\ + F Display next file.\n\ + Q Quit.\n\ + ? Show help line.\n\ + = Show line number.\n\ + <Space> Display next page.\n\ + <Enter> Display next line.\n" + IDS_CONTINUE "-- Continua --" IDS_CONTINUE_PROGRESS "-- Continua (%d%%) --" IDS_FILE_ACCESS "No puc accedir al fitxer %s.\n" + IDS_BAD_FLAG "Invalid argument - '%ls'\n" + IDS_CONTINUE_OPTIONS "-- Continue (%d%%) [Options: psfq=<Space><Enter>] --" + IDS_CONTINUE_LINES "-- Continue (%d%%) -- Lines: " + IDS_CONTINUE_LINE_AT "-- Continue (%d%%) [Line:%d] --" END diff --git a/base/applications/cmdutils/more/lang/cs-CZ.rc b/base/applications/cmdutils/more/lang/cs-CZ.rc index 3497c3e8e27..3b2780ebc8f 100644 --- a/base/applications/cmdutils/more/lang/cs-CZ.rc +++ b/base/applications/cmdutils/more/lang/cs-CZ.rc @@ -9,14 +9,34 @@ LANGUAGE LANG_CZECH, SUBLANG_DEFAULT STRINGTABLE BEGIN IDS_USAGE "Zobrazí výstup po jednotlivých stránkách na obrazovku.\n\n\ - MORE < [Jednotka:][Cesta]Název souboru\n\ - Příkaz | MORE\n\ - MORE [Jednotka:][Cesta]Název souboru\n\n\ - [Jednotka:][Cesta]Název souboru Soubor, jehož obsah bude zobrazen.\n\ - Příkaz\t\t Příkaz, jehož výstup bude zobrazen.\n\n\ - Při výzvě ""-- Pokračovat --"" lze stisknout libovolnou klávesu\n\ - pro zobrazení další stránky.\n" + MORE [options] < [Drive:][Path]Filename\n\ + Command | MORE [options]\n\ + MORE [options] [Drive:][Path]Filename\n\n\ +Options:\n\ + /E Enable extended features.\n\ + /C Clear screen before displaying page.\n\ + /P Expand form-feed characters.\n\ + /S Shrink multiple blank lines to a single line.\n\ + /Tn Expand tabs to n spaces (default: 8).\n\ + +n Start displaying the first file at line n.\n\n\ + [Drive:][Path]Filename A file, whose content shall be displayed.\n\ + Command A command, whose output shall be displayed.\n\n\ +If extended features are enabled, the following commands are available\n\ +at ""-- Continue --"" prompt:\n\ + P n Display n lines.\n\ + S n Skip n lines.\n\ + F Display next file.\n\ + Q Quit.\n\ + ? Show help line.\n\ + = Show line number.\n\ + <Space> Display next page.\n\ + <Enter> Display next line.\n" + IDS_CONTINUE "-- Pokračovat --" IDS_CONTINUE_PROGRESS "-- Pokračovat (%d%%) --" IDS_FILE_ACCESS "Nelze získat přístup k souboru %s.\n" + IDS_BAD_FLAG "Invalid argument - '%ls'\n" + IDS_CONTINUE_OPTIONS "-- Continue (%d%%) [Options: psfq=<Space><Enter>] --" + IDS_CONTINUE_LINES "-- Continue (%d%%) -- Lines: " + IDS_CONTINUE_LINE_AT "-- Continue (%d%%) [Line:%d] --" END diff --git a/base/applications/cmdutils/more/lang/de-DE.rc b/base/applications/cmdutils/more/lang/de-DE.rc index a73ce1c62ac..db101d924f8 100644 --- a/base/applications/cmdutils/more/lang/de-DE.rc +++ b/base/applications/cmdutils/more/lang/de-DE.rc @@ -3,14 +3,34 @@ LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL STRINGTABLE BEGIN IDS_USAGE "Zeigt Daten seitenweise auf dem Bildschirm an.\n\n\ - MORE < [Laufwerk:][Pfad]Dateiname\n\ - Befehl | MORE\n\ - MORE [Laufwerk:][Pfad]Dateiname\n\n\ - [Laufwerk:][Pfad]Dateiname Eine Datei, deren Inhalt angezeigt werden soll.\n\ - Befehl\t\t Ein Befehl, dessen Ausgabe angezeigt werden soll.\n\n\ - An der Eingabeaufforderung ""-- Fortsetzung --"" kann eine beliebige\n\ - Taste gedrückt werden, um die nächste Seite anzuzeigen.\n" + MORE [options] < [Drive:][Path]Filename\n\ + Command | MORE [options]\n\ + MORE [options] [Drive:][Path]Filename\n\n\ +Options:\n\ + /E Enable extended features.\n\ + /C Clear screen before displaying page.\n\ + /P Expand form-feed characters.\n\ + /S Shrink multiple blank lines to a single line.\n\ + /Tn Expand tabs to n spaces (default: 8).\n\ + +n Start displaying the first file at line n.\n\n\ + [Drive:][Path]Filename A file, whose content shall be displayed.\n\ + Command A command, whose output shall be displayed.\n\n\ +If extended features are enabled, the following commands are available\n\ +at ""-- Continue --"" prompt:\n\ + P n Display n lines.\n\ + S n Skip n lines.\n\ + F Display next file.\n\ + Q Quit.\n\ + ? Show help line.\n\ + = Show line number.\n\ + <Space> Display next page.\n\ + <Enter> Display next line.\n" + IDS_CONTINUE "-- Fortsetzung --" IDS_CONTINUE_PROGRESS "-- Fortsetzung (%d%%) --" IDS_FILE_ACCESS "Auf die Datei %s kann nicht zugegriffen werden.\n" + IDS_BAD_FLAG "Invalid argument - '%ls'\n" + IDS_CONTINUE_OPTIONS "-- Continue (%d%%) [Options: psfq=<Space><Enter>] --" + IDS_CONTINUE_LINES "-- Continue (%d%%) -- Lines: " + IDS_CONTINUE_LINE_AT "-- Continue (%d%%) [Line:%d] --" END diff --git a/base/applications/cmdutils/more/lang/el-GR.rc b/base/applications/cmdutils/more/lang/el-GR.rc index 6997579403b..589fe0cf599 100644 --- a/base/applications/cmdutils/more/lang/el-GR.rc +++ b/base/applications/cmdutils/more/lang/el-GR.rc @@ -3,13 +3,34 @@ LANGUAGE LANG_GREEK, SUBLANG_DEFAULT STRINGTABLE BEGIN IDS_USAGE "Εμφανίζει τα δεδομένα σελίδα-παρά-σελίδα στην οθόνη.\n\n\ - MORE < [Δίσκος:][Μονοπάτι]Όνομα αρχείου\n\ - Εντολή | MORE\n\ - MORE [Δίσκος:][Μονοπάτι]Όνομα αρχείου\n\n\ - [Δίσκος:][Μονοπάτι]Όνομα αρχείου Το αρχείο, τα δεδομένα του οποίου θα εμφανιστούν.\n\ - Εντολή\t\t Η εντολή, της οποίας η έξοδος θα εμφανιστεί.\n\n\ - Στη γραμμή εντολών ""-- Συνέχεια --"" μπορείτε να πατήσετε οποιοδήποτε κουμπί για να δείτε την επόμενη σελίδα.\n" + MORE [options] < [Drive:][Path]Filename\n\ + Command | MORE [options]\n\ + MORE [options] [Drive:][Path]Filename\n\n\ +Options:\n\ + /E Enable extended features.\n\ + /C Clear screen before displaying page.\n\ + /P Expand form-feed characters.\n\ + /S Shrink multiple blank lines to a single line.\n\ + /Tn Expand tabs to n spaces (default: 8).\n\ + +n Start displaying the first file at line n.\n\n\ + [Drive:][Path]Filename A file, whose content shall be displayed.\n\ + Command A command, whose output shall be displayed.\n\n\ +If extended features are enabled, the following commands are available\n\ +at ""-- Continue --"" prompt:\n\ + P n Display n lines.\n\ + S n Skip n lines.\n\ + F Display next file.\n\ + Q Quit.\n\ + ? Show help line.\n\ + = Show line number.\n\ + <Space> Display next page.\n\ + <Enter> Display next line.\n" + IDS_CONTINUE "-- Συνέχεια --" IDS_CONTINUE_PROGRESS "-- Συνέχεια (%d%%) --" IDS_FILE_ACCESS "Δεν ήταν δυνατή η προσπέλαση του αρχείου %s.\n" + IDS_BAD_FLAG "Invalid argument - '%ls'\n" + IDS_CONTINUE_OPTIONS "-- Continue (%d%%) [Options: psfq=<Space><Enter>] --" + IDS_CONTINUE_LINES "-- Continue (%d%%) -- Lines: " + IDS_CONTINUE_LINE_AT "-- Continue (%d%%) [Line:%d] --" END diff --git a/base/applications/cmdutils/more/lang/en-US.rc b/base/applications/cmdutils/more/lang/en-US.rc index 620a67f7428..d6498d48806 100644 --- a/base/applications/cmdutils/more/lang/en-US.rc +++ b/base/applications/cmdutils/more/lang/en-US.rc @@ -3,13 +3,34 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US STRINGTABLE BEGIN IDS_USAGE "Displays data page-by-page on the screen.\n\n\ - MORE < [Drive:][Path]File name\n\ - Command | MORE\n\ - MORE [Drive:][Path]File name\n\n\ - [Drive:][Path]File name A file, whose content shall be displayed.\n\ - Command\t\t A command, whose output shall be displayed.\n\n\ - At the prompt ""-- Continue --"" you can press any key to show the next page.\n" + MORE [options] < [Drive:][Path]Filename\n\ + Command | MORE [options]\n\ + MORE [options] [Drive:][Path]Filename\n\n\ +Options:\n\ + /E Enable extended features.\n\ + /C Clear screen before displaying page.\n\ + /P Expand form-feed characters.\n\ + /S Shrink multiple blank lines to a single line.\n\ + /Tn Expand tabs to n spaces (default: 8).\n\ + +n Start displaying the first file at line n.\n\n\ + [Drive:][Path]Filename A file, whose content shall be displayed.\n\ + Command A command, whose output shall be displayed.\n\n\ +If extended features are enabled, the following commands are available\n\ +at ""-- Continue --"" prompt:\n\ + P n Display n lines.\n\ + S n Skip n lines.\n\ + F Display next file.\n\ + Q Quit.\n\ + ? Show help line.\n\ + = Show line number.\n\ + <Space> Display next page.\n\ + <Enter> Display next line.\n" + IDS_CONTINUE "-- Continue --" IDS_CONTINUE_PROGRESS "-- Continue (%d%%) --" IDS_FILE_ACCESS "Cannot access the file %s.\n" + IDS_BAD_FLAG "Invalid argument - '%ls'\n" + IDS_CONTINUE_OPTIONS "-- Continue (%d%%) [Options: psfq=<Space><Enter>] --" + IDS_CONTINUE_LINES "-- Continue (%d%%) -- Lines: " + IDS_CONTINUE_LINE_AT "-- Continue (%d%%) [Line:%d] --" END diff --git a/base/applications/cmdutils/more/lang/es-ES.rc b/base/applications/cmdutils/more/lang/es-ES.rc index f6224062eab..94e84369b00 100644 --- a/base/applications/cmdutils/more/lang/es-ES.rc +++ b/base/applications/cmdutils/more/lang/es-ES.rc @@ -3,13 +3,34 @@ LANGUAGE LANG_SPANISH, SUBLANG_NEUTRAL STRINGTABLE BEGIN IDS_USAGE "Muestra datos página por página en la pantalla.\n\n\ - MORE < [Unidad:][Ruta]Nombre del archivo\n\ - Comando | MORE\n\ - MORE [Unidad:][Ruta]Nombre del archivo\n\n\ - [Unidad:][Ruta]Nombre del archivo Un archivo, cuyo contenido pueda ser mostrado.\n\ - Comando\t\t Un comando, cuya salida pueda ser mostrada.\n\n\ - Al visualizar ""-- Continuar --"" presione cualquier tecla para mostrar la siguiente página.\n" + MORE [options] < [Drive:][Path]Filename\n\ + Command | MORE [options]\n\ + MORE [options] [Drive:][Path]Filename\n\n\ +Options:\n\ + /E Enable extended features.\n\ + /C Clear screen before displaying page.\n\ + /P Expand form-feed characters.\n\ + /S Shrink multiple blank lines to a single line.\n\ + /Tn Expand tabs to n spaces (default: 8).\n\ + +n Start displaying the first file at line n.\n\n\ + [Drive:][Path]Filename A file, whose content shall be displayed.\n\ + Command A command, whose output shall be displayed.\n\n\ +If extended features are enabled, the following commands are available\n\ +at ""-- Continue --"" prompt:\n\ + P n Display n lines.\n\ + S n Skip n lines.\n\ + F Display next file.\n\ + Q Quit.\n\ + ? Show help line.\n\ + = Show line number.\n\ + <Space> Display next page.\n\ + <Enter> Display next line.\n" + IDS_CONTINUE "-- Continuar --" IDS_CONTINUE_PROGRESS "-- Continuar (%d%%) --" IDS_FILE_ACCESS "No se puede acceder al fichero %s.\n" + IDS_BAD_FLAG "Invalid argument - '%ls'\n" + IDS_CONTINUE_OPTIONS "-- Continue (%d%%) [Options: psfq=<Space><Enter>] --" + IDS_CONTINUE_LINES "-- Continue (%d%%) -- Lines: " + IDS_CONTINUE_LINE_AT "-- Continue (%d%%) [Line:%d] --" END diff --git a/base/applications/cmdutils/more/lang/et-EE.rc b/base/applications/cmdutils/more/lang/et-EE.rc index 11a92d07261..123eaae2922 100644 --- a/base/applications/cmdutils/more/lang/et-EE.rc +++ b/base/applications/cmdutils/more/lang/et-EE.rc @@ -3,13 +3,34 @@ LANGUAGE LANG_ESTONIAN, SUBLANG_DEFAULT STRINGTABLE BEGIN IDS_USAGE "Kuvab andmeid lehekülje kaupa ekraanil.\n\n\ - MORE < [Draiv:][Tee]Faili nimi\n\ - Käsk | MORE\n\ - MORE [Draiv:][Tee]Faili nimi\n\n\ - [Draiv:][Tee]Faili nimi Fail mille sisu kuvatakse.\n\ - Käsk\t\t\t Käsk mille sisu kuvatakse.\n\n\ - Küsimusel ""-- Jätka --"" võib vajutada mis tahes klahvi järgmise lehe näitamiseks.\n" + MORE [options] < [Drive:][Path]Filename\n\ + Command | MORE [options]\n\ + MORE [options] [Drive:][Path]Filename\n\n\ +Options:\n\ + /E Enable extended features.\n\ + /C Clear screen before displaying page.\n\ + /P Expand form-feed characters.\n\ + /S Shrink multiple blank lines to a single line.\n\ + /Tn Expand tabs to n spaces (default: 8).\n\ + +n Start displaying the first file at line n.\n\n\ + [Drive:][Path]Filename A file, whose content shall be displayed.\n\ + Command A command, whose output shall be displayed.\n\n\ +If extended features are enabled, the following commands are available\n\ +at ""-- Continue --"" prompt:\n\ + P n Display n lines.\n\ + S n Skip n lines.\n\ + F Display next file.\n\ + Q Quit.\n\ + ? Show help line.\n\ + = Show line number.\n\ + <Space> Display next page.\n\ + <Enter> Display next line.\n" + IDS_CONTINUE "-- Jätka --" IDS_CONTINUE_PROGRESS "-- Jätka (%d%%) --" IDS_FILE_ACCESS "Ei saa ligi failile %s.\n" + IDS_BAD_FLAG "Invalid argument - '%ls'\n" + IDS_CONTINUE_OPTIONS "-- Continue (%d%%) [Options: psfq=<Space><Enter>] --" + IDS_CONTINUE_LINES "-- Continue (%d%%) -- Lines: " + IDS_CONTINUE_LINE_AT "-- Continue (%d%%) [Line:%d] --" END diff --git a/base/applications/cmdutils/more/lang/fr-FR.rc b/base/applications/cmdutils/more/lang/fr-FR.rc index 43dccce472b..28899eac3ce 100644 --- a/base/applications/cmdutils/more/lang/fr-FR.rc +++ b/base/applications/cmdutils/more/lang/fr-FR.rc @@ -3,13 +3,34 @@ LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL STRINGTABLE BEGIN IDS_USAGE "Affiche les données page par page à l'écran.\n\n\ - MORE < [Lecteur:][Chemin]Nom du fichier\n\ - Commande | MORE\n\ - MORE [Lecteur:][Chemin]Nom du fichier\n\n\ - [Lecteur:][Chemin]Nom du fichier Un fichier, dont le contenu sera affiché.\n\ - Commande\t\t Une commande, dont la sortie sera affichée.\n\n\ - À l'invite ""-- Continuer --"" Vous pouvez appuyer sur n'importe quelle touche pour afficher la page suivante.\n" + MORE [options] < [Drive:][Path]Filename\n\ + Command | MORE [options]\n\ + MORE [options] [Drive:][Path]Filename\n\n\ +Options:\n\ + /E Enable extended features.\n\ + /C Clear screen before displaying page.\n\ + /P Expand form-feed characters.\n\ + /S Shrink multiple blank lines to a single line.\n\ + /Tn Expand tabs to n spaces (default: 8).\n\ + +n Start displaying the first file at line n.\n\n\ + [Drive:][Path]Filename A file, whose content shall be displayed.\n\ + Command A command, whose output shall be displayed.\n\n\ +If extended features are enabled, the following commands are available\n\ +at ""-- Continue --"" prompt:\n\ + P n Display n lines.\n\ + S n Skip n lines.\n\ + F Display next file.\n\ + Q Quit.\n\ + ? Show help line.\n\ + = Show line number.\n\ + <Space> Display next page.\n\ + <Enter> Display next line.\n" + IDS_CONTINUE "-- Continuer --" IDS_CONTINUE_PROGRESS "-- Continuer (%d %%) --" IDS_FILE_ACCESS "Impossible d'accéder au fichier %s.\n" + IDS_BAD_FLAG "Invalid argument - '%ls'\n" + IDS_CONTINUE_OPTIONS "-- Continue (%d%%) [Options: psfq=<Space><Enter>] --" + IDS_CONTINUE_LINES "-- Continue (%d%%) -- Lines: " + IDS_CONTINUE_LINE_AT "-- Continue (%d%%) [Line:%d] --" END diff --git a/base/applications/cmdutils/more/lang/it-IT.rc b/base/applications/cmdutils/more/lang/it-IT.rc index c08f5680696..05f6e15a38b 100644 --- a/base/applications/cmdutils/more/lang/it-IT.rc +++ b/base/applications/cmdutils/more/lang/it-IT.rc @@ -3,13 +3,34 @@ LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL STRINGTABLE BEGIN IDS_USAGE "Visualizza dati una schermata per volta.\n\n\ - MORE < [Drive:][Path]File\n\ - Comando | MORE\n\ - MORE [Drive:][Path]File\n\n\ - [Drive:][Path]File Il file da visualizzare.\n\ - Comando\t\t Il comando di cui l'output dev'essere visualizzato.\n\n\ - Alla richiesta ""-- Continua --"" premere un tasto qualsiasi per visualizzare la pagina successiva.\n" + MORE [options] < [Drive:][Path]Filename\n\ + Command | MORE [options]\n\ + MORE [options] [Drive:][Path]Filename\n\n\ +Options:\n\ + /E Enable extended features.\n\ + /C Clear screen before displaying page.\n\ + /P Expand form-feed characters.\n\ + /S Shrink multiple blank lines to a single line.\n\ + /Tn Expand tabs to n spaces (default: 8).\n\ + +n Start displaying the first file at line n.\n\n\ + [Drive:][Path]Filename A file, whose content shall be displayed.\n\ + Command A command, whose output shall be displayed.\n\n\ +If extended features are enabled, the following commands are available\n\ +at ""-- Continue --"" prompt:\n\ + P n Display n lines.\n\ + S n Skip n lines.\n\ + F Display next file.\n\ + Q Quit.\n\ + ? Show help line.\n\ + = Show line number.\n\ + <Space> Display next page.\n\ + <Enter> Display next line.\n" + IDS_CONTINUE "-- Continua --" IDS_CONTINUE_PROGRESS "-- Continua (%d%%) --" IDS_FILE_ACCESS "Impossibile accedere al file %s.\n" + IDS_BAD_FLAG "Invalid argument - '%ls'\n" + IDS_CONTINUE_OPTIONS "-- Continue (%d%%) [Options: psfq=<Space><Enter>] --" + IDS_CONTINUE_LINES "-- Continue (%d%%) -- Lines: " + IDS_CONTINUE_LINE_AT "-- Continue (%d%%) [Line:%d] --" END diff --git a/base/applications/cmdutils/more/lang/lt-LT.rc b/base/applications/cmdutils/more/lang/lt-LT.rc index 1073aa724ca..76ff2a42bb1 100644 --- a/base/applications/cmdutils/more/lang/lt-LT.rc +++ b/base/applications/cmdutils/more/lang/lt-LT.rc @@ -12,16 +12,34 @@ LANGUAGE LANG_LITHUANIAN, SUBLANG_DEFAULT STRINGTABLE BEGIN IDS_USAGE "Atvaizduoja duomenis puslapiais.\n\n\ - MORE < [Diskas:][Kelias iki bylos]Bylos vardas\n\ - Komanda | MORE\n\ - MORE [Diskas:][Kelias iki bylos]Bylos vardas\n\n\ - [Diskas:][Kelias iki bylos]Bylos vardas Byla, kurios turinys turi būti\n\ - atvaizduotas.\n\ - Komanda Komanda, kurios rezultatas turi\n\ - būti atvaizduotas.\n\n\ - Pasirodžius raginimui ""-- Toliau --"" spauskite bet kurį klavišą, kad\n\ - pamatytumėte sekantį puslapį.\n" + MORE [options] < [Drive:][Path]Filename\n\ + Command | MORE [options]\n\ + MORE [options] [Drive:][Path]Filename\n\n\ +Options:\n\ + /E Enable extended features.\n\ + /C Clear screen before displaying page.\n\ + /P Expand form-feed characters.\n\ + /S Shrink multiple blank lines to a single line.\n\ + /Tn Expand tabs to n spaces (default: 8).\n\ + +n Start displaying the first file at line n.\n\n\ + [Drive:][Path]Filename A file, whose content shall be displayed.\n\ + Command A command, whose output shall be displayed.\n\n\ +If extended features are enabled, the following commands are available\n\ +at ""-- Continue --"" prompt:\n\ + P n Display n lines.\n\ + S n Skip n lines.\n\ + F Display next file.\n\ + Q Quit.\n\ + ? Show help line.\n\ + = Show line number.\n\ + <Space> Display next page.\n\ + <Enter> Display next line.\n" + IDS_CONTINUE "-- Toliau --" IDS_CONTINUE_PROGRESS "-- Toliau (%d%%) --" IDS_FILE_ACCESS "Nepavyko atverti bylos %s.\n" + IDS_BAD_FLAG "Invalid argument - '%ls'\n" + IDS_CONTINUE_OPTIONS "-- Continue (%d%%) [Options: psfq=<Space><Enter>] --" + IDS_CONTINUE_LINES "-- Continue (%d%%) -- Lines: " + IDS_CONTINUE_LINE_AT "-- Continue (%d%%) [Line:%d] --" END diff --git a/base/applications/cmdutils/more/lang/no-NO.rc b/base/applications/cmdutils/more/lang/no-NO.rc index b300487ae7e..7260d258f7e 100644 --- a/base/applications/cmdutils/more/lang/no-NO.rc +++ b/base/applications/cmdutils/more/lang/no-NO.rc @@ -3,13 +3,34 @@ LANGUAGE LANG_NORWEGIAN, SUBLANG_NEUTRAL STRINGTABLE BEGIN IDS_USAGE "Vis data side-etter-side på skjermen.\n\n\ - MORE < [Stasjon:][Mappe]Filnavn\n\ - command | MORE\n\ - MORE [Stasjon:][Mappe]Filenavn\n\n\ - [Stasjon:][Mappe]Filnavn En fil, Velg innhold som skal vises.\n\ - Command\t\t En kommando, Velg output som skal vises.\n\n\ - At the prompt ""-- Fortsett --"" du kan trykke en tast for å vise neste side.\n" + MORE [options] < [Drive:][Path]Filename\n\ + Command | MORE [options]\n\ + MORE [options] [Drive:][Path]Filename\n\n\ +Options:\n\ + /E Enable extended features.\n\ + /C Clear screen before displaying page.\n\ + /P Expand form-feed characters.\n\ + /S Shrink multiple blank lines to a single line.\n\ + /Tn Expand tabs to n spaces (default: 8).\n\ + +n Start displaying the first file at line n.\n\n\ + [Drive:][Path]Filename A file, whose content shall be displayed.\n\ + Command A command, whose output shall be displayed.\n\n\ +If extended features are enabled, the following commands are available\n\ +at ""-- Continue --"" prompt:\n\ + P n Display n lines.\n\ + S n Skip n lines.\n\ + F Display next file.\n\ + Q Quit.\n\ + ? Show help line.\n\ + = Show line number.\n\ + <Space> Display next page.\n\ + <Enter> Display next line.\n" + IDS_CONTINUE "-- Fortsett --" IDS_CONTINUE_PROGRESS "-- Fortsett (%d%%) --" IDS_FILE_ACCESS "Får ikke tilgang til filen %s.\n" + IDS_BAD_FLAG "Invalid argument - '%ls'\n" + IDS_CONTINUE_OPTIONS "-- Continue (%d%%) [Options: psfq=<Space><Enter>] --" + IDS_CONTINUE_LINES "-- Continue (%d%%) -- Lines: " + IDS_CONTINUE_LINE_AT "-- Continue (%d%%) [Line:%d] --" END diff --git a/base/applications/cmdutils/more/lang/pl-PL.rc b/base/applications/cmdutils/more/lang/pl-PL.rc index e18872b42c1..b8ba373f398 100644 --- a/base/applications/cmdutils/more/lang/pl-PL.rc +++ b/base/applications/cmdutils/more/lang/pl-PL.rc @@ -11,13 +11,34 @@ LANGUAGE LANG_POLISH, SUBLANG_DEFAULT STRINGTABLE BEGIN IDS_USAGE "Wyświetla dane, podzielone na odcinki o długości ekranu.\n\n\ - MORE < [Napęd:][Ścieżka]Nazwa pliku\n\ - Polecenie | MORE\n\ - MORE [Napęd:][Ścieżka]Nazwa pliku\n\n\ - [Napęd:][Ścieżka]Nazwa pliku Plik, którego zawartość ma być wyświetlona.\n\ - Polecenie\t\t Polecenie, którego wynik ma być wyświetlony.\n\n\ - Po wyświetleniu ""-- Kontynuuj --"" możesz nacisnąć dowolny klawisz, aby przejść do następnej strony.\n" + MORE [options] < [Drive:][Path]Filename\n\ + Command | MORE [options]\n\ + MORE [options] [Drive:][Path]Filename\n\n\ +Options:\n\ + /E Enable extended features.\n\ + /C Clear screen before displaying page.\n\ + /P Expand form-feed characters.\n\ + /S Shrink multiple blank lines to a single line.\n\ + /Tn Expand tabs to n spaces (default: 8).\n\ + +n Start displaying the first file at line n.\n\n\ + [Drive:][Path]Filename A file, whose content shall be displayed.\n\ + Command A command, whose output shall be displayed.\n\n\ +If extended features are enabled, the following commands are available\n\ +at ""-- Continue --"" prompt:\n\ + P n Display n lines.\n\ + S n Skip n lines.\n\ + F Display next file.\n\ + Q Quit.\n\ + ? Show help line.\n\ + = Show line number.\n\ + <Space> Display next page.\n\ + <Enter> Display next line.\n" + IDS_CONTINUE "-- Kontynuuj --" IDS_CONTINUE_PROGRESS "-- Kontynuuj (%d%%) --" IDS_FILE_ACCESS "Brak dostępu do pliku: %s.\n" + IDS_BAD_FLAG "Invalid argument - '%ls'\n" + IDS_CONTINUE_OPTIONS "-- Continue (%d%%) [Options: psfq=<Space><Enter>] --" + IDS_CONTINUE_LINES "-- Continue (%d%%) -- Lines: " + IDS_CONTINUE_LINE_AT "-- Continue (%d%%) [Line:%d] --" END diff --git a/base/applications/cmdutils/more/lang/ro-RO.rc b/base/applications/cmdutils/more/lang/ro-RO.rc index 45bc899d367..8d5c990c484 100644 --- a/base/applications/cmdutils/more/lang/ro-RO.rc +++ b/base/applications/cmdutils/more/lang/ro-RO.rc @@ -11,14 +11,34 @@ LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL STRINGTABLE BEGIN IDS_USAGE "Afișează date pe ecran, pagină-cu-pagină.\n\n\ - MORE < [Unitate:][Cale]Nume fișier\n\ - Comandă | MORE\n\ - MORE [Unitate:][Cale]Nume fișier\n\n\ - [Unitate:][Cale]Nume fișier Fișierul al cărui conținut va fi afișat.\n\ - Comandă Comanda a cărei ieșire va fi afișată.\n\n\ - La vederea sugestiei ""-- Continuă --"" veți apăsa o tastă pentru afișarea\n\ - următoarei pagini.\n" + MORE [options] < [Drive:][Path]Filename\n\ + Command | MORE [options]\n\ + MORE [options] [Drive:][Path]Filename\n\n\ +Options:\n\ + /E Enable extended features.\n\ + /C Clear screen before displaying page.\n\ + /P Expand form-feed characters.\n\ + /S Shrink multiple blank lines to a single line.\n\ + /Tn Expand tabs to n spaces (default: 8).\n\ + +n Start displaying the first file at line n.\n\n\ + [Drive:][Path]Filename A file, whose content shall be displayed.\n\ + Command A command, whose output shall be displayed.\n\n\ +If extended features are enabled, the following commands are available\n\ +at ""-- Continue --"" prompt:\n\ + P n Display n lines.\n\ + S n Skip n lines.\n\ + F Display next file.\n\ + Q Quit.\n\ + ? Show help line.\n\ + = Show line number.\n\ + <Space> Display next page.\n\ + <Enter> Display next line.\n" + IDS_CONTINUE "-- Continuă --" IDS_CONTINUE_PROGRESS "-- Continuă (%d%%) --" IDS_FILE_ACCESS "Fișierul «%s» nu poate fi accesat!\n" + IDS_BAD_FLAG "Invalid argument - '%ls'\n" + IDS_CONTINUE_OPTIONS "-- Continue (%d%%) [Options: psfq=<Space><Enter>] --" + IDS_CONTINUE_LINES "-- Continue (%d%%) -- Lines: " + IDS_CONTINUE_LINE_AT "-- Continue (%d%%) [Line:%d] --" END diff --git a/base/applications/cmdutils/more/lang/ru-RU.rc b/base/applications/cmdutils/more/lang/ru-RU.rc index 49a4c459c37..d251bb0cd5a 100644 --- a/base/applications/cmdutils/more/lang/ru-RU.rc +++ b/base/applications/cmdutils/more/lang/ru-RU.rc @@ -11,13 +11,34 @@ LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT STRINGTABLE BEGIN IDS_USAGE "Показывать данные постранично заполняя экран.\n\n\ - MORE < [диск:][путь]имя_файла\n\ - имя_команды | MORE\n\ - MORE [диск:][путь]имя_файла\n\n\ - [диск:][путь]имя_файла Файл, отображаемый по фрагментам.\n\ - имя_команды Команда, вывод которой отображается на экране.\n\n\ - При запросе ""-- Продолжить --"" вы можете нажать любую клавишу для отображения следующего экрана.\n" + MORE [options] < [Drive:][Path]Filename\n\ + Command | MORE [options]\n\ + MORE [options] [Drive:][Path]Filename\n\n\ +Options:\n\ + /E Enable extended features.\n\ + /C Clear screen before displaying page.\n\ + /P Expand form-feed characters.\n\ + /S Shrink multiple blank lines to a single line.\n\ + /Tn Expand tabs to n spaces (default: 8).\n\ + +n Start displaying the first file at line n.\n\n\ + [Drive:][Path]Filename A file, whose content shall be displayed.\n\ + Command A command, whose output shall be displayed.\n\n\ +If extended features are enabled, the following commands are available\n\ +at ""-- Continue --"" prompt:\n\ + P n Display n lines.\n\ + S n Skip n lines.\n\ + F Display next file.\n\ + Q Quit.\n\ + ? Show help line.\n\ + = Show line number.\n\ + <Space> Display next page.\n\ + <Enter> Display next line.\n" + IDS_CONTINUE "-- Продолжить --" IDS_CONTINUE_PROGRESS "-- Продолжить (%d%%) --" IDS_FILE_ACCESS "Нет доступа к файлу %s.\n" + IDS_BAD_FLAG "Invalid argument - '%ls'\n" + IDS_CONTINUE_OPTIONS "-- Continue (%d%%) [Options: psfq=<Space><Enter>] --" + IDS_CONTINUE_LINES "-- Continue (%d%%) -- Lines: " + IDS_CONTINUE_LINE_AT "-- Continue (%d%%) [Line:%d] --" END diff --git a/base/applications/cmdutils/more/lang/sk-SK.rc b/base/applications/cmdutils/more/lang/sk-SK.rc index 7e4a9decada..db3f798c03f 100644 --- a/base/applications/cmdutils/more/lang/sk-SK.rc +++ b/base/applications/cmdutils/more/lang/sk-SK.rc @@ -7,14 +7,34 @@ LANGUAGE LANG_SLOVAK, SUBLANG_DEFAULT STRINGTABLE BEGIN IDS_USAGE "Zobrazuje údaje, stránku za stránkou, na obrazovke.\n\n\ - MORE < [Jednotka:][Cesta]Názov súboru\n\ - Príkaz | MORE\n\ - MORE [Jednotka:][Cesta]Názov súboru\n\n\ - [Jednotka:][Cesta]Názov súboru Súbor, ktorého obsah má byť zobrazený.\n\ - Príkaz\t\t Príkaz, ktorého výstup má byť zobrazený.\n\n\ - Pri výzve ""-- Pokračujte --"" môžete stlačiť ľubovoľný kláves\n\ - k zobrazeniu nasledujúcej stránky.\n" + MORE [options] < [Drive:][Path]Filename\n\ + Command | MORE [options]\n\ + MORE [options] [Drive:][Path]Filename\n\n\ +Options:\n\ + /E Enable extended features.\n\ + /C Clear screen before displaying page.\n\ + /P Expand form-feed characters.\n\ + /S Shrink multiple blank lines to a single line.\n\ + /Tn Expand tabs to n spaces (default: 8).\n\ + +n Start displaying the first file at line n.\n\n\ + [Drive:][Path]Filename A file, whose content shall be displayed.\n\ + Command A command, whose output shall be displayed.\n\n\ +If extended features are enabled, the following commands are available\n\ +at ""-- Continue --"" prompt:\n\ + P n Display n lines.\n\ + S n Skip n lines.\n\ + F Display next file.\n\ + Q Quit.\n\ + ? Show help line.\n\ + = Show line number.\n\ + <Space> Display next page.\n\ + <Enter> Display next line.\n" + IDS_CONTINUE "-- Pokračujte --" IDS_CONTINUE_PROGRESS "-- Pokračujte (%d%%) --" IDS_FILE_ACCESS "Neviem získať prístup k súboru %s.\n" + IDS_BAD_FLAG "Invalid argument - '%ls'\n" + IDS_CONTINUE_OPTIONS "-- Continue (%d%%) [Options: psfq=<Space><Enter>] --" + IDS_CONTINUE_LINES "-- Continue (%d%%) -- Lines: " + IDS_CONTINUE_LINE_AT "-- Continue (%d%%) [Line:%d] --" END diff --git a/base/applications/cmdutils/more/lang/sq-AL.rc b/base/applications/cmdutils/more/lang/sq-AL.rc index 8ed10ddb64e..6cf4a8bbef8 100644 --- a/base/applications/cmdutils/more/lang/sq-AL.rc +++ b/base/applications/cmdutils/more/lang/sq-AL.rc @@ -7,13 +7,34 @@ LANGUAGE LANG_ALBANIAN, SUBLANG_NEUTRAL STRINGTABLE BEGIN IDS_USAGE "Shfaq të dhëna faqe-per-faqe ne ekran.\n\n\ - MORE < [Drive:][Path]File name\n\ - Komandë | MORE\n\ - MORE [Drive:][Path]File name\n\n\ - [Drive:][Path]File name Nje dokument, përmbajtja e të cilit do të shfaqet.\n\ - Komandë\t\t Nje komande, nxjerrja e te cilit do të shfaqet.\n\n\ - At the prompt ""-- Vazhdo --"" ju mund të shtypni çfarëdo butoni për të vazhduar në faqen tjetër.\n" + MORE [options] < [Drive:][Path]Filename\n\ + Command | MORE [options]\n\ + MORE [options] [Drive:][Path]Filename\n\n\ +Options:\n\ + /E Enable extended features.\n\ + /C Clear screen before displaying page.\n\ + /P Expand form-feed characters.\n\ + /S Shrink multiple blank lines to a single line.\n\ + /Tn Expand tabs to n spaces (default: 8).\n\ + +n Start displaying the first file at line n.\n\n\ + [Drive:][Path]Filename A file, whose content shall be displayed.\n\ + Command A command, whose output shall be displayed.\n\n\ +If extended features are enabled, the following commands are available\n\ +at ""-- Continue --"" prompt:\n\ + P n Display n lines.\n\ + S n Skip n lines.\n\ + F Display next file.\n\ + Q Quit.\n\ + ? Show help line.\n\ + = Show line number.\n\ + <Space> Display next page.\n\ + <Enter> Display next line.\n" + IDS_CONTINUE "-- Vazhdo --" IDS_CONTINUE_PROGRESS "-- Vazhdo (%d%%) --" IDS_FILE_ACCESS "Nuk mund të aksesoj dokumentin %s.\n" + IDS_BAD_FLAG "Invalid argument - '%ls'\n" + IDS_CONTINUE_OPTIONS "-- Continue (%d%%) [Options: psfq=<Space><Enter>] --" + IDS_CONTINUE_LINES "-- Continue (%d%%) -- Lines: " + IDS_CONTINUE_LINE_AT "-- Continue (%d%%) [Line:%d] --" END diff --git a/base/applications/cmdutils/more/lang/sv-SE.rc b/base/applications/cmdutils/more/lang/sv-SE.rc index 4d2a7fabe79..ea513e2a66a 100644 --- a/base/applications/cmdutils/more/lang/sv-SE.rc +++ b/base/applications/cmdutils/more/lang/sv-SE.rc @@ -10,13 +10,34 @@ LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL STRINGTABLE BEGIN IDS_USAGE "Visa data sida-efter-sida på skärmen.\n\n\ - MORE < [Enhet:][Mapp]Filnamn\n\ - Kommando | MORE\n\ - MORE [Enhet:][Mapp]Filnamn\n\n\ - [Enhet:][Mapp]Filnamn En fil, Välj innehåll som skall visas.\n\ - Kommando\t\t Ett kommando, Välj vad som skall visas.\n\n\ - vid prompten ""-- Fortsätt --"" du kan trycka valfri knapp för att visa nästa sida.\n" + MORE [options] < [Drive:][Path]Filename\n\ + Command | MORE [options]\n\ + MORE [options] [Drive:][Path]Filename\n\n\ +Options:\n\ + /E Enable extended features.\n\ + /C Clear screen before displaying page.\n\ + /P Expand form-feed characters.\n\ + /S Shrink multiple blank lines to a single line.\n\ + /Tn Expand tabs to n spaces (default: 8).\n\ + +n Start displaying the first file at line n.\n\n\ + [Drive:][Path]Filename A file, whose content shall be displayed.\n\ + Command A command, whose output shall be displayed.\n\n\ +If extended features are enabled, the following commands are available\n\ +at ""-- Continue --"" prompt:\n\ + P n Display n lines.\n\ + S n Skip n lines.\n\ + F Display next file.\n\ + Q Quit.\n\ + ? Show help line.\n\ + = Show line number.\n\ + <Space> Display next page.\n\ + <Enter> Display next line.\n" + IDS_CONTINUE "-- Fortsätt --" IDS_CONTINUE_PROGRESS "-- Fortsätt (%d%%) --" IDS_FILE_ACCESS "Får inte tillgång till filen %s.\n" + IDS_BAD_FLAG "Invalid argument - '%ls'\n" + IDS_CONTINUE_OPTIONS "-- Continue (%d%%) [Options: psfq=<Space><Enter>] --" + IDS_CONTINUE_LINES "-- Continue (%d%%) -- Lines: " + IDS_CONTINUE_LINE_AT "-- Continue (%d%%) [Line:%d] --" END diff --git a/base/applications/cmdutils/more/lang/tr-TR.rc b/base/applications/cmdutils/more/lang/tr-TR.rc index 155a71adc6f..a8cb35ef39d 100644 --- a/base/applications/cmdutils/more/lang/tr-TR.rc +++ b/base/applications/cmdutils/more/lang/tr-TR.rc @@ -5,13 +5,34 @@ LANGUAGE LANG_TURKISH, SUBLANG_DEFAULT STRINGTABLE BEGIN IDS_USAGE "Görüntülükte veriyi sayfa sayfa görüntüler.\n\n\ - MORE < [Sürücü:][Yol]Kütük adı\n\ - Komut | MORE\n\ - MORE [Sürücü:][Yol]Kütük adı\n\n\ - [Sürücü:][Yol]Kütük adı İçeriği görüntülenecek bir kütük.\n\ - Komut\t\t Çıkışı görüntülenecek bir komut.\n\n\ - İstemde ""-- Sürdür --"" ile bir sonraki sayfayı göstermek için rastgele bir düğmeye basabilirsiniz.\n" + MORE [options] < [Drive:][Path]Filename\n\ + Command | MORE [options]\n\ + MORE [options] [Drive:][Path]Filename\n\n\ +Options:\n\ + /E Enable extended features.\n\ + /C Clear screen before displaying page.\n\ + /P Expand form-feed characters.\n\ + /S Shrink multiple blank lines to a single line.\n\ + /Tn Expand tabs to n spaces (default: 8).\n\ + +n Start displaying the first file at line n.\n\n\ + [Drive:][Path]Filename A file, whose content shall be displayed.\n\ + Command A command, whose output shall be displayed.\n\n\ +If extended features are enabled, the following commands are available\n\ +at ""-- Continue --"" prompt:\n\ + P n Display n lines.\n\ + S n Skip n lines.\n\ + F Display next file.\n\ + Q Quit.\n\ + ? Show help line.\n\ + = Show line number.\n\ + <Space> Display next page.\n\ + <Enter> Display next line.\n" + IDS_CONTINUE "-- Sürdür --" IDS_CONTINUE_PROGRESS "-- Sürdür (%%%d) --" IDS_FILE_ACCESS "%s kütüğüne erişilemiyor.\n" + IDS_BAD_FLAG "Invalid argument - '%ls'\n" + IDS_CONTINUE_OPTIONS "-- Continue (%d%%) [Options: psfq=<Space><Enter>] --" + IDS_CONTINUE_LINES "-- Continue (%d%%) -- Lines: " + IDS_CONTINUE_LINE_AT "-- Continue (%d%%) [Line:%d] --" END diff --git a/base/applications/cmdutils/more/lang/uk-UA.rc b/base/applications/cmdutils/more/lang/uk-UA.rc index 7b637f8da80..cdb59048ddc 100644 --- a/base/applications/cmdutils/more/lang/uk-UA.rc +++ b/base/applications/cmdutils/more/lang/uk-UA.rc @@ -10,14 +10,34 @@ LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT STRINGTABLE BEGIN IDS_USAGE "Виводить iнфрмацію поекранно. Використання:\n\n\ - MORE < [Диск:][Шлях]Iм'я_файлу\n\ - Command | MORE\n\ - MORE [Диск:][Шлях]Iм'я_файлу\n\n\ - Де:\n\ - [Диск:][Шлях]Ім'я_файлу Файл, вмiст якого треба вивести на екран.\n\ - Command\t\t Команда, результат роботи якої треба вивести на екран.\n\n\ - На запрошення ""-- Далi --"" Ви можете натиснути будь-яку клавiшу щоб побачити наступну сторiнку.\n" + MORE [options] < [Drive:][Path]Filename\n\ + Command | MORE [options]\n\ + MORE [options] [Drive:][Path]Filename\n\n\ +Options:\n\ + /E Enable extended features.\n\ + /C Clear screen before displaying page.\n\ + /P Expand form-feed characters.\n\ + /S Shrink multiple blank lines to a single line.\n\ + /Tn Expand tabs to n spaces (default: 8).\n\ + +n Start displaying the first file at line n.\n\n\ + [Drive:][Path]Filename A file, whose content shall be displayed.\n\ + Command A command, whose output shall be displayed.\n\n\ +If extended features are enabled, the following commands are available\n\ +at ""-- Continue --"" prompt:\n\ + P n Display n lines.\n\ + S n Skip n lines.\n\ + F Display next file.\n\ + Q Quit.\n\ + ? Show help line.\n\ + = Show line number.\n\ + <Space> Display next page.\n\ + <Enter> Display next line.\n" + IDS_CONTINUE "-- Далi --" IDS_CONTINUE_PROGRESS "-- Далi (%d%%) --" IDS_FILE_ACCESS "Не можу отримати доступ до файла %s.\n" + IDS_BAD_FLAG "Invalid argument - '%ls'\n" + IDS_CONTINUE_OPTIONS "-- Continue (%d%%) [Options: psfq=<Space><Enter>] --" + IDS_CONTINUE_LINES "-- Continue (%d%%) -- Lines: " + IDS_CONTINUE_LINE_AT "-- Continue (%d%%) [Line:%d] --" END diff --git a/base/applications/cmdutils/more/lang/zh-CN.rc b/base/applications/cmdutils/more/lang/zh-CN.rc index c0b0b0e46bb..da92aa57b2b 100644 --- a/base/applications/cmdutils/more/lang/zh-CN.rc +++ b/base/applications/cmdutils/more/lang/zh-CN.rc @@ -5,13 +5,34 @@ LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED STRINGTABLE BEGIN IDS_USAGE "在屏幕上一页一页地显示内容。\n\n\ - MORE < [驱动器:][路径]文件名\n\ - 命令 | MORE\n\ - MORE [驱动器:][路径]文件名\n\n\ - [驱动器:][路径]文件名 一个将要被如此显示内容的文件。\n\ - 命令\t\t 一个输出将要被如此显示的命令。\n\n\ - 在 ""-- 继续 --"" 的提示出现时你可以按任意键来显示下一页。\n" + MORE [options] < [Drive:][Path]Filename\n\ + Command | MORE [options]\n\ + MORE [options] [Drive:][Path]Filename\n\n\ +Options:\n\ + /E Enable extended features.\n\ + /C Clear screen before displaying page.\n\ + /P Expand form-feed characters.\n\ + /S Shrink multiple blank lines to a single line.\n\ + /Tn Expand tabs to n spaces (default: 8).\n\ + +n Start displaying the first file at line n.\n\n\ + [Drive:][Path]Filename A file, whose content shall be displayed.\n\ + Command A command, whose output shall be displayed.\n\n\ +If extended features are enabled, the following commands are available\n\ +at ""-- Continue --"" prompt:\n\ + P n Display n lines.\n\ + S n Skip n lines.\n\ + F Display next file.\n\ + Q Quit.\n\ + ? Show help line.\n\ + = Show line number.\n\ + <Space> Display next page.\n\ + <Enter> Display next line.\n" + IDS_CONTINUE "-- 继续 --" IDS_CONTINUE_PROGRESS "-- 继续 (%d%%) --" IDS_FILE_ACCESS "无法访问文件 %s。\n" + IDS_BAD_FLAG "Invalid argument - '%ls'\n" + IDS_CONTINUE_OPTIONS "-- Continue (%d%%) [Options: psfq=<Space><Enter>] --" + IDS_CONTINUE_LINES "-- Continue (%d%%) -- Lines: " + IDS_CONTINUE_LINE_AT "-- Continue (%d%%) [Line:%d] --" END diff --git a/base/applications/cmdutils/more/lang/zh-TW.rc b/base/applications/cmdutils/more/lang/zh-TW.rc index c69957917cb..9e26993fbfc 100644 --- a/base/applications/cmdutils/more/lang/zh-TW.rc +++ b/base/applications/cmdutils/more/lang/zh-TW.rc @@ -5,13 +5,34 @@ LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL STRINGTABLE BEGIN IDS_USAGE "在螢幕上一頁一頁地顯示內容。\n\n\ - MORE < [磁碟機:][路徑]檔案名\n\ - 命令 | MORE\n\ - MORE [磁碟機:][路徑]檔案名\n\n\ - [磁碟機:][路徑]檔案名 一個將要被如此顯示內容的檔案。\n\ - 命令\t\t 一個輸出將要被如此顯示的命令。\n\n\ - 在 ""-- 繼續 --"" 的提示出現時你可以按任意鍵來顯示下一頁。\n" + MORE [options] < [Drive:][Path]Filename\n\ + Command | MORE [options]\n\ + MORE [options] [Drive:][Path]Filename\n\n\ +Options:\n\ + /E Enable extended features.\n\ + /C Clear screen before displaying page.\n\ + /P Expand form-feed characters.\n\ + /S Shrink multiple blank lines to a single line.\n\ + /Tn Expand tabs to n spaces (default: 8).\n\ + +n Start displaying the first file at line n.\n\n\ + [Drive:][Path]Filename A file, whose content shall be displayed.\n\ + Command A command, whose output shall be displayed.\n\n\ +If extended features are enabled, the following commands are available\n\ +at ""-- Continue --"" prompt:\n\ + P n Display n lines.\n\ + S n Skip n lines.\n\ + F Display next file.\n\ + Q Quit.\n\ + ? Show help line.\n\ + = Show line number.\n\ + <Space> Display next page.\n\ + <Enter> Display next line.\n" + IDS_CONTINUE "-- 繼續 --" IDS_CONTINUE_PROGRESS "-- 繼續 (%d%%) --" IDS_FILE_ACCESS "無法訪問檔案 %s。\n" + IDS_BAD_FLAG "Invalid argument - '%ls'\n" + IDS_CONTINUE_OPTIONS "-- Continue (%d%%) [Options: psfq=<Space><Enter>] --" + IDS_CONTINUE_LINES "-- Continue (%d%%) -- Lines: " + IDS_CONTINUE_LINE_AT "-- Continue (%d%%) [Line:%d] --" END diff --git a/base/applications/cmdutils/more/more.c b/base/applications/cmdutils/more/more.c index b45ce967731..5190bc6308c 100644 --- a/base/applications/cmdutils/more/more.c +++ b/base/applications/cmdutils/more/more.c @@ -1,14 +1,13 @@ /* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS More Command - * FILE: base/applications/cmdutils/more/more.c - * PURPOSE: Displays text stream from STDIN or from an arbitrary number - * of files to STDOUT, with screen capabilities (more than CAT, - * but less than LESS ^^). - * PROGRAMMERS: Paolo Pantaleo - * Timothy Schepens - * Hermes Belusca-Maito (hermes.belusca@sfr.fr) - * Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com) + * PROJECT: ReactOS More Command + * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+) + * PURPOSE: Displays text stream from STDIN or from an arbitrary number + * of files to STDOUT, with screen capabilities (more than CAT, + * but less than LESS ^^). + * COPYRIGHT: Copyright 1999 Paolo Pantaleo + * Copyright 2003 Timothy Schepens + * Copyright 2016-2021 Hermes Belusca-Maito + * Copyright 2021 Katayama Hirofumi MZ */ /* * MORE.C - external command. @@ -27,6 +26,7 @@
#include <windef.h> #include <winbase.h> +#include <winnt.h> #include <winnls.h> #include <winreg.h> #include <winuser.h> @@ -51,14 +51,100 @@ HANDLE hKeyboard; /* Enable/Disable extensions */ BOOL bEnableExtensions = TRUE; // FIXME: By default, it should be FALSE.
+#define FLAG_HELP (1 << 0) +#define FLAG_E (1 << 1) +#define FLAG_C (1 << 2) +#define FLAG_P (1 << 3) +#define FLAG_S (1 << 4) +#define FLAG_Tn (1 << 5) +#define FLAG_PLUSn (1 << 6) + +static DWORD s_dwFlags = 0; +static LONG s_nTabWidth = 8; +static DWORD s_nNextLineNo = 0; +static BOOL s_bPrevLineIsBlank = FALSE; +static UINT s_nPromptID = IDS_CONTINUE_PROGRESS; +static BOOL s_bDoNextFile = FALSE; + +static BOOL IsBlankLine(IN PCWCH line, IN DWORD cch) +{ + DWORD ich; + WORD wType; + for (ich = 0; ich < cch; ++ich) + { + wType = 0; + GetStringTypeW(CT_CTYPE1, &line[ich], 1, &wType); + if (!(wType & (C1_BLANK | C1_SPACE))) + return FALSE; + } + return TRUE; +} + +static BOOL __stdcall +MorePagerLine( + IN OUT PCON_PAGER Pager, + IN PCWCH line, + IN DWORD cch) +{ + DWORD ich; + + if (s_dwFlags & FLAG_PLUSn) /* Skip lines */ + { + if (Pager->lineno < s_nNextLineNo) + { + Pager->dwFlags |= CON_PAGER_FLAG_DONT_OUTPUT; + s_bPrevLineIsBlank = FALSE; + return TRUE; /* Don't output */ + } + s_dwFlags &= ~FLAG_PLUSn; + } + + if (s_dwFlags & FLAG_S) /* Shrink blank lines */ + { + if (IsBlankLine(line, cch)) + { + if (s_bPrevLineIsBlank) + { + Pager->dwFlags |= CON_PAGER_FLAG_DONT_OUTPUT; + return TRUE; /* Don't output */ + } + + for (ich = 0; ich < cch; ++ich) + { + if (line[ich] == L'\n') + { + s_bPrevLineIsBlank = TRUE; + break; + } + } + } + else + { + s_bPrevLineIsBlank = FALSE; + } + } + + s_nNextLineNo = 0; + return FALSE; /* Do output */ +}
static BOOL __stdcall PagePrompt(PCON_PAGER Pager, DWORD Done, DWORD Total) { HANDLE hInput = ConStreamGetOSHandle(StdIn); + HANDLE hOutput = ConStreamGetOSHandle(Pager->Screen->Stream); + CONSOLE_SCREEN_BUFFER_INFO csbi; + COORD orgCursorPosition; DWORD dwMode; + KEY_EVENT_RECORD KeyEvent; + BOOL fCtrl; + DWORD nLines; + WCHAR chSubCommand = 0; + +Restart: + nLines = 0;
/* * Just use the simple prompt if the file being displayed is the STDIN, @@ -88,16 +174,18 @@ PagePrompt(PCON_PAGER Pager, DWORD Done, DWORD Total) } else { - ConResPrintf(Pager->Screen->Stream, IDS_CONTINUE_PROGRESS, - // (dwSumReadChars - Total + Done) * 100 / dwFileSize - (dwSumReadBytes - (Total - Done) * - (dwSumReadBytes / dwSumReadChars)) * 100 / dwFileSize - ); + DWORD dwPercent = (dwSumReadBytes - (Total - Done) * + (dwSumReadBytes / dwSumReadChars)) * 100 / dwFileSize; + if (s_nPromptID == IDS_CONTINUE_LINE_AT) + { + ConResPrintf(Pager->Screen->Stream, s_nPromptID, dwPercent, Pager->lineno); + } + else + { + ConResPrintf(Pager->Screen->Stream, s_nPromptID, dwPercent); + } } - - // TODO: Implement prompt read line! - - // FIXME: Does not support TTY yet! + s_nPromptID = IDS_CONTINUE_PROGRESS;
/* RemoveBreakHandler */ SetConsoleCtrlHandler(NULL, TRUE); @@ -106,25 +194,98 @@ PagePrompt(PCON_PAGER Pager, DWORD Done, DWORD Total) dwMode &= ~ENABLE_PROCESSED_INPUT; SetConsoleMode(hInput, dwMode);
- do + // FIXME: Does not support TTY yet! + ConGetScreenInfo(Pager->Screen, &csbi); + orgCursorPosition = csbi.dwCursorPosition; + for (;;) { - // FIXME: Does not support TTY yet! - - // ConInKey(&KeyEvent); - INPUT_RECORD ir; + INPUT_RECORD ir = {0}; DWORD dwRead; + WCHAR ch; + do { ReadConsoleInput(hInput, &ir, 1, &dwRead); } while ((ir.EventType != KEY_EVENT) || (!ir.Event.KeyEvent.bKeyDown));
- /* Got our key, return to caller */ + /* Got our key */ KeyEvent = ir.Event.KeyEvent; + + /* Ignore any unsupported keyboard press */ + if ((KeyEvent.wVirtualKeyCode == VK_SHIFT) || + (KeyEvent.wVirtualKeyCode == VK_MENU) || + (KeyEvent.wVirtualKeyCode == VK_CONTROL)) + { + continue; + } + + /* Ctrl key is pressed? */ + fCtrl = !!(KeyEvent.dwControlKeyState & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED)); + + /* Ctrl+C or Ctrl+Esc? */ + if (fCtrl && ((KeyEvent.wVirtualKeyCode == VK_ESCAPE) || + (KeyEvent.wVirtualKeyCode == L'C'))) + { + chSubCommand = 0; + break; + } + + /* If extended features are unavailable, or no + * pending commands, don't do more processing. */ + if (!(s_dwFlags & FLAG_E) || (chSubCommand == 0)) + break; + + ch = KeyEvent.uChar.UnicodeChar; + if (L'0' <= ch && ch <= L'9') + { + nLines *= 10; + nLines += ch - L'0'; + ConStreamWrite(Pager->Screen->Stream, &ch, 1); + continue; + } + else if (KeyEvent.wVirtualKeyCode == VK_RETURN) + { + /* Validate the line number */ + break; + } + else if (KeyEvent.wVirtualKeyCode == VK_ESCAPE) + { + /* Cancel the current command */ + chSubCommand = 0; + break; + } + else if (KeyEvent.wVirtualKeyCode == VK_BACK) + { + if (nLines != 0) + nLines /= 10; + + /* Erase the current character */ + ConGetScreenInfo(Pager->Screen, &csbi); + if ( (csbi.dwCursorPosition.Y > orgCursorPosition.Y) || + ((csbi.dwCursorPosition.Y == orgCursorPosition.Y) && + (csbi.dwCursorPosition.X > orgCursorPosition.X)) ) + { + if (csbi.dwCursorPosition.X > 0) + { + csbi.dwCursorPosition.X = csbi.dwCursorPosition.X - 1; + } + else if (csbi.dwCursorPosition.Y > 0) + { + csbi.dwCursorPosition.Y = csbi.dwCursorPosition.Y - 1; + csbi.dwCursorPosition.X = (csbi.dwSize.X ? csbi.dwSize.X - 1 : 0); + } + + SetConsoleCursorPosition(hOutput, csbi.dwCursorPosition); + + ch = L' '; + ConStreamWrite(Pager->Screen->Stream, &ch, 1); + SetConsoleCursorPosition(hOutput, csbi.dwCursorPosition); + } + + continue; + } } - while ((KeyEvent.wVirtualKeyCode == VK_SHIFT) || - (KeyEvent.wVirtualKeyCode == VK_MENU) || - (KeyEvent.wVirtualKeyCode == VK_CONTROL));
/* AddBreakHandler */ SetConsoleCtrlHandler(NULL, FALSE); @@ -140,9 +301,8 @@ PagePrompt(PCON_PAGER Pager, DWORD Done, DWORD Total) ConClearLine(Pager->Screen->Stream);
/* Ctrl+C or Ctrl+Esc: Control Break */ - if ((KeyEvent.wVirtualKeyCode == VK_ESCAPE) || - ((KeyEvent.wVirtualKeyCode == L'C') && - (KeyEvent.dwControlKeyState & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED)))) + if (fCtrl && ((KeyEvent.wVirtualKeyCode == VK_ESCAPE) || + (KeyEvent.wVirtualKeyCode == L'C'))) { /* We break, output a newline */ WCHAR ch = L'\n'; @@ -150,18 +310,114 @@ PagePrompt(PCON_PAGER Pager, DWORD Done, DWORD Total) return FALSE; }
- /* 'Q': Quit */ - // FIXME: Available only when command extensions are enabled. - if ((KeyEvent.wVirtualKeyCode == L'Q') && - !(KeyEvent.dwControlKeyState & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED))) + switch (chSubCommand) { - /* We break, output a newline */ - WCHAR ch = L'\n'; - ConStreamWrite(Pager->Screen->Stream, &ch, 1); - return FALSE; + case L'P': + { + /* If we don't display other lines, just restart the prompt */ + if (nLines == 0) + { + chSubCommand = 0; + goto Restart; + } + /* Otherwise tell the pager to display them */ + Pager->ScrollRows = nLines; + return TRUE; + } + case L'S': + { + s_dwFlags |= FLAG_PLUSn; + s_nNextLineNo = Pager->lineno + nLines; + return TRUE; + } + default: + chSubCommand = 0; + break; }
- return TRUE; + /* If extended features are available */ + if (s_dwFlags & FLAG_E) + { + /* Ignore any key presses if Ctrl is pressed */ + if (fCtrl) + { + chSubCommand = 0; + goto Restart; + } + + /* 'Q': Quit */ + if (KeyEvent.wVirtualKeyCode == L'Q') + { + /* We break, output a newline */ + WCHAR ch = L'\n'; + ConStreamWrite(Pager->Screen->Stream, &ch, 1); + return FALSE; + } + + /* 'F': Next file */ + if (KeyEvent.wVirtualKeyCode == L'F') + { + s_bDoNextFile = TRUE; + return FALSE; + } + + /* '?': Show Options */ + if (KeyEvent.uChar.UnicodeChar == L'?') + { + s_nPromptID = IDS_CONTINUE_OPTIONS; + goto Restart; + } + + /* [Enter] key: Display one line */ + if (KeyEvent.wVirtualKeyCode == VK_RETURN) + { + Pager->ScrollRows = 1; + return TRUE; + } + + /* [Space] key: Display one page */ + if (KeyEvent.wVirtualKeyCode == VK_SPACE) + { + if (s_dwFlags & FLAG_C) + { + /* Clear the screen */ + ConClearScreen(Pager->Screen); + } + return TRUE; + } + + /* 'P': Display n lines */ + if (KeyEvent.wVirtualKeyCode == L'P') + { + s_nPromptID = IDS_CONTINUE_LINES; + chSubCommand = L'P'; + goto Restart; + } + + /* 'S': Skip n lines */ + if (KeyEvent.wVirtualKeyCode == L'S') + { + s_nPromptID = IDS_CONTINUE_LINES; + chSubCommand = L'S'; + goto Restart; + } + + /* '=': Show current line number */ + if (KeyEvent.uChar.UnicodeChar == L'=') + { + s_nPromptID = IDS_CONTINUE_LINE_AT; + goto Restart; + } + + s_nPromptID = IDS_CONTINUE_PROGRESS; + chSubCommand = 0; + goto Restart; + } + else + { + /* Extended features are unavailable: display one page */ + return TRUE; + } }
/* @@ -445,7 +701,6 @@ FileGetString( return TRUE; }
- static VOID LoadRegistrySettings(HKEY hKeyRoot) { @@ -456,7 +711,8 @@ LoadRegistrySettings(HKEY hKeyRoot) * Buffer big enough to hold the string L"4294967295", * corresponding to the literal 0xFFFFFFFF (MAXULONG) in decimal. */ - DWORD Buffer[6]; + WCHAR Buffer[sizeof("4294967295")]; + C_ASSERT(sizeof(Buffer) >= sizeof(DWORD));
lRet = RegOpenKeyExW(hKeyRoot, L"Software\Microsoft\Command Processor", @@ -471,7 +727,7 @@ LoadRegistrySettings(HKEY hKeyRoot) L"EnableExtensions", NULL, &dwType, - (LPBYTE)&Buffer, + (PBYTE)&Buffer, &len); if (lRet == ERROR_SUCCESS) { @@ -486,6 +742,138 @@ LoadRegistrySettings(HKEY hKeyRoot) RegCloseKey(hKey); }
+static BOOL IsFlag(PCWSTR param) +{ + PCWSTR pch; + PWCHAR endptr; + + if (param[0] == L'/') + return TRUE; + + if (param[0] == L'+') + { + pch = param + 1; + if (*pch) + { + (void)wcstol(pch, &endptr, 10); + return (*endptr == 0); + } + } + return FALSE; +} + +static BOOL ParseArgument(PCWSTR arg, BOOL* pbHasFiles) +{ + PWCHAR endptr; + + if (arg[0] == L'/') + { + switch (towupper(arg[1])) + { + case L'?': + if (arg[2] == 0) + { + s_dwFlags |= FLAG_HELP; + return TRUE; + } + break; + case L'E': + if (arg[2] == 0) + { + s_dwFlags |= FLAG_E; + return TRUE; + } + break; + case L'C': + if (arg[2] == 0) + { + s_dwFlags |= FLAG_C; + return TRUE; + } + break; + case L'P': + if (arg[2] == 0) + { + s_dwFlags |= FLAG_P; + return TRUE; + } + break; + case L'S': + if (arg[2] == 0) + { + s_dwFlags |= FLAG_S; + return TRUE; + } + break; + case L'T': + if (arg[2] != 0) + { + s_dwFlags |= FLAG_Tn; + s_nTabWidth = wcstol(&arg[2], &endptr, 10); + if (*endptr == 0) + return TRUE; + } + break; + default: + break; + } + } + else if (arg[0] == L'+') + { + if (arg[1] != 0) + { + s_dwFlags |= FLAG_PLUSn; + s_nNextLineNo = wcstol(&arg[1], &endptr, 10) + 1; + if (*endptr == 0) + return TRUE; + } + } + + if (IsFlag(arg)) + { + ConResPrintf(StdErr, IDS_BAD_FLAG, arg); + return FALSE; + } + else + { + *pbHasFiles = TRUE; + } + + return TRUE; +} + +static BOOL ParseMoreVariable(BOOL* pbHasFiles) +{ + BOOL ret = TRUE; + PWSTR psz; + PWCHAR pch; + DWORD cch; + + cch = GetEnvironmentVariableW(L"MORE", NULL, 0); + if (cch == 0) + return TRUE; + + psz = (PWSTR)malloc((cch + 1) * sizeof(WCHAR)); + if (!psz) + return TRUE; + + if (!GetEnvironmentVariableW(L"MORE", psz, cch + 1)) + { + free(psz); + return TRUE; + } + + for (pch = wcstok(psz, L" "); pch; pch = wcstok(NULL, L" ")) + { + ret = ParseArgument(pch, pbHasFiles); + if (!ret) + break; + } + + free(psz); + return ret; +} + // INT CommandMore(LPTSTR cmd, LPTSTR param) int wmain(int argc, WCHAR* argv[]) { @@ -499,12 +887,13 @@ int wmain(int argc, WCHAR* argv[])
ENCODING Encoding; DWORD SkipBytes = 0; + BOOL HasFiles;
#define FileCacheBufferSize 4096 PVOID FileCacheBuffer = NULL; PWCHAR StringBuffer = NULL; DWORD StringBufferLength = 0; - DWORD dwReadBytes, dwReadChars; + DWORD dwReadBytes = 0, dwReadChars = 0;
TCHAR szFullPath[MAX_PATH];
@@ -529,13 +918,8 @@ int wmain(int argc, WCHAR* argv[]) /* Load the registry settings */ LoadRegistrySettings(HKEY_LOCAL_MACHINE); LoadRegistrySettings(HKEY_CURRENT_USER); - - // TODO: First, load the "MORE" environment variable and parse it, - // then parse the command-line parameters. - - // FIXME: Parse all the remaining parameters. - // Then the file list can be found at the very end. - // FIXME2: Use the PARSER api that can be found in EVENTCREATE. + if (bEnableExtensions) + s_dwFlags |= FLAG_E;
// NOTE: We might try to duplicate the ConOut for read access... ? hKeyboard = CreateFileW(L"CONIN$", GENERIC_READ|GENERIC_WRITE, @@ -544,7 +928,6 @@ int wmain(int argc, WCHAR* argv[]) FlushConsoleInputBuffer(hKeyboard); ConStreamSetOSHandle(StdIn, hKeyboard);
- FileCacheBuffer = HeapAlloc(GetProcessHeap(), 0, FileCacheBufferSize); if (!FileCacheBuffer) { @@ -553,8 +936,31 @@ int wmain(int argc, WCHAR* argv[]) return 1; }
+ /* First, load the "MORE" environment variable and parse it, + * then parse the command-line parameters. */ + HasFiles = FALSE; + if (!ParseMoreVariable(&HasFiles)) + return 1; + for (i = 1; i < argc; i++) + { + if (!ParseArgument(argv[i], &HasFiles)) + return 1; + } + + if (s_dwFlags & FLAG_HELP) + { + ConResPuts(StdOut, IDS_USAGE); + return 0; + } + + Pager.PagerLine = MorePagerLine; + Pager.dwFlags |= CON_PAGER_FLAG_EXPAND_TABS; + if (s_dwFlags & FLAG_P) + Pager.dwFlags |= CON_PAGER_FLAG_EXPAND_FF; + Pager.nTabWidth = s_nTabWidth; + /* Special case where we run 'MORE' without any argument: we use STDIN */ - if (argc <= 1) + if (!HasFiles) { /* * Assign STDIN handle to hFile so that the page prompt function will @@ -572,6 +978,7 @@ int wmain(int argc, WCHAR* argv[]) // SetFilePointer(hFile, 0, NULL, FILE_BEGIN); Encoding = ENCODING_ANSI; // ENCODING_UTF8;
+ /* Start paging */ bContinue = ConPutsPaging(&Pager, PagePrompt, TRUE, L""); if (!bContinue) goto Quit; @@ -596,7 +1003,7 @@ int wmain(int argc, WCHAR* argv[]) StringBuffer, dwReadChars); /* If we Ctrl-C/Ctrl-Break, stop everything */ if (!bContinue) - goto Quit; + break; } while (bRet && dwReadBytes > 0); goto Quit; @@ -605,6 +1012,9 @@ int wmain(int argc, WCHAR* argv[]) /* We have files: read them and output them to STDOUT */ for (i = 1; i < argc; i++) { + if (IsFlag(argv[i])) + continue; + GetFullPathNameW(argv[i], ARRAYSIZE(szFullPath), szFullPath, NULL); hFile = CreateFileW(szFullPath, GENERIC_READ, @@ -616,7 +1026,7 @@ int wmain(int argc, WCHAR* argv[]) if (hFile == INVALID_HANDLE_VALUE) { ConResPrintf(StdErr, IDS_FILE_ACCESS, szFullPath); - continue; + goto Quit; }
/* We currently do not support files too big */ @@ -636,13 +1046,27 @@ int wmain(int argc, WCHAR* argv[]) IsDataUnicode(FileCacheBuffer, dwReadBytes, &Encoding, &SkipBytes); SetFilePointer(hFile, SkipBytes, NULL, FILE_BEGIN);
+ /* Reset state for paging */ + s_bPrevLineIsBlank = FALSE; + s_nPromptID = IDS_CONTINUE_PROGRESS; + s_bDoNextFile = FALSE; + /* Update the statistics for PagePrompt */ dwSumReadBytes = dwSumReadChars = 0;
+ /* Start paging */ bContinue = ConPutsPaging(&Pager, PagePrompt, TRUE, L""); if (!bContinue) { + /* We stop displaying this file */ CloseHandle(hFile); + if (s_bDoNextFile) + { + /* Bail out and continue with the other files */ + continue; + } + + /* We Ctrl-C/Ctrl-Break, stop everything */ goto Quit; }
@@ -655,8 +1079,8 @@ int wmain(int argc, WCHAR* argv[]) if (!bRet || dwReadBytes == 0 || dwReadChars == 0) { /* - * We failed at reading the file, bail out and - * continue with the other files. + * We failed at reading the file, bail out + * and continue with the other files. */ break; } @@ -675,16 +1099,28 @@ int wmain(int argc, WCHAR* argv[]) bContinue = ConWritePaging(&Pager, PagePrompt, FALSE, StringBuffer, dwReadChars); } - /* If we Ctrl-C/Ctrl-Break, stop everything */ if (!bContinue) { - CloseHandle(hFile); - goto Quit; + /* We stop displaying this file */ + break; } } while (bRet && dwReadBytes > 0);
CloseHandle(hFile); + + /* Check whether we should stop displaying this file */ + if (!bContinue) + { + if (s_bDoNextFile) + { + /* Bail out and continue with the other files */ + continue; + } + + /* We Ctrl-C/Ctrl-Break, stop everything */ + goto Quit; + } }
Quit: diff --git a/base/applications/cmdutils/more/resource.h b/base/applications/cmdutils/more/resource.h index dc077bbfc8a..b477bcc0847 100644 --- a/base/applications/cmdutils/more/resource.h +++ b/base/applications/cmdutils/more/resource.h @@ -4,3 +4,7 @@ #define IDS_CONTINUE 101 #define IDS_CONTINUE_PROGRESS 102 #define IDS_FILE_ACCESS 103 +#define IDS_BAD_FLAG 104 +#define IDS_CONTINUE_OPTIONS 105 +#define IDS_CONTINUE_LINES 106 +#define IDS_CONTINUE_LINE_AT 107 diff --git a/sdk/lib/conutils/pager.c b/sdk/lib/conutils/pager.c index 834590665f9..24d0849f546 100644 --- a/sdk/lib/conutils/pager.c +++ b/sdk/lib/conutils/pager.c @@ -2,8 +2,8 @@ * PROJECT: ReactOS Console Utilities Library * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+) * PURPOSE: Console/terminal paging functionality. - * COPYRIGHT: Copyright 2017-2018 ReactOS Team - * Copyright 2017-2018 Hermes Belusca-Maito + * COPYRIGHT: Copyright 2017-2021 Hermes Belusca-Maito + * Copyright 2021 Katayama Hirofumi MZ */
/** @@ -21,6 +21,7 @@ #include <winbase.h> // #include <winnls.h> #include <wincon.h> // Console APIs (only if kernel32 support included) +#include <winnls.h> // for WideCharToMultiByte #include <strsafe.h>
#include "conutils.h" @@ -31,7 +32,240 @@ // Temporary HACK #define CON_STREAM_WRITE ConStreamWrite
+#define CP_SHIFTJIS 932 // Japanese Shift-JIS +#define CP_HANGUL 949 // Korean Hangul/Wansung +#define CP_JOHAB 1361 // Korean Johab +#define CP_GB2312 936 // Chinese Simplified (GB2312) +#define CP_BIG5 950 // Chinese Traditional (Big5)
+/* IsFarEastCP(CodePage) */ +#define IsCJKCodePage(CodePage) \ + ((CodePage) == CP_SHIFTJIS || (CodePage) == CP_HANGUL || \ + /* (CodePage) == CP_JOHAB || */ \ + (CodePage) == CP_BIG5 || (CodePage) == CP_GB2312) + +static inline INT +GetWidthOfCharCJK( + IN UINT nCodePage, + IN WCHAR ch) +{ + INT ret = WideCharToMultiByte(nCodePage, 0, &ch, 1, NULL, 0, NULL, NULL); + if (ret == 0) + ret = 1; + else if (ret > 2) + ret = 2; + return ret; +} + +static VOID +ConCallPagerLine( + IN OUT PCON_PAGER Pager, + IN PCTCH line, + IN DWORD cch) +{ + Pager->dwFlags &= ~CON_PAGER_FLAG_DONT_OUTPUT; /* Clear the flag */ + + if (!Pager->PagerLine || !Pager->PagerLine(Pager, line, cch)) + CON_STREAM_WRITE(Pager->Screen->Stream, line, cch); +} + +static BOOL +ConPagerWorker(IN PCON_PAGER Pager) +{ + const DWORD ScreenColumns = Pager->ScreenColumns; + const DWORD ScrollRows = Pager->ScrollRows; + const PCTCH TextBuff = Pager->TextBuff; + const DWORD cch = Pager->cch; + + BOOL bFinitePaging = ((ScreenColumns > 0) && (Pager->ScreenRows > 0)); + LONG nTabWidth = Pager->nTabWidth; + + DWORD ich = Pager->ich; + DWORD iColumn = Pager->iColumn; + DWORD iLine = Pager->iLine; + DWORD lineno = Pager->lineno; + + DWORD ichStart = ich; + UINT nCodePage; + BOOL IsCJK; + UINT nWidthOfChar = 1; + BOOL IsDoubleWidthCharTrailing = FALSE; + + if (ich >= cch) + return FALSE; + + nCodePage = GetConsoleOutputCP(); + IsCJK = IsCJKCodePage(nCodePage); + + /* Normalize the tab width: if negative or too large, + * cap it to the number of columns. */ + if (ScreenColumns > 0) // if (bFinitePaging) + { + if (nTabWidth < 0) + nTabWidth = ScreenColumns - 1; + else + nTabWidth = min(nTabWidth, ScreenColumns - 1); + } + else + { + /* If no column width is known, default to 8 spaces if the + * original value is negative; otherwise keep the current one. */ + if (nTabWidth < 0) + nTabWidth = 8; + } + + if (Pager->dwFlags & CON_PAGER_FLAG_EXPAND_TABS) + { +ExpandTab: + while (Pager->nSpacePending > 0) + { + /* Stop now if we have displayed more screen lines than requested */ + if (bFinitePaging && (iLine >= ScrollRows)) + break; + + ConCallPagerLine(Pager, L" ", 1); + --(Pager->nSpacePending); + ++iColumn; + if ((ScreenColumns > 0) && (iColumn % ScreenColumns == 0)) + { + if (!(Pager->dwFlags & CON_PAGER_FLAG_DONT_OUTPUT)) + ++iLine; + } + } + } + + /* Loop over each character in the buffer */ + for (; ich < cch; ++ich) + { + /* Stop now if we have displayed more screen lines than requested */ + if (bFinitePaging && (iLine >= ScrollRows)) + break; + + Pager->lineno = lineno; + + /* NEWLINE character */ + if (TextBuff[ich] == TEXT('\n')) + { + /* Output the pending text, including the newline */ + ConCallPagerLine(Pager, &TextBuff[ichStart], ich - ichStart + 1); + ichStart = ich + 1; + if (!(Pager->dwFlags & CON_PAGER_FLAG_DONT_OUTPUT)) + ++iLine; + iColumn = 0; + + /* Done with this line; start a new one */ + ++lineno; + continue; + } + + /* TAB character */ + if (TextBuff[ich] == TEXT('\t') && + (Pager->dwFlags & CON_PAGER_FLAG_EXPAND_TABS)) + { + /* Output the pending text */ + ConCallPagerLine(Pager, &TextBuff[ichStart], ich - ichStart); + + /* Perform tab expansion, unless the tab width is zero */ + if (nTabWidth == 0) + { + ichStart = ich + 1; + continue; + } + ichStart = ++ich; + Pager->nSpacePending += nTabWidth - (iColumn % nTabWidth); + goto ExpandTab; + } + + /* FORM-FEED character */ + if (TextBuff[ich] == TEXT('\f') && + (Pager->dwFlags & CON_PAGER_FLAG_EXPAND_FF)) + { + /* Output the pending text, skipping the form-feed */ + ConCallPagerLine(Pager, &TextBuff[ichStart], ich - ichStart); + ichStart = ich + 1; + // FIXME: Should we handle CON_PAGER_FLAG_DONT_OUTPUT ? + + if (bFinitePaging) + { + /* Clear until the end of the screen */ + while (iLine < ScrollRows) + { + ConCallPagerLine(Pager, L"\n", 1); + // CON_STREAM_WRITE(Pager->Screen->Stream, TEXT("\n"), 1); + // if (!(Pager->dwFlags & CON_PAGER_FLAG_DONT_OUTPUT)) + ++iLine; + } + } + else + { + /* Just output a FORM-FEED character */ + ConCallPagerLine(Pager, L"\f", 1); + // CON_STREAM_WRITE(Pager->Screen->Stream, L"\f", 1); + } + + iColumn = 0; + continue; + } + + /* Other character - Handle double-width for CJK */ + + if (IsCJK) + { + nWidthOfChar = GetWidthOfCharCJK(nCodePage, TextBuff[ich]); + if (ScreenColumns > 0) + { + IsDoubleWidthCharTrailing = (nWidthOfChar == 2) && + ((iColumn + 1) % ScreenColumns == 0); + } + } + + /* Care about CJK character presentation only when outputting + * to a device where the number of columns is known. */ + if (ScreenColumns > 0) + { + if ((iColumn + nWidthOfChar) % ScreenColumns == 0) + { + /* Output the pending text, including the last double-width character */ + ConCallPagerLine(Pager, &TextBuff[ichStart], ich - ichStart + 1); + ichStart = ich + 1; + if (!(Pager->dwFlags & CON_PAGER_FLAG_DONT_OUTPUT)) + ++iLine; + iColumn += nWidthOfChar; + continue; + } + + if (IsDoubleWidthCharTrailing) + { + /* Output the pending text, excluding the last double-width character */ + ConCallPagerLine(Pager, &TextBuff[ichStart], ich - ichStart); + ichStart = ich; + if (!(Pager->dwFlags & CON_PAGER_FLAG_DONT_OUTPUT)) + CON_STREAM_WRITE(Pager->Screen->Stream, TEXT(" "), 1); + --ich; + if (!(Pager->dwFlags & CON_PAGER_FLAG_DONT_OUTPUT)) + ++iLine; + ++iColumn; + continue; + } + } + + iColumn += nWidthOfChar; + } + + /* Output the remaining text */ + if (ich - ichStart > 0) + ConCallPagerLine(Pager, &TextBuff[ichStart], ich - ichStart); + + if (iLine >= ScrollRows) + iLine = 0; /* Reset the count of lines being printed */ + + Pager->ich = ich; + Pager->iColumn = iColumn; + Pager->iLine = iLine; + Pager->lineno = lineno; + + return (ich < cch); +}
/* Returns TRUE when all the text is displayed, and FALSE if display is stopped */ BOOL @@ -43,75 +277,80 @@ ConWritePaging( IN DWORD len) { CONSOLE_SCREEN_BUFFER_INFO csbi; - - /* Used to see how big the screen is */ - DWORD ScreenLines = 0; - - /* Chars since start of line */ - DWORD CharSL; - - DWORD from = 0, i = 0; + BOOL bIsConsole;
/* Parameters validation */ if (!Pager) return FALSE;
- /* Reset LineCount and return if no string has been given */ - if (StartPaging == TRUE) - Pager->LineCount = 0; - if (szStr == NULL) - return TRUE; - /* Get the size of the visual screen that can be printed to */ - if (!ConGetScreenInfo(Pager->Screen, &csbi)) + bIsConsole = ConGetScreenInfo(Pager->Screen, &csbi); + if (bIsConsole) + { + /* Calculate the console screen extent */ + Pager->ScreenColumns = csbi.srWindow.Right - csbi.srWindow.Left + 1; + Pager->ScreenRows = csbi.srWindow.Bottom - csbi.srWindow.Top + 1; + } + else { /* We assume it's a file handle */ - CON_STREAM_WRITE(Pager->Screen->Stream, szStr, len); - return TRUE; + Pager->ScreenColumns = 0; + Pager->ScreenRows = 0; }
- /* - * Get the number of lines currently displayed on screen, minus 1 - * to account for the "press any key..." prompt from PagePrompt(). - */ - ScreenLines = (csbi.srWindow.Bottom - csbi.srWindow.Top); - CharSL = csbi.dwCursorPosition.X; - - /* Make sure the user doesn't have the screen too small */ - if (ScreenLines < 4) + if (StartPaging) { - CON_STREAM_WRITE(Pager->Screen->Stream, szStr, len); - return TRUE; + if (bIsConsole) + { + /* Reset to display one page by default */ + Pager->ScrollRows = Pager->ScreenRows - 1; + } + else + { + /* File output: all lines are displayed at once; reset to a default value */ + Pager->ScrollRows = 0; + } }
- while (i < len) + if (StartPaging) { - /* Search until the end of a line is reached */ - if (szStr[i++] != TEXT('\n') && ++CharSL < csbi.dwSize.X) - continue; + /* Reset the output line count, the column index and the line number */ + Pager->iLine = 0; + Pager->iColumn = 0; + Pager->lineno = 1; + Pager->nSpacePending = 0; + } + + Pager->TextBuff = szStr; + Pager->cch = len; + Pager->ich = 0;
- Pager->LineCount++; - CharSL = 0; + if (len == 0 || szStr == NULL) + return TRUE;
- if (Pager->LineCount >= ScreenLines) + while (ConPagerWorker(Pager)) + { + /* Prompt the user only when we display to a console and the screen + * is not too small: at least one line for the actual paged text and + * one line for the prompt. */ + if (bIsConsole && (Pager->ScreenRows >= 2)) { - CON_STREAM_WRITE(Pager->Screen->Stream, &szStr[from], i-from); - from = i; + /* Reset to display one page by default */ + Pager->ScrollRows = Pager->ScreenRows - 1;
/* Prompt the user; give him some values for statistics */ - // FIXME TODO: The prompt proc can also take ScreenLines ?? - if (!PagePrompt(Pager, from, len)) + if (!PagePrompt(Pager, Pager->ich, Pager->cch)) return FALSE; + }
- // TODO: Recalculate 'ScreenLines' in case the user redimensions - // the window during the prompt. - - /* Reset the number of lines being printed */ - Pager->LineCount = 0; + /* If we display to a console, recalculate its screen extent + * in case the user has redimensioned it during the prompt. */ + if (bIsConsole && ConGetScreenInfo(Pager->Screen, &csbi)) + { + Pager->ScreenColumns = csbi.srWindow.Right - csbi.srWindow.Left + 1; + Pager->ScreenRows = csbi.srWindow.Bottom - csbi.srWindow.Top + 1; } } - if (i > from) - CON_STREAM_WRITE(Pager->Screen->Stream, &szStr[from], i-from);
return TRUE; } diff --git a/sdk/lib/conutils/pager.h b/sdk/lib/conutils/pager.h index 31a3ba86970..61bbad6416c 100644 --- a/sdk/lib/conutils/pager.h +++ b/sdk/lib/conutils/pager.h @@ -2,8 +2,8 @@ * PROJECT: ReactOS Console Utilities Library * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+) * PURPOSE: Console/terminal paging functionality. - * COPYRIGHT: Copyright 2017-2018 ReactOS Team - * Copyright 2017-2018 Hermes Belusca-Maito + * COPYRIGHT: Copyright 2017-2021 Hermes Belusca-Maito + * Copyright 2021 Katayama Hirofumi MZ */
/** @@ -26,27 +26,50 @@ extern "C" { #endif
- // #include <wincon.h>
+struct _CON_PAGER; +typedef BOOL (__stdcall *CON_PAGER_LINE_FN)( + IN OUT struct _CON_PAGER *Pager, + IN PCTCH line, + IN DWORD cch); + +/* Flags for CON_PAGER */ +#define CON_PAGER_FLAG_DONT_OUTPUT (1 << 0) +#define CON_PAGER_FLAG_EXPAND_TABS (1 << 1) +#define CON_PAGER_FLAG_EXPAND_FF (1 << 2)
typedef struct _CON_PAGER { + /* Console screen properties */ PCON_SCREEN Screen; - - // TODO: Add more properties. Maybe those extra parameters - // of PAGE_PROMPT could go there? - - /* Used to count number of lines since last pause */ - DWORD LineCount; + DWORD ScreenColumns; + DWORD ScreenRows; + + /* Paging parameters */ + CON_PAGER_LINE_FN PagerLine; /* The line function */ + LONG nTabWidth; + DWORD ScrollRows; + + /* Data buffer */ + PCTCH TextBuff; /* The text buffer */ + DWORD cch; /* The total number of characters */ + + /* Paging state */ + DWORD ich; /* The current index of character */ + DWORD iColumn; /* The current index of column */ + DWORD iLine; /* The physical output line count of screen */ + DWORD lineno; /* The logical line number */ + DWORD dwFlags; /* The CON_PAGER_FLAG_... flags */ + DWORD nSpacePending; } CON_PAGER, *PCON_PAGER;
#define INIT_CON_PAGER(pScreen) {(pScreen), 0}
-#define InitializeConPager(pPager, pScreen) \ +#define InitializeConPager(pPager, pScreen) \ do { \ - (pPager)->Screen = (pScreen); \ - (pPager)->LineCount = 0; \ + ZeroMemory((pPager), sizeof(*(pPager))); \ + (pPager)->Screen = (pScreen); \ } while (0)