Merge branch 'utf-8' into master

resolve conflicts:
	configure.ac
	src/complete.c
	src/file.c
	src/layout.c
	src/main.c
	src/menu.c
	src/screen.c
	src/util.c
	src/widget.c
	src/widget.h
This commit is contained in:
Ilia Maslakov 2009-04-04 19:50:46 +00:00
commit 3b5e2c052f
77 changed files with 18476 additions and 13118 deletions

View File

@ -428,13 +428,20 @@ dnl
AC_DEFUN([MC_WITH_NCURSES], [
dnl has_colors() is specific to ncurses, it's not in the old curses
save_LIBS="$LIBS"
ncursesw_found=
LIBS=
AC_SEARCH_LIBS([addwstr], [ncursesw ncurses curses], [MCLIBS="$MCLIBS $LIBS";ncursesw_found=yes],
[AC_MSG_WARN([Cannot find ncurses library, that support wide characters])])
if test -z "$ncursesw_found"; then
LIBS=
AC_SEARCH_LIBS([has_colors], [ncurses curses], [MCLIBS="$MCLIBS $LIBS"],
[AC_MSG_ERROR([Cannot find ncurses library])])
fi
dnl Check the header
ncurses_h_found=
AC_CHECK_HEADERS([ncurses/curses.h ncurses.h curses.h],
AC_CHECK_HEADERS([ncursesw/curses.h ncurses/curses.h ncurses.h curses.h],
[ncurses_h_found=yes; break])
if test -z "$ncurses_h_found"; then
@ -464,6 +471,52 @@ AC_DEFUN([MC_WITH_NCURSES], [
LIBS="$save_LIBS"
])
dnl
dnl Use the ncurses library. It can only be requested explicitly,
dnl so just fail if anything goes wrong.
dnl
dnl If ncurses exports the ESCDELAY variable it should be set to 0
dnl or you'll have to press Esc three times to dismiss a dialog box.
dnl
AC_DEFUN([MC_WITH_NCURSESW], [
dnl has_colors() is specific to ncurses, it's not in the old curses
save_LIBS="$LIBS"
LIBS=
AC_SEARCH_LIBS([has_colors], [ncursesw], [MCLIBS="$MCLIBS $LIBS"],
[AC_MSG_ERROR([Cannot find ncursesw library])])
dnl Check the header
ncurses_h_found=
AC_CHECK_HEADERS([ncursesw/curses.h],
[ncursesw_h_found=yes; break])
if test -z "$ncursesw_h_found"; then
AC_MSG_ERROR([Cannot find ncursesw header file])
fi
screen_type=ncursesw
screen_msg="ncursesw library"
AC_DEFINE(USE_NCURSESW, 1,
[Define to use ncursesw for screen management])
AC_CACHE_CHECK([for ESCDELAY variable],
[mc_cv_ncursesw_escdelay],
[AC_TRY_LINK([], [
extern int ESCDELAY;
ESCDELAY = 0;
],
[mc_cv_ncursesw_escdelay=yes],
[mc_cv_ncursesw_escdelay=no])
])
if test "$mc_cv_ncursesw_escdelay" = yes; then
AC_DEFINE(HAVE_ESCDELAY, 1,
[Define if ncursesw has ESCDELAY variable])
fi
AC_CHECK_FUNCS(resizeterm)
LIBS="$save_LIBS"
])
dnl
dnl Check for ext2fs recovery code

View File

@ -459,6 +459,9 @@ xslang)
xncurses)
MC_WITH_NCURSES
;;
xncursesw)
MC_WITH_NCURSESW
;;
x)
MC_WITH_SLANG
;;

File diff suppressed because it is too large Load Diff

View File

@ -7,7 +7,7 @@
v v v mqv v v v mqu v v mj
qqqqqqCommander qj 
Ésta es la pantalla de inicio de la ayuda de
Ésta es la pantalla de inicio de la ayuda de
GNU Midnight Commander .
Puede pulsar la tecla IntroHow to use help para aprender a navegar por el
@ -15,11 +15,11 @@ sistema de ayuda, o acceder directamente a los contenidosContents.
GNU Midnight Commander es obra de sus numerosos autoresAUTHORS.
GNU Midnight Commander NO INCLUYE NINGÚN TIPO DE GARANTÍAWarranty,
es software libre, y se alienta su redistribución en los
terminos y condiciones que están contenidos en la Licencia
Pública General de GNU (GPL)Licencia GNU, de la que existe una
traducción no oficial al españolLicencia GNU (Español).[Licencia GNU]
GNU Midnight Commander NO INCLUYE NINGÚN TIPO DE GARANTÍAWarranty,
es software libre, y se alienta su redistribución en los
terminos y condiciones que están contenidos en la Licencia
Pública General de GNU (GPL)Licencia GNU, de la que existe una
traducción no oficial al españolLicencia GNU (Español).[Licencia GNU]
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
@ -430,26 +430,26 @@ to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU
Library General Public License instead of this License.
[Licencia GNU (Español)]
[Licencia GNU (Español)]
Licencia Pública GNU
Licencia Pública GNU
Esta es la conocida como GNU Public License (GPL), versión 2
Esta es la conocida como GNU Public License (GPL), versión 2
(de junio de 1.991), que cubre la mayor parte del software de
la Free Software Foundation, y muchos más programas.
la Free Software Foundation, y muchos más programas.
---
NOTA IMPORTANTE:
Esta es una traducción no oficial al español de la GNU General
Esta es una traducción no oficial al español de la GNU General
Public LicenseLicencia GNU.
No ha sido publicada por la Free Software Foundation, y no
establece legalmente las condiciones de distribución para el
establece legalmente las condiciones de distribución para el
software que usa la GNU GPL. Estas condiciones se establecen
solamente por el texto original, en inglés, de la GNU GPL. Sin
embargo, esperamos que esta traducción ayude a los
solamente por el texto original, en inglés, de la GNU GPL. Sin
embargo, esperamos que esta traducción ayude a los
hispanohablantes a entender mejor la GNU GPL.
@ -468,31 +468,31 @@ understand the GNU GPL better.
Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51
Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Se permite la copia y distribución de copias literales de este
documento, pero no se permite su modificación.
Se permite la copia y distribución de copias literales de este
documento, pero no se permite su modificación.
Preámbulo
Preámbulo
Las licencias que cubren la mayor parte del software están
diseñadas para quitarle a usted la libertad de compartirlo y
modificarlo. Por el contrario, la Licencia Pública General de
Las licencias que cubren la mayor parte del software están
diseñadas para quitarle a usted la libertad de compartirlo y
modificarlo. Por el contrario, la Licencia Pública General de
GNU pretende garantizarle la libertad de compartir y modificar
software libre, para asegurar que el software es libre para
todos sus usuarios. Esta Licencia Pública General se aplica a
todos sus usuarios. Esta Licencia Pública General se aplica a
la mayor parte del software de la Free Software Foundation y a
cualquier otro programa si sus autores se comprometen a
utilizarla. (Existe otro software de la Free Software
Foundation que está cubierto por la Licencia Pública General
de GNU para Bibliotecas). Si quiere, también puede aplicarla a
Foundation que está cubierto por la Licencia Pública General
de GNU para Bibliotecas). Si quiere, también puede aplicarla a
sus propios programas.
Cuando hablamos de software libre, estamos refiriéndonos a
libertad, no a precio. Nuestras Licencias Públicas Generales
están diseñadas para asegurarnos de que tenga la libertad de
Cuando hablamos de software libre, estamos refiriéndonos a
libertad, no a precio. Nuestras Licencias Públicas Generales
están diseñadas para asegurarnos de que tenga la libertad de
distribuir copias de software libre (y cobrar por ese servicio
si quiere), de que reciba el código fuente o que pueda
si quiere), de que reciba el código fuente o que pueda
conseguirlo si lo quiere, de que pueda modificar el software o
usar fragmentos de él en nuevos programas libres, y de que
usar fragmentos de él en nuevos programas libres, y de que
sepa que puede hacer todas estas cosas.
Para proteger sus derechos necesitamos algunas restricciones
@ -502,29 +502,29 @@ en ciertas obligaciones que le afectan si distribuye copias
del software, o si lo modifica.
Por ejemplo, si distribuye copias de uno de estos programas,
sea gratuitamente, o a cambio de una contraprestación, debe
sea gratuitamente, o a cambio de una contraprestación, debe
dar a los receptores todos los derechos que tiene. Debe
asegurarse de que ellos también reciben, o pueden conseguir,
el código fuente. Y debe mostrarles estas condiciones de forma
asegurarse de que ellos también reciben, o pueden conseguir,
el código fuente. Y debe mostrarles estas condiciones de forma
que conozcan sus derechos.
Protegemos sus derechos con la combinación de dos medidas:
Protegemos sus derechos con la combinación de dos medidas:
1. Ponemos el software bajo copyright y
2. le ofrecemos esta licencia, que le da permiso legal para
copiar, distribuir y/o modificar el software.
También, para la protección de cada autor y la nuestra propia,
También, para la protección de cada autor y la nuestra propia,
queremos asegurarnos de que todo el mundo comprende que no se
proporciona ninguna garantía para este software libre. Si el
software se modifica por cualquiera y éste a su vez lo
proporciona ninguna garantía para este software libre. Si el
software se modifica por cualquiera y éste a su vez lo
distribuye, queremos que sus receptores sepan que lo que
tienen no es el original, de forma que cualquier problema
introducido por otros no afecte a la reputación de los autores
introducido por otros no afecte a la reputación de los autores
originales.
Por último, cualquier programa libre está constantemente
Por último, cualquier programa libre está constantemente
amenazado por patentes sobre el software. Queremos evitar el
peligro de que los redistribuidores de un programa libre
obtengan patentes por su cuenta, convirtiendo de facto el
@ -532,52 +532,52 @@ programa en propietario. Para evitar esto, hemos dejado claro
que cualquier patente debe ser pedida para el uso libre de
cualquiera, o no ser pedida.
Los términos exactos y las condiciones para la copia,
distribución y modificación se exponen a continuación.
Los términos exactos y las condiciones para la copia,
distribución y modificación se exponen a continuación.
Términos y condiciones para la copia, distribución y
modificación
Términos y condiciones para la copia, distribución y
modificación
1. Esta Licencia se aplica a cualquier programa u otro tipo de
trabajo que contenga una nota colocada por el tenedor del
copyright diciendo que puede ser distribuido bajo los términos
de esta Licencia Pública General. En adelante, «Programa» se
referirá a cualquier programa o trabajo que cumpla esa
condición y «trabajo basado en el Programa» se referirá bien
al Programa o a cualquier trabajo derivado de él según la ley
copyright diciendo que puede ser distribuido bajo los términos
de esta Licencia Pública General. En adelante, «Programa» se
referirá a cualquier programa o trabajo que cumpla esa
condición y «trabajo basado en el Programa» se referirá bien
al Programa o a cualquier trabajo derivado de él según la ley
de copyright. Esto es, un trabajo que contenga el programa o
una porción de él, bien en forma literal o con modificaciones
y/o traducido en otro lenguaje. Por lo tanto, la traducción
está incluida sin limitaciones en el término «modificación».
Cada concesionario (licenciatario) será denominado «usted».
una porción de él, bien en forma literal o con modificaciones
y/o traducido en otro lenguaje. Por lo tanto, la traducción
está incluida sin limitaciones en el término «modificación».
Cada concesionario (licenciatario) será denominado «usted».
Cualquier otra actividad que no sea la copia, distribución o
modificación no está cubierta por esta Licencia, está fuera de
su ámbito. El acto de ejecutar el Programa no está
restringido, y los resultados del Programa están cubiertos
únicamente si sus contenidos constituyen un trabajo basado en
Cualquier otra actividad que no sea la copia, distribución o
modificación no está cubierta por esta Licencia, está fuera de
su ámbito. El acto de ejecutar el Programa no está
restringido, y los resultados del Programa están cubiertos
únicamente si sus contenidos constituyen un trabajo basado en
el Programa, independientemente de haberlo producido mediante
la ejecución del programa. El que esto se cumpla, depende de
la ejecución del programa. El que esto se cumpla, depende de
lo que haga el programa.
2. Usted puede copiar y distribuir copias literales del código
fuente del Programa, según lo has recibido, en cualquier
2. Usted puede copiar y distribuir copias literales del código
fuente del Programa, según lo has recibido, en cualquier
medio, supuesto que de forma adecuada y bien visible publique
en cada copia un anuncio de copyright adecuado y un repudio de
garantía, mantenga intactos todos los anuncios que se refieran
a esta Licencia y a la ausencia de garantía, y proporcione a
garantía, mantenga intactos todos los anuncios que se refieran
a esta Licencia y a la ausencia de garantía, y proporcione a
cualquier otro receptor del programa una copia de esta
Licencia junto con el Programa.
Puede cobrar un precio por el acto físico de transferir una
copia, y puede, según su libre albedrío, ofrecer garantía a
Puede cobrar un precio por el acto físico de transferir una
copia, y puede, según su libre albedrío, ofrecer garantía a
cambio de unos honorarios.
3. Puede modificar su copia o copias del Programa o de
cualquier porción de él, formando de esta manera un trabajo
basado en el Programa, y copiar y distribuir esa modificación
o trabajo bajo los términos del apartado 1, antedicho,
supuesto que además cumpla las siguientes condiciones:
cualquier porción de él, formando de esta manera un trabajo
basado en el Programa, y copiar y distribuir esa modificación
o trabajo bajo los términos del apartado 1, antedicho,
supuesto que además cumpla las siguientes condiciones:
a. Debe hacer que los ficheros modificados lleven anuncios
prominentes indicando que los ha cambiado y la fecha de
@ -585,342 +585,342 @@ cualquier cambio.
b. Debe hacer que cualquier trabajo que distribuya o publique
y que en todo o en parte contenga o sea derivado del Programa
o de cualquier parte de él sea licenciada como un todo, sin
carga alguna, a todas las terceras partes y bajo los términos
o de cualquier parte de él sea licenciada como un todo, sin
carga alguna, a todas las terceras partes y bajo los términos
de esta Licencia.
c. Si el programa modificado lee normalmente órdenes
c. Si el programa modificado lee normalmente órdenes
interactivamente cuando es ejecutado, debe hacer que, cuando
comience su ejecución para ese uso interactivo de la forma más
comience su ejecución para ese uso interactivo de la forma más
habitual, muestre o escriba un mensaje que incluya un anuncio
de copyright y un anuncio de que no se ofrece ninguna garantía
(o por el contrario que sí se ofrece garantía) y que los
de copyright y un anuncio de que no se ofrece ninguna garantía
(o por el contrario que sí se ofrece garantía) y que los
usuarios pueden redistribuir el programa bajo estas
condiciones, e indicando al usuario cómo ver una copia de esta
licencia. (Excepción: si el propio programa es interactivo
condiciones, e indicando al usuario cómo ver una copia de esta
licencia. (Excepción: si el propio programa es interactivo
pero normalmente no muestra ese anuncio, no se requiere que su
trabajo basado en el Programa muestre ningún anuncio).
trabajo basado en el Programa muestre ningún anuncio).
Estos requisitos se aplican al trabajo modificado como un
todo. Si partes identificables de ese trabajo no son derivadas
del Programa, y pueden, razonablemente, ser consideradas
trabajos independientes y separados por ellos mismos, entonces
esta Licencia y sus términos no se aplican a esas partes
esta Licencia y sus términos no se aplican a esas partes
cuando sean distribuidas como trabajos separados. Pero cuando
distribuya esas mismas secciones como partes de un todo que es
un trabajo basado en el Programa, la distribución del todo
debe ser según los términos de esta licencia, cuyos permisos
un trabajo basado en el Programa, la distribución del todo
debe ser según los términos de esta licencia, cuyos permisos
para otros licenciatarios se extienden al todo completo, y por
lo tanto a todas y cada una de sus partes, con independencia
de quién la escribió.
de quién la escribió.
Por lo tanto, no es la intención de este apartado reclamar
Por lo tanto, no es la intención de este apartado reclamar
derechos o desafiar sus derechos sobre trabajos escritos
totalmente por usted mismo. El intento es ejercer el derecho a
controlar la distribución de trabajos derivados o colectivos
controlar la distribución de trabajos derivados o colectivos
basados en el Programa.
Además, el simple hecho de reunir un trabajo no basado en el
Además, el simple hecho de reunir un trabajo no basado en el
Programa con el Programa (o con un trabajo basado en el
Programa) en un volumen de almacenamiento o en un medio de
distribución no hace que dicho trabajo entre dentro del ámbito
distribución no hace que dicho trabajo entre dentro del ámbito
cubierto por esta Licencia.
4. Puede copiar y distribuir el Programa (o un trabajo basado
en él, según se especifica en el apartado 2, como código
objeto o en formato ejecutable según los términos de los
apartados 1 y 2, supuesto que además cumpla una de las
en él, según se especifica en el apartado 2, como código
objeto o en formato ejecutable según los términos de los
apartados 1 y 2, supuesto que además cumpla una de las
siguientes condiciones:
a. Acompañarlo con el código fuente completo correspondiente,
en formato electrónico, que debe ser distribuido según se
a. Acompañarlo con el código fuente completo correspondiente,
en formato electrónico, que debe ser distribuido según se
especifica en los apartados 1 y 2 de esta Licencia en un medio
habitualmente utilizado para el intercambio de programas, o
b. Acompañarlo con una oferta por escrito, válida durante al
menos tres años, de proporcionar a cualquier tercera parte una
copia completa en formato electrónico del código fuente
b. Acompañarlo con una oferta por escrito, válida durante al
menos tres años, de proporcionar a cualquier tercera parte una
copia completa en formato electrónico del código fuente
correspondiente, a un coste no mayor que el de realizar
físicamente la distribución del fuente, que será distribuido
físicamente la distribución del fuente, que será distribuido
bajo las condiciones descritas en los apartados 1 y 2
anteriores, en un medio habitualmente utilizado para el
intercambio de programas, o
c. Acompañarlo con la información que recibiste ofreciendo
distribuir el código fuente correspondiente. (Esta opción se
permite sólo para distribución no comercial y sólo si usted
recibió el programa como código objeto o en formato ejecutable
c. Acompañarlo con la información que recibiste ofreciendo
distribuir el código fuente correspondiente. (Esta opción se
permite sólo para distribución no comercial y sólo si usted
recibió el programa como código objeto o en formato ejecutable
con tal oferta, de acuerdo con el apartado b anterior).
Por código fuente de un trabajo se entiende la forma preferida
Por código fuente de un trabajo se entiende la forma preferida
del trabajo cuando se le hacen modificaciones. Para un trabajo
ejecutable, se entiende por código fuente completo todo el
código fuente para todos los módulos que contiene, más
cualquier fichero asociado de definición de interfaces, más
los guiones utilizados para controlar la compilación e
instalación del ejecutable. Como excepción especial el código
ejecutable, se entiende por código fuente completo todo el
código fuente para todos los módulos que contiene, más
cualquier fichero asociado de definición de interfaces, más
los guiones utilizados para controlar la compilación e
instalación del ejecutable. Como excepción especial el código
fuente distribuido no necesita incluir nada que sea
distribuido normalmente (bien como fuente, bien en forma
binaria) con los componentes principales (compilador, kernel y
similares) del sistema operativo en el cual funciona el
ejecutable, a no ser que el propio componente acompañe al
ejecutable, a no ser que el propio componente acompañe al
ejecutable.
Si la distribución del ejecutable o del código objeto se hace
Si la distribución del ejecutable o del código objeto se hace
mediante la oferta acceso para copiarlo de un cierto lugar,
entonces se considera la oferta de acceso para copiar el
código fuente del mismo lugar como distribución del código
fuente, incluso aunque terceras partes no estén forzadas a
copiar el fuente junto con el código objeto.
código fuente del mismo lugar como distribución del código
fuente, incluso aunque terceras partes no estén forzadas a
copiar el fuente junto con el código objeto.
5. No puede copiar, modificar, sublicenciar o distribuir el
Programa excepto como prevé expresamente esta Licencia.
Programa excepto como prevé expresamente esta Licencia.
Cualquier intento de copiar, modificar sublicenciar o
distribuir el Programa de otra forma es inválida, y hará que
cesen automáticamente los derechos que te proporciona esta
distribuir el Programa de otra forma es inválida, y hará que
cesen automáticamente los derechos que te proporciona esta
Licencia. En cualquier caso, las partes que hayan recibido
copias o derechos de usted bajo esta Licencia no cesarán en
sus derechos mientras esas partes continúen cumpliéndola.
copias o derechos de usted bajo esta Licencia no cesarán en
sus derechos mientras esas partes continúen cumpliéndola.
6. No está obligado a aceptar esta licencia, ya que no la ha
firmado. Sin embargo, no hay hada más que le proporcione
6. No está obligado a aceptar esta licencia, ya que no la ha
firmado. Sin embargo, no hay hada más que le proporcione
permiso para modificar o distribuir el Programa o sus trabajos
derivados. Estas acciones están prohibidas por la ley si no
derivados. Estas acciones están prohibidas por la ley si no
acepta esta Licencia. Por lo tanto, si modifica o distribuye
el Programa (o cualquier trabajo basado en el Programa), está
el Programa (o cualquier trabajo basado en el Programa), está
indicando que acepta esta Licencia para poder hacerlo, y todos
sus términos y condiciones para copiar, distribuir o modificar
el Programa o trabajos basados en él.
sus términos y condiciones para copiar, distribuir o modificar
el Programa o trabajos basados en él.
7. Cada vez que redistribuya el Programa (o cualquier trabajo
basado en el Programa), el receptor recibe automáticamente una
basado en el Programa), el receptor recibe automáticamente una
licencia del licenciatario original para copiar, distribuir o
modificar el Programa, de forma sujeta a estos términos y
condiciones. No puede imponer al receptor ninguna restricción
más sobre el ejercicio de los derechos aquí garantizados. No
modificar el Programa, de forma sujeta a estos términos y
condiciones. No puede imponer al receptor ninguna restricción
más sobre el ejercicio de los derechos aquí garantizados. No
es usted responsable de hacer cumplir esta licencia por
terceras partes.
8. Si como consecuencia de una resolución judicial o de una
alegación de infracción de patente o por cualquier otra razón
8. Si como consecuencia de una resolución judicial o de una
alegación de infracción de patente o por cualquier otra razón
(no limitada a asuntos relacionados con patentes) se le
imponen condiciones (ya sea por mandato judicial, por acuerdo
o por cualquier otra causa) que contradigan las condiciones de
esta Licencia, ello no le exime de cumplir las condiciones de
esta Licencia. Si no puede realizar distribuciones de forma
que se satisfagan simultáneamente sus obligaciones bajo esta
licencia y cualquier otra obligación pertinente entonces, como
que se satisfagan simultáneamente sus obligaciones bajo esta
licencia y cualquier otra obligación pertinente entonces, como
consecuencia, no puede distribuir el Programa de ninguna
forma. Por ejemplo, si una patente no permite la
redistribución libre de derechos de autor del Programa por
redistribución libre de derechos de autor del Programa por
parte de todos aquellos que reciban copias directa o
indirectamente a través de usted, entonces la única forma en
que podría satisfacer tanto esa condición como esta Licencia
sería evitar completamente la distribución del Programa.
indirectamente a través de usted, entonces la única forma en
que podría satisfacer tanto esa condición como esta Licencia
sería evitar completamente la distribución del Programa.
Si cualquier porción de este apartado se considera inválida o
Si cualquier porción de este apartado se considera inválida o
imposible de cumplir bajo cualquier circunstancia particular
ha de cumplirse el resto y la sección por entero ha de
ha de cumplirse el resto y la sección por entero ha de
cumplirse en cualquier otra circunstancia.
No es el propósito de este apartado inducirle a infringir
ninguna reivindicación de patente ni de ningún otro derecho de
No es el propósito de este apartado inducirle a infringir
ninguna reivindicación de patente ni de ningún otro derecho de
propiedad o impugnar la validez de ninguna de dichas
reivindicaciones. Este apartado tiene el único propósito de
proteger la integridad del sistema de distribución de software
libre, que se realiza mediante prácticas de licencia pública.
reivindicaciones. Este apartado tiene el único propósito de
proteger la integridad del sistema de distribución de software
libre, que se realiza mediante prácticas de licencia pública.
Mucha gente ha hecho contribuciones generosas a la gran
variedad de software distribuido mediante ese sistema con la
confianza de que el sistema se aplicará consistentemente. Será
confianza de que el sistema se aplicará consistentemente. Será
el autor/donante quien decida si quiere distribuir software
mediante cualquier otro sistema y una licencia no puede
imponer esa elección.
imponer esa elección.
Este apartado pretende dejar completamente claro lo que se
cree que es una consecuencia del resto de esta Licencia.
9. Si la distribución y/o uso de el Programa está restringida
en ciertos países, bien por patentes o por interfaces bajo
9. Si la distribución y/o uso de el Programa está restringida
en ciertos países, bien por patentes o por interfaces bajo
copyright, el tenedor del copyright que coloca este Programa
bajo esta Licencia puede añadir una limitación explícita de
distribución geográfica excluyendo esos países, de forma que
la distribución se permita sólo en o entre los países no
bajo esta Licencia puede añadir una limitación explícita de
distribución geográfica excluyendo esos países, de forma que
la distribución se permita sólo en o entre los países no
excluidos de esta manera. En ese caso, esta Licencia
incorporará la limitación como si estuviese escrita en el
incorporará la limitación como si estuviese escrita en el
cuerpo de esta Licencia.
10. La Free Software Foundation puede publicar versiones
revisadas y/o nuevas de la Licencia Pública General de tiempo
en tiempo. Dichas nuevas versiones serán similares en espíritu
a la presente versión, pero pueden ser diferentes en detalles
revisadas y/o nuevas de la Licencia Pública General de tiempo
en tiempo. Dichas nuevas versiones serán similares en espíritu
a la presente versión, pero pueden ser diferentes en detalles
para considerar nuevos problemas o situaciones.
Cada versión recibe un número de versión que la distingue de
otras. Si el Programa especifica un número de versión de esta
Licencia que se refiere a ella y a «cualquier versión
posterior», tienes la opción de seguir los términos y
condiciones, bien de esa versión, bien de cualquier versión
Cada versión recibe un número de versión que la distingue de
otras. Si el Programa especifica un número de versión de esta
Licencia que se refiere a ella y a «cualquier versión
posterior», tienes la opción de seguir los términos y
condiciones, bien de esa versión, bien de cualquier versión
posterior publicada por la Free Software Foundation. Si el
Programa no especifica un número de versión de esta Licencia,
puedes escoger cualquier versión publicada por la Free
Programa no especifica un número de versión de esta Licencia,
puedes escoger cualquier versión publicada por la Free
Software Foundation.
11. Si quiere incorporar partes del Programa en otros
programas libres cuyas condiciones de distribución son
programas libres cuyas condiciones de distribución son
diferentes, escribe al autor para pedirle permiso. Si el
software tiene copyright de la Free Software Foundation,
escribe a la Free Software Foundation: algunas veces hacemos
excepciones en estos casos. Nuestra decisión estará guiada por
excepciones en estos casos. Nuestra decisión estará guiada por
el doble objetivo de de preservar la libertad de todos los
derivados de nuestro software libre y promover el que se
comparta y reutilice el software en general.
AUSENCIA DE GARANTÍA
AUSENCIA DE GARANTÍA
12. Como el programa se licencia libre de cargas, no se ofrece
ninguna garantía sobre el programa, en todas la extensión
permitida por la legislación aplicable. Excepto cuando se
ninguna garantía sobre el programa, en todas la extensión
permitida por la legislación aplicable. Excepto cuando se
indique de otra forma por escrito, los tenedores del copyright
y/u otras partes proporcionan el programa «tal cual», sin
garantía de ninguna clase, bien expresa o implícita, con
inclusión, pero sin limitación a las garantías mercantiles
implícitas o a la conveniencia para un propósito particular.
y/u otras partes proporcionan el programa «tal cual», sin
garantía de ninguna clase, bien expresa o implícita, con
inclusión, pero sin limitación a las garantías mercantiles
implícitas o a la conveniencia para un propósito particular.
Cualquier riesgo referente a la calidad y prestaciones del
programa es asumido por usted. Si se probase que el Programa
es defectuoso, asume el coste de cualquier servicio,
reparación o corrección.
reparación o corrección.
13. En ningún caso, salvo que lo requiera la legislación
aplicable o haya sido acordado por escrito, ningún tenedor del
13. En ningún caso, salvo que lo requiera la legislación
aplicable o haya sido acordado por escrito, ningún tenedor del
copyright ni ninguna otra parte que modifique y/o redistribuya
el Programa según se permite en esta Licencia será responsable
ante usted por daños, incluyendo cualquier daño general,
el Programa según se permite en esta Licencia será responsable
ante usted por daños, incluyendo cualquier daño general,
especial, incidental o resultante producido por el uso o la
imposibilidad de uso del Programa (con inclusión, pero sin
limitación a la pérdida de datos o a la generación incorrecta
de datos o a pérdidas sufridas por usted o por terceras partes
o a un fallo del Programa al funcionar en combinación con
imposibilidad de uso del Programa (con inclusión, pero sin
limitación a la pérdida de datos o a la generación incorrecta
de datos o a pérdidas sufridas por usted o por terceras partes
o a un fallo del Programa al funcionar en combinación con
cualquier otro programa), incluso si dicho tenedor u otra
parte ha sido advertido de la posibilidad de dichos daños.
parte ha sido advertido de la posibilidad de dichos daños.
FIN DE TÉRMINOS Y CONDICIONES
FIN DE TÉRMINOS Y CONDICIONES
Apéndice: Cómo aplicar estos términos a sus nuevos programas.
Apéndice: Cómo aplicar estos términos a sus nuevos programas.
Si usted desarrolla un nuevo Programa, y quiere que sea del
mayor uso posible para el público en general, la mejor forma
de conseguirlo es convirtiéndolo en software libre que
cualquiera pueda redistribuir y cambiar bajo estos términos.
mayor uso posible para el público en general, la mejor forma
de conseguirlo es convirtiéndolo en software libre que
cualquiera pueda redistribuir y cambiar bajo estos términos.
Para hacerlo, añada los siguientes anuncios al programa. Lo
más seguro es añadirlos al principio de cada fichero fuente
para transmitir lo más efectivamente posible la ausencia de
garantía. Además cada fichero debería tener al menos la línea
de «copyright» y un indicador a dónde puede encontrarse el
Para hacerlo, añada los siguientes anuncios al programa. Lo
más seguro es añadirlos al principio de cada fichero fuente
para transmitir lo más efectivamente posible la ausencia de
garantía. Además cada fichero debería tener al menos la línea
de «copyright» y un indicador a dónde puede encontrarse el
anuncio completo.
<una línea para indicar el nombre del programa y una rápida
idea de qué hace.>
<una línea para indicar el nombre del programa y una rápida
idea de qué hace.>
Copyright (C) <año> <nombre del autor>
Copyright (C) <año> <nombre del autor>
Este programa es software libre. Puede redistribuirlo y/o
modificarlo bajo los términos de la Licencia Pública General
de GNU según es publicada por la Free Software Foundation,
bien de la versión 2 de dicha Licencia o bien (según su
elección) de cualquier versión posterior.
modificarlo bajo los términos de la Licencia Pública General
de GNU según es publicada por la Free Software Foundation,
bien de la versión 2 de dicha Licencia o bien (según su
elección) de cualquier versión posterior.
Este programa se distribuye con la esperanza de que sea útil,
pero SIN NINGUNA GARANTÍA, incluso sin la garantía MERCANTIL
implícita o sin garantizar la CONVENIENCIA PARA UN PROPÓSITO
PARTICULAR. Véase la Licencia Pública General de GNU para más
Este programa se distribuye con la esperanza de que sea útil,
pero SIN NINGUNA GARANTÍA, incluso sin la garantía MERCANTIL
implícita o sin garantizar la CONVENIENCIA PARA UN PROPÓSITO
PARTICULAR. Véase la Licencia Pública General de GNU para más
detalles.
Debería haber recibido una copia de la Licencia Pública
General junto con este programa. Si no ha sido así, escriba a
Debería haber recibido una copia de la Licencia Pública
General junto con este programa. Si no ha sido así, escriba a
la Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301 USA. Añada también información sobre
cómo contactar con usted mediante correo electrónico y postal.
Boston, MA 02110-1301 USA. Añada también información sobre
cómo contactar con usted mediante correo electrónico y postal.
Si el programa es interactivo, haga que muestre un pequeño
Si el programa es interactivo, haga que muestre un pequeño
anuncio como el siguiente, cuando comienza a funcionar en modo
interactivo:
Gnomovision versión 69, Copyright (C) año nombre del autor
Gnomovision no ofrece ABSOLUTAMENTE NINGUNA GARANTÍA. Para más
detalles escriba «show w».
Gnomovision versión 69, Copyright (C) año nombre del autor
Gnomovision no ofrece ABSOLUTAMENTE NINGUNA GARANTÍA. Para más
detalles escriba «show w».
Los comandos hipotéticos «show w» y «show c» deberían mostrar
las partes adecuadas de la Licencia Pública General. Por
Los comandos hipotéticos «show w» y «show c» deberían mostrar
las partes adecuadas de la Licencia Pública General. Por
supuesto, los comandos que use pueden llamarse de cualquier
otra manera. Podrían incluso ser pulsaciones del ratón o
elementos de un menú (lo que sea apropiado para su programa).
otra manera. Podrían incluso ser pulsaciones del ratón o
elementos de un menú (lo que sea apropiado para su programa).
También debería conseguir que su empleador (si trabaja como
También debería conseguir que su empleador (si trabaja como
programador) o su Universidad (si es el caso) firme una
«renuncia de copyright» para el programa, si es necesario. A
continuación se ofrece un ejemplo, altere los nombres según
«renuncia de copyright» para el programa, si es necesario. A
continuación se ofrece un ejemplo, altere los nombres según
sea conveniente:
Yoyodyne, Inc. mediante este documento renuncia a cualquier
interés de derechos de copyright con respecto al programa
interés de derechos de copyright con respecto al programa
Gnomovision (que hace pasadas a compiladores) escrito por Pepe
Programador.
<firma de Pepito Grillo>, 20 de diciembre de 1996 Pepito
Grillo, Presidente de Asuntillos Varios.
Esta Licencia Pública General no permite que incluya sus
Esta Licencia Pública General no permite que incluya sus
programas en programas propietarios. Si su programa es una
biblioteca de subrutinas, puede considerar más útil el
biblioteca de subrutinas, puede considerar más útil el
permitir el enlazado de aplicaciones propietarias con la
biblioteca. Si este es el caso, use la Licencia Pública
biblioteca. Si este es el caso, use la Licencia Pública
General de GNU para Bibliotecas en lugar de esta Licencia.
[QueryBox]
Cuadros de diálogo
Cuadros de diálogo
En los cuadros de diálogo puede desplazarse con el teclado
En los cuadros de diálogo puede desplazarse con el teclado
usando las flechas o las teclas de las letras resaltadas.
También se pueden pulsar los botones con el ratón.
También se pueden pulsar los botones con el ratón.
[How to use help]
Uso de la ayuda
Se pueden utilizar las flechas o el ratón para navegar
Se pueden utilizar las flechas o el ratón para navegar
por el sistema de ayuda.
La flecha de abajo cambia al siguiente elemento o baja.
La tecla de arriba vuelve al elemento anterior o sube.
La tecla derecha sigue el enlace activo.
La tecla izquierda vuelve a la última página visitada.
La tecla izquierda vuelve a la última página visitada.
Si el terminal no es compatible con las flechas de cursor
se puede avanzar con la barra espaciadora y retroceder con
la tecla b (back). El tabulador activa el elemento siguiente y
con INTRO se puede entrar al enlace correspondiente.
La tecla l (last) permite volver a la última página.
La tecla l (last) permite volver a la última página.
ESC pulsada dos veces permite salir de la ayuda.
El botón izquierdo del ratón avanza o sigue enlaces y el
botón derecho retrocede o vuelve a la última página.
El botón izquierdo del ratón avanza o sigue enlaces y el
botón derecho retrocede o vuelve a la última página.
La función de todas las teclas en la ayuda:
La función de todas las teclas en la ayuda:
Las teclas de desplazamiento genéricasGeneral Movement Keys son válidas.
Las teclas de desplazamiento genéricasGeneral Movement Keys son válidas.
tabulador Avanzar al elemento posterior.
Alt-tabulador Retroceder al elemento anterior.
abajo Avanzar elemento o bajar una línea.
arriba Retroceder elemento o subir una línea.
abajo Avanzar elemento o bajar una línea.
arriba Retroceder elemento o subir una línea.
derecha , INTRO Seguir enlace.
izquierda , l Volver a la última página visitada.
izquierda , l Volver a la última página visitada.
F1 Mostrar la ayuda del sistema de ayuda.
n Pasar a la página siguiente.
p Pasar a la página anterior.
c Pasar a la página de contenidos.
n Pasar a la página siguiente.
p Pasar a la página anterior.
c Pasar a la página de contenidos.
F10 , ESC Salir de la ayuda.

Local variables:

File diff suppressed because it is too large Load Diff

View File

@ -6,23 +6,23 @@
v v v mqv v v v mqu v v mj
qqqqqqCommander qj 
Ez a GNU Midnight Commander súgója.
Ez a GNU Midnight Commander súgója.
Az interaktív súgó használatának megismeréséhez csak üss
egy entertHow to use help. Itt közvetlenül a súgó tartalomjegyzékébeContents
Az interaktív súgó használatának megismeréséhez csak üss
egy entertHow to use help. Itt közvetlenül a súgó tartalomjegyzékébeContents
juthatsz.
A Midnight Commander-t a következő szerzőkAUTHORS készítették.
A Midnight Commander-t a következő szerzőkAUTHORS készítették.
A Midnight Commander mindenféle garanciaWarranty nélkül kerül
kiadásra. Ez szabad szoftver, így továbbadhatod azt a
Felhasználási engedélybenLicense meghatározott feltételekkel.
A Midnight Commander mindenféle garanciaWarranty nélkül kerül
kiadásra. Ez szabad szoftver, így továbbadhatod azt a
Felhasználási engedélybenLicense meghatározott feltételekkel.
[License]
Engedélyek
Engedélyek
Ez a rész a GNU általános felhasználási
engedélyét tartalmazza.
Ez a rész a GNU általános felhasználási
engedélyét tartalmazza.
- Ennek hivatalos nyelve angol. -
@ -436,54 +436,54 @@ library. If this is what you want to do, use the GNU
Library General Public License instead of this License.
[QueryBox]
Lekérdező box
Lekérdező box
A lekérdező boxban kezeléséhez a nyíl billentyűket, a
szövegrész elejének magadásást, vagy a gombokra történő
egérkattintást használhatod.
A lekérdező boxban kezeléséhez a nyíl billentyűket, a
szövegrész elejének magadásást, vagy a gombokra történő
egérkattintást használhatod.
[How to use help]
Hogyan használjuk a súgót
Hogyan használjuk a súgót
A súgóban a navigációhoz a billentyűzet gombjait és az
egér gombjait is használhatod. A lefelé mutató nyíl
lenyomására a következő bejegyzésre ugorhatsz, vagy
legördítheted azt. A felfelé mutató nyíl lenyomására
ez előző bejegyzésre ugorhatsz, vagy felhúzhatod azt.
A jobbra mutató nyíl lenyomására a linknek megfelelő
címre lép. A balra mutató nyíl lenyomására az előzőleg
meglátogatott címre lépsz vissza.
A súgóban a navigációhoz a billentyűzet gombjait és az
egér gombjait is használhatod. A lefelé mutató nyíl
lenyomására a következő bejegyzésre ugorhatsz, vagy
legördítheted azt. A felfelé mutató nyíl lenyomására
ez előző bejegyzésre ugorhatsz, vagy felhúzhatod azt.
A jobbra mutató nyíl lenyomására a linknek megfelelő
címre lép. A balra mutató nyíl lenyomására az előzőleg
meglátogatott címre lépsz vissza.
Ha az általad használt terminál nem támogatja a kurzor
gombok használatát, használd a szóköz billentyűt az
előre lépésre, a 'b' gombot a visszalépésre. Használd a
TAB gombot a következő bejegyzésre való ugráshoz és az
ENTER-t a jelenlegi link által megadott címre történő
lépéshez. Az 'l' (last=utolsó) gombot az előzőleg
látogatott oldalra való visszalépésre használhatod. Az
ESC lenyomásával kiléphetsz a Súgóból.
Ha az általad használt terminál nem támogatja a kurzor
gombok használatát, használd a szóköz billentyűt az
előre lépésre, a 'b' gombot a visszalépésre. Használd a
TAB gombot a következő bejegyzésre való ugráshoz és az
ENTER-t a jelenlegi link által megadott címre történő
lépéshez. Az 'l' (last=utolsó) gombot az előzőleg
látogatott oldalra való visszalépésre használhatod. Az
ESC lenyomásával kiléphetsz a Súgóból.
A bal egérgomb lenyomásával követheted a linket, vagy
gördíthetsz. A jobb gomb lenyomásával visszatérhetsz az
előzőleg látogatott pontra.
A bal egérgomb lenyomásával követheted a linket, vagy
gördíthetsz. A jobb gomb lenyomásával visszatérhetsz az
előzőleg látogatott pontra.
A Súgóban használható összes gomb listája:
A Súgóban használható összes gomb listája:
Általános mozgási lehetőségek billentyűzettelGeneral Movement Keys.
Általános mozgási lehetőségek billentyűzettelGeneral Movement Keys.
tab Mozgás a következő elemre.
M-tab Mozgás az előző elemre.
down Mozgás a következő elemre; a sorokat lefelé
gördíti.
up Mozgás az előző elemre; a sorokat felfelé
gördíti.
right, enter Követi a jelenlegi linket.
left, l Visszalép az előzőleg meglátogatott pontra.
F1 Megjeleníti a Súgót a Súgó nézővel.
n Átlép a következő pontra.
p Átlép az előző pontra.
c A Tartalomjegyzékhez ugrik.
F10, esc Kilép a Súgóból.
tab Mozgás a következő elemre.
M-tab Mozgás az előző elemre.
down Mozgás a következő elemre; a sorokat lefelé
gördíti.
up Mozgás az előző elemre; a sorokat felfelé
gördíti.
right, enter Követi a jelenlegi linket.
left, l Visszalép az előzőleg meglátogatott pontra.
F1 Megjeleníti a Súgót a Súgó nézővel.
n Átlép a következő pontra.
p Átlép az előző pontra.
c A Tartalomjegyzékhez ugrik.
F10, esc Kilép a Súgóból.

Local variables:
fill-column: 58

File diff suppressed because it is too large Load Diff

View File

@ -7,17 +7,17 @@
v v v mqv v v v mqu v v mj
qqqqqqCommander qj 
Questa è la principale schermata della guida interattiva
Questa è la principale schermata della guida interattiva
del GNU Midnight Commander .
Per saperne di più su come usare la guida interattiva, premere
semplicemente invioHow to use help. Se lo si desidera, è possibile
Per saperne di più su come usare la guida interattiva, premere
semplicemente invioHow to use help. Se lo si desidera, è possibile
consultare direttamente il sommarioContents della guida.
Il Midnight Commander è stato scritto dai suoi autoriAUTHORS.
Il Midnight Commander è stato scritto dai suoi autoriAUTHORS.
Il Midnight Commander NON E' COPERTO DA ALCUNA GARANZIAWarranty.
Questo è software libero, lo si può ridistribuire sotto
Questo è software libero, lo si può ridistribuire sotto
certe condizioniLicenza.[Licenza]
GNU GENERAL PUBLIC LICENSE
@ -432,7 +432,7 @@ Library General Public License instead of this License.
[QueryBox]
Finestre di dialogo di richiesta dati
Nelle finestre di dialogo di richiesta dati è possibile
Nelle finestre di dialogo di richiesta dati è possibile
usare i tasti freccia o la prima lettera per selezionare
una voce o cliccare con il mouse sul bottone.
@ -442,7 +442,7 @@ Come usare la guida interattiva
Usare i tasti del cursore o il mouse per navigare
nel visualizzatore della guida.
Premere freccia in giù per spostarsi alla voce
Premere freccia in giù per spostarsi alla voce
successiva o per spostarsi in basso.
Premere freccia in su per spostarsi alla voce
precedente o per spostarsi in alto.
@ -451,7 +451,7 @@ corrente.
Premere freccia a sinistra per tornare indietro nello
storico dei nodi visitati.
Se il terminale non supporta i tasti del cursore si può
Se il terminale non supporta i tasti del cursore si può
usare la barra spaziatrice per spostarsi in avanti
ed il tasto 'b' per tornare indietro. Usare il tasto
TAB per spostarsi sulla prossima voce e premere
@ -471,7 +471,7 @@ Sono accettati i tasti generali di movimentoGeneral Movement Keys.
tab Va alla voce successiva.
M-tab Va alla voce precedente.
giù Va alla voce successiva o una riga in basso.
giù Va alla voce successiva o una riga in basso.
su Va alla voce precedente o una riga in alto.
destra, invio Segue il collegamento corrente.
sinistra, l Torna indietro nello storico dei nodi visitati.

File diff suppressed because it is too large Load Diff

View File

@ -7,24 +7,24 @@
v v v mqv v v v mqu v v mj
qqqqqqCommander qj 
To główny ekran pomocy Midnight Commandera .
To główny ekran pomocy Midnight Commandera .
Aby dowiedzieć się, jak korzystać z interaktywnej pomocy
naciśnij EnterHow to use help. Możesz też przejść bezpośrednio do spisu
treściContents pomocy.
Aby dowiedzieć się, jak korzystać z interaktywnej pomocy
naciśnij EnterHow to use help. Możesz też przejść bezpośrednio do spisu
treściContents pomocy.
GNU Midnight Commander został napisany przez autorówAUTHORS.
GNU Midnight Commander został napisany przez autorówAUTHORS.
GNU Midnight Commander jest dostarczany ABSOLUTNIE BEZ
ŻADNEJ GWARANCJIWarranty. Jest on wolnym oprogramowaniem,
więc dozwolona jest jego redystrybucja na zasadach
GNU General Public LicenseLicense (jej nieoficjalne tłumaczenie
ŻADNEJ GWARANCJIWarranty. Jest on wolnym oprogramowaniem,
więc dozwolona jest jego redystrybucja na zasadach
GNU General Public LicenseLicense (jej nieoficjalne tłumaczenie
znajdziesz tutajLicense-pl).
[License]
Licencja
Nieoficjalne polskie tłumacznie znajdziesz tutajLicense-pl.
Nieoficjalne polskie tłumacznie znajdziesz tutajLicense-pl.
GNU GENERAL PUBLIC LICENSE
@ -437,15 +437,15 @@ library. If this is what you want to do, use the GNU
Library General Public License instead of this License.
[License-pl]
Nieoficjalne tłumaczenie licencji
Nieoficjalne tłumaczenie licencji
Uwaga: To jest nieoficjalne tłumaczenie Powszechnej
Licencji Publicznej GNU na język polski. Nie zostało
opublikowane przez Free Software Foundation i pod względem
prawnym nie stanowi warunków rozpowszechniania
oprogramowania stosującego GNU GPL -- ustanawia je
wyłącznie oryginalny angielski tekst licencji GNU
GPLLicense. Tłumaczenie pochodzi ze strony
Uwaga: To jest nieoficjalne tłumaczenie Powszechnej
Licencji Publicznej GNU na język polski. Nie zostało
opublikowane przez Free Software Foundation i pod względem
prawnym nie stanowi warunków rozpowszechniania
oprogramowania stosującego GNU GPL -- ustanawia je
wyłącznie oryginalny angielski tekst licencji GNU
GPLLicense. Tłumaczenie pochodzi ze strony
http://www.linux.org.pl/
@ -455,507 +455,507 @@ http://www.linux.org.pl/
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Zezwala się na kopiowanie i rozpowszechnianie wiernych
Zezwala się na kopiowanie i rozpowszechnianie wiernych
kopii niniejszego dokumentu licencyjnego, jednak bez prawa
wprowadzania zmian.
Preambuła
Preambuła
Większość licencji na oprogramowanie pomyślana jest po
to, aby odebrać użytkownikowi możliwość swobodnego
udostępniania innym i zmieniania danego software'u.
Większość licencji na oprogramowanie pomyślana jest po
to, aby odebrać użytkownikowi możliwość swobodnego
udostępniania innym i zmieniania danego software'u.
Natomiast w wypadku Powszechnej Licencji Publicznej GNU
(GNU General Public License, GPL) celem jest
zagwarantowanie użytkownikowi swobody udostępniania i
zmieniania tego bezpłatnego oprogramowania, a więc danie
pewności, iż oprogramowanie jest wolno dostępne dla
wszystkich użytkowników. Niniejsza Powszechna Licencja
Publiczna dotyczy większości oprogramowania wydawanego
przez Fundację Wolnego Oprogramowania (Free Software
Foundation) oraz wszelkich innych programów, których
autorzy zobowiązują się do jej stosowania. (Niektóre
rodzaje oprogramowania wydawanego przez Fundację objęte są
Powszechną Licencją Publiczną GNU dla Bibliotek, GNU
Library General Public License). Użytkownik może stosować
ją również do swoich programów.
zagwarantowanie użytkownikowi swobody udostępniania i
zmieniania tego bezpłatnego oprogramowania, a więc danie
pewności, iż oprogramowanie jest wolno dostępne dla
wszystkich użytkowników. Niniejsza Powszechna Licencja
Publiczna dotyczy większości oprogramowania wydawanego
przez Fundację Wolnego Oprogramowania (Free Software
Foundation) oraz wszelkich innych programów, których
autorzy zobowiązują się do jej stosowania. (Niektóre
rodzaje oprogramowania wydawanego przez Fundację objęte są
Powszechną Licencją Publiczną GNU dla Bibliotek, GNU
Library General Public License). Użytkownik może stosować
ją również do swoich programów.
Mówiąc o wolnym oprogramowaniu mamy na myśli swobodę, a
nie cenę. Nasze Powszechne Licencje Publiczne wprowadzono
po to, aby zapewnić Państwu swobodę rozpowszechniania
kopii tego oprogramowania (i - jeśli ktoś chce -
pobierania za tę usługę opłaty), jak również aby
udostępnić kod źródłowy oraz umożliwić dokonywanie zmian
tego oprogramowania lub wykorzystywania jego fragmentów w
nowych, wolnych programach. Nie bez znaczenia jest też
sama możliwość dotarcia do Państwa z informacją o
Mówiąc o wolnym oprogramowaniu mamy na myśli swobodę, a
nie cenę. Nasze Powszechne Licencje Publiczne wprowadzono
po to, aby zapewnić Państwu swobodę rozpowszechniania
kopii tego oprogramowania (i - jeśli ktoś chce -
pobierania za tę usługę opłaty), jak również aby
udostępnić kod źródłowy oraz umożliwić dokonywanie zmian
tego oprogramowania lub wykorzystywania jego fragmentów w
nowych, wolnych programach. Nie bez znaczenia jest też
sama możliwość dotarcia do Państwa z informacją o
wszystkich tych udogodnieniach.
W celu ochrony praw użytkownika jesteśmy zmuszeni
wprowadzać ograniczenia zabraniające komukolwiek
W celu ochrony praw użytkownika jesteśmy zmuszeni
wprowadzać ograniczenia zabraniające komukolwiek
kwestionowanie jego praw albo sugerowanie rezygnacji z
tych praw. Ograniczenia te sprowadzają się do pewnych dla
Państwa obowiązków w przypadku rozpowszechniania przez Was
kopii naszego oprogramowania bądź dokonywania w nim zmian.
tych praw. Ograniczenia te sprowadzają się do pewnych dla
Państwa obowiązków w przypadku rozpowszechniania przez Was
kopii naszego oprogramowania bądź dokonywania w nim zmian.
Na przykład, jeśli rozprowadzacie Państwo kopie takiego
programu, niezależnie czy gratisowo, czy za opłatą,
musicie Państwo odbiorcy udzielić wszelkich tych praw,
jakie mieliście sami. Musicie zapewnić mu również
otrzymanie kodu źródłowego (lub możliwość otrzymania) oraz
przedstawić niniejsze Warunki, aby mógł on poznać swoje
Na przykład, jeśli rozprowadzacie Państwo kopie takiego
programu, niezależnie czy gratisowo, czy za opłatą,
musicie Państwo odbiorcy udzielić wszelkich tych praw,
jakie mieliście sami. Musicie zapewnić mu również
otrzymanie kodu źródłowego (lub możliwość otrzymania) oraz
przedstawić niniejsze Warunki, aby mógł on poznać swoje
prawa.
Ochrona Państwa praw przebiega w dwóch etapach:
Ochrona Państwa praw przebiega w dwóch etapach:
1. zastrzegamy prawo własności autorskiej do
1. zastrzegamy prawo własności autorskiej do
oprogramowania,
2. oferujemy Państwu niniejszą licencję, która daje Wam
2. oferujemy Państwu niniejszą licencję, która daje Wam
sankcjonowane prawem zezwolenie na kopiowanie,
rozpowszechnianie i/lub modyfikowanie tego oprogramowania.
Ponadto dla ochrony tak autora, jak i naszej, pragniemy
mieć pewność, że każdy zrozumie, iż na niniejsze wolne
oprogramowanie nie udziela się gwarancji. W razie
dokonania w nim przez kogoś modyfikacji i puszczenia dalej
mieć pewność, że każdy zrozumie, iż na niniejsze wolne
oprogramowanie nie udziela się gwarancji. W razie
dokonania w nim przez kogoś modyfikacji i puszczenia dalej
do obrotu, pragniemy, aby dalsi odbiorcy zdawali sobie
sprawę z tego, że problemy wprowadzone przez inne osoby
nie są wyrazem oryginalnych działań twórców.
sprawę z tego, że problemy wprowadzone przez inne osoby
nie są wyrazem oryginalnych działań twórców.
I rzecz ostatnia: każdemu wolnemu programowi stale
zagrażają patenty na oprogramowanie. Naszym pragnieniem
jest unikanie takiego niebezpieczeństwa, kiedy
redystrybutorzy wolnego programu indywidualnie uzyskują
prawa patentowe, nadając tym samym programowi charakter
prawnie zastrzeżony. W celu zapobieżenia takim zjawiskom
jednoznacznie wyjaśniliśmy, że każdy patent musi być
wydawany albo dla swobodnego użytku przez wszystkich, albo
I rzecz ostatnia: każdemu wolnemu programowi stale
zagrażają patenty na oprogramowanie. Naszym pragnieniem
jest unikanie takiego niebezpieczeństwa, kiedy
redystrybutorzy wolnego programu indywidualnie uzyskują
prawa patentowe, nadając tym samym programowi charakter
prawnie zastrzeżony. W celu zapobieżenia takim zjawiskom
jednoznacznie wyjaśniliśmy, że każdy patent musi być
wydawany albo dla swobodnego użytku przez wszystkich, albo
nie wydawany wcale.
Poniżej podajemy dokładne zasady i warunki kopiowania,
Poniżej podajemy dokładne zasady i warunki kopiowania,
rozpowszechniania i modyfikowania.
ZASADY I WARUNKI KOPIOWANIA,
ROZPOWSZECHNIANIA I MODYFIKOWANIA
0. Niniejsza Licencja dotyczy programów i innych prac,
na których umieszczona jest pochodząca od właściciela praw
autorskich informacja, że dany program lub praca może być
0. Niniejsza Licencja dotyczy programów i innych prac,
na których umieszczona jest pochodząca od właściciela praw
autorskich informacja, że dany program lub praca może być
rozpowszechniana na warunkach niniejszej Powszechnej
Licencji Publicznej. Używane poniżej słowo "Program"
oznacza właśnie takie programy lub prace, zaś określenie
Licencji Publicznej. Używane poniżej słowo "Program"
oznacza właśnie takie programy lub prace, zaś określenie
"praca oparta na Programie" dotyczy albo Programu, albo
pochodzącej od niego pracy w rozumieniu prawa autorskiego,
to jest pracy zawierającej Program lub jego część
dosłowną, bądź zmodyfikowaną i/lub przełożoną na inny
język. (W dalszym ciągu niniejszego, pojęcie przekładu
włącza się bez ograniczeń do terminu "modyfikacja"). Do
każdego licencjobiorcy będziemy zwracać się "per Ty".
pochodzącej od niego pracy w rozumieniu prawa autorskiego,
to jest pracy zawierającej Program lub jego część
dosłowną, bądź zmodyfikowaną i/lub przełożoną na inny
język. (W dalszym ciągu niniejszego, pojęcie przekładu
włącza się bez ograniczeń do terminu "modyfikacja"). Do
każdego licencjobiorcy będziemy zwracać się "per Ty".
Niniejsza Licencja nie obejmuje działań innych niż
kopiowanie, rozprowadzanie i modyfikowanie - nie mieszczą
się one w jej zakresie. Czynność używania Programu nie
Niniejsza Licencja nie obejmuje działań innych niż
kopiowanie, rozprowadzanie i modyfikowanie - nie mieszczą
się one w jej zakresie. Czynność używania Programu nie
jest poddana ograniczeniom, a produkty uzyskane z Programu
objęte są Licencją tylko wtedy, gdy ich treść stanowi
pracę opartą na Programie (niezależnie od stworzenia jej
przy użyciu Programu). To, czy fakt taki jest prawdą,
zależy od tego, co dany Program wykonuje.
objęte są Licencją tylko wtedy, gdy ich treść stanowi
pracę opartą na Programie (niezależnie od stworzenia jej
przy użyciu Programu). To, czy fakt taki jest prawdą,
zależy od tego, co dany Program wykonuje.
1. Możesz kopiować i rozprowadzać w dowolnych mediach
wierne kopie kodu źródłowego Programu w otrzymanej formie
pod warunkiem, że w widoczny sposób i odpowiednio podasz
na każdej kopii właściwą informację o prawie autorskim i
zrzeczenie się uprawnień z tytułu gwarancji; wszelkie
1. Możesz kopiować i rozprowadzać w dowolnych mediach
wierne kopie kodu źródłowego Programu w otrzymanej formie
pod warunkiem, że w widoczny sposób i odpowiednio podasz
na każdej kopii właściwą informację o prawie autorskim i
zrzeczenie się uprawnień z tytułu gwarancji; wszelkie
napisy informacyjne na temat Licencji i faktu
nieudzielania gwarancji musisz chronić przed uszkodzeniem,
zaś wszystkim innym odbiorcom Programu musisz wraz z
Programem wręczać egzemplarz niniejszej Licencji.
nieudzielania gwarancji musisz chronić przed uszkodzeniem,
zaś wszystkim innym odbiorcom Programu musisz wraz z
Programem wręczać egzemplarz niniejszej Licencji.
Możesz pobierać opłatę za fizyczną czynność przekazania
kopii i według własnej decyzji możesz za opłatą proponować
ochronę gwarancyjną.
Możesz pobierać opłatę za fizyczną czynność przekazania
kopii i według własnej decyzji możesz za opłatą proponować
ochronę gwarancyjną.
2. Możesz modyfikować swoją kopię czy kopie Programu
oraz dowolne jego części, tworząc przez to pracę opartą na
Programie, jak również kopiować i rozprowadzać takie
modyfikacje i pracę na warunkach podanych w pkt.1 powyżej
- pod warunkiem przestrzegania całości poniższych wymogów:
2. Możesz modyfikować swoją kopię czy kopie Programu
oraz dowolne jego części, tworząc przez to pracę opartą na
Programie, jak również kopiować i rozprowadzać takie
modyfikacje i pracę na warunkach podanych w pkt.1 powyżej
- pod warunkiem przestrzegania całości poniższych wymogów:
a) Musisz spowodować umieszczenie na zmodyfikowanych
plikach widocznej informacji o tym, że dane pliki zostały
przez ciebie zmienione, wraz z datą dokonania zmian.
a) Musisz spowodować umieszczenie na zmodyfikowanych
plikach widocznej informacji o tym, że dane pliki zostały
przez ciebie zmienione, wraz z datą dokonania zmian.
b) Musisz doprowadzić do tego, aby każda
rozpowszechniana lub publikowana przez ciebie praca, która
w całości lub części zawiera Program, albo pochodzi od
niego lub jego części, była w całości i bezpłatnie
b) Musisz doprowadzić do tego, aby każda
rozpowszechniana lub publikowana przez ciebie praca, która
w całości lub części zawiera Program, albo pochodzi od
niego lub jego części, była w całości i bezpłatnie
licencjonowana dla wszelkich stron trzecich na warunkach
niniejszej Licencji.
c) Jeżeli zmodyfikowany program podczas korzystania z
c) Jeżeli zmodyfikowany program podczas korzystania z
niego w normalnym trybie odczytuje polecenia
interaktywnie, musisz spowodować, aby po uruchomieniu
(użyty w interaktywny sposób w najzwyklejszym trybie),
wydrukowywał on lub wyświetlał powiadomienie o odnośnym
interaktywnie, musisz spowodować, aby po uruchomieniu
(użyty w interaktywny sposób w najzwyklejszym trybie),
wydrukowywał on lub wyświetlał powiadomienie o odnośnym
prawie autorskim i braku gwarancji (ewentualnie o
zapewnianiu gwarancji przez ciebie), oraz o tym, że
użytkownicy mogą redystrybuować ten program na niniejszych
warunkach wraz z informacją, jak użytkownik może zapoznać
się z treścią niniejszej Licencji. (Wyjątek: jeśli sam
zapewnianiu gwarancji przez ciebie), oraz o tym, że
użytkownicy mogą redystrybuować ten program na niniejszych
warunkach wraz z informacją, jak użytkownik może zapoznać
się z treścią niniejszej Licencji. (Wyjątek: jeśli sam
Program jest interaktywny, ale normalnie nie drukuje
takiego powiadomienia, twoja praca oparta na nim też nie
musi wydrukowywać takiego powiadomienia).
takiego powiadomienia, twoja praca oparta na nim też nie
musi wydrukowywać takiego powiadomienia).
Niniejsze wymogi odnoszą się do zmodyfikowanej pracy
jako całości. Jeśli dające się ustalić sekcje danej pracy
nie pochodzą od Programu i mogą być racjonalnie uważane za
samodzielne i odrębne same w sobie, to niniejsza Licencja
i jej warunki nie mają zastosowania do takich sekcji przy
rozprowadzaniu ich przez ciebie jako odrębne prace. Jeśli
jednak rozprowadzasz je jako część całości, będącej pracą
opartą na Programie, rozpowszechnianie tej całości musi
być dokonywane na warunkach niniejszej Licencji, której
zezwolenia dla innych licencjobiorców rozciągają się w
całej szerokości na tę całość, a tym samym i na każdą
indywidualną jej część, niezależnie od jej autorstwa.
Niniejsze wymogi odnoszą się do zmodyfikowanej pracy
jako całości. Jeśli dające się ustalić sekcje danej pracy
nie pochodzą od Programu i mogą być racjonalnie uważane za
samodzielne i odrębne same w sobie, to niniejsza Licencja
i jej warunki nie mają zastosowania do takich sekcji przy
rozprowadzaniu ich przez ciebie jako odrębne prace. Jeśli
jednak rozprowadzasz je jako część całości, będącej pracą
opartą na Programie, rozpowszechnianie tej całości musi
być dokonywane na warunkach niniejszej Licencji, której
zezwolenia dla innych licencjobiorców rozciągają się w
całej szerokości na tę całość, a tym samym i na każdą
indywidualną jej część, niezależnie od jej autorstwa.
Dlatego też intencją tego fragmentu nie jest roszczenie
sobie praw albo podważanie twych praw do pracy napisanej w
całości przez ciebie. Chodzi nam raczej o korzystanie z
Dlatego też intencją tego fragmentu nie jest roszczenie
sobie praw albo podważanie twych praw do pracy napisanej w
całości przez ciebie. Chodzi nam raczej o korzystanie z
prawa kontrolowania dystrybucji pochodnych i zbiorowych
prac opartych na Programie.
I jeszcze jedno: samo tylko połączenie z Programem (lub
z pracą opartą na Programie) innej pracy - nie opartej na
Programie, w ramach wolumenu nośnika przechowywania lub
dystrybucji, nie powoduje objęcia takiej pracy zakresem
I jeszcze jedno: samo tylko połączenie z Programem (lub
z pracą opartą na Programie) innej pracy - nie opartej na
Programie, w ramach wolumenu nośnika przechowywania lub
dystrybucji, nie powoduje objęcia takiej pracy zakresem
niniejszej Licencji.
3. Możesz kopiować i rozprowadzać Program (lub opartą na
nim pracę - zgodnie z pkt.2 w kodzie wynikowym lub w
formie wykonywalnej w myśl postanowień pkt.1 i 2 powyżej,
pod warunkiem zrealizowania również poniższych wymogów:
3. Możesz kopiować i rozprowadzać Program (lub opartą na
nim pracę - zgodnie z pkt.2 w kodzie wynikowym lub w
formie wykonywalnej w myśl postanowień pkt.1 i 2 powyżej,
pod warunkiem zrealizowania również poniższych wymogów:
a) Musisz dołączyć do niego odpowiadający mu,
kompletny i możliwy do odczytania przez urządzenia cyfrowe
kod źródłowy, który musi być rozpowszechniany na warunkach
pkt.1 i 2 powyżej i na nośniku zwyczajowo używanym dla
a) Musisz dołączyć do niego odpowiadający mu,
kompletny i możliwy do odczytania przez urządzenia cyfrowe
kod źródłowy, który musi być rozpowszechniany na warunkach
pkt.1 i 2 powyżej i na nośniku zwyczajowo używanym dla
wzajemnej wymiany oprogramowania; lub
b) dołączyć do niego pisemną ofertę, ważną co najmniej
3 lata, przyznającą każdej stronie trzeciej - za opłatą
nie przekraczającą twego kosztu fizycznego wykonywania
dystrybucji źródła - kompletną, odczytywalną przez
urządzenia cyfrowe kopię odpowiadającego mu kodu
źródłowego, rozprowadzaną na warunkach pkt.1 i 2 powyżej,
na nośniku zwyczajowo używanym do wzajemnej wymiany
b) dołączyć do niego pisemną ofertę, ważną co najmniej
3 lata, przyznającą każdej stronie trzeciej - za opłatą
nie przekraczającą twego kosztu fizycznego wykonywania
dystrybucji źródła - kompletną, odczytywalną przez
urządzenia cyfrowe kopię odpowiadającego mu kodu
źródłowego, rozprowadzaną na warunkach pkt.1 i 2 powyżej,
na nośniku zwyczajowo używanym do wzajemnej wymiany
oprogramowania; lub
c) dołączyć do niego informację, jaką otrzymałeś na
temat oferty rozprowadzania odpowiedniego kodu źródłowego.
(Ta możliwość dozwolona jest tylko dla dystrybucji
niehandlowej i jedynie wtedy, gdy otrzymałeś dany program
c) dołączyć do niego informację, jaką otrzymałeś na
temat oferty rozprowadzania odpowiedniego kodu źródłowego.
(Ta możliwość dozwolona jest tylko dla dystrybucji
niehandlowej i jedynie wtedy, gdy otrzymałeś dany program
w kodzie wynikowym lub formie wykonywalnej wraz z
wymienioną ofertą - zgodnie z podpunktem "b" powyżej).
wymienioną ofertą - zgodnie z podpunktem "b" powyżej).
Określenie kod źródłowy dla pracy oznacza formę pracy
preferowaną dla wprowadzania do niej modyfikacji. Dla
wykonanej pracy, kompletny kod źródłowy oznacza cały kod
źródłowy wszystkich modułów, wszelkie sprzężone z nią
pośredniczące pliki opisujące oraz zbiory komend stosowane
do sterowania kompilacją i instalowaniem programów.
Niemniej jednak, jako wyjątek specjalny, dystrybuowany (w
formie źródłowej albo binarnej) kod źródłowy nie musi
obejmować niczego, co jest normalnie rozprowadzane przy
pomocy głównych komponentów (kompilator, jądro itd.)
systemu operacyjnego, na którym pracuje część wykonywalna,
o ile sam taki komponent towarzyszy tej części.
Określenie kod źródłowy dla pracy oznacza formę pracy
preferowaną dla wprowadzania do niej modyfikacji. Dla
wykonanej pracy, kompletny kod źródłowy oznacza cały kod
źródłowy wszystkich modułów, wszelkie sprzężone z nią
pośredniczące pliki opisujące oraz zbiory komend stosowane
do sterowania kompilacją i instalowaniem programów.
Niemniej jednak, jako wyjątek specjalny, dystrybuowany (w
formie źródłowej albo binarnej) kod źródłowy nie musi
obejmować niczego, co jest normalnie rozprowadzane przy
pomocy głównych komponentów (kompilator, jądro itd.)
systemu operacyjnego, na którym pracuje część wykonywalna,
o ile sam taki komponent towarzyszy tej części.
Jeśli dystrybucja części wykonywalnej albo kodu
wynikowego realizowana jest poprzez oferowanie dostępu do
kopii z wyznaczonego miejsca, to oferowanie równoważnego
dostępu dla kopiowania kodu źródłowego z tego samego
miejsca liczy się jako rozpowszechnianie kodu źródłowego,
nawet gdy strony trzecie nie są zmuszone do kopiowania
źródła wraz z kodem wynikowym.
Jeśli dystrybucja części wykonywalnej albo kodu
wynikowego realizowana jest poprzez oferowanie dostępu do
kopii z wyznaczonego miejsca, to oferowanie równoważnego
dostępu dla kopiowania kodu źródłowego z tego samego
miejsca liczy się jako rozpowszechnianie kodu źródłowego,
nawet gdy strony trzecie nie są zmuszone do kopiowania
źródła wraz z kodem wynikowym.
4. Poza przypadkami jednoznacznie dozwolonymi w
niniejszej Licencji, nie możesz kopiować, modyfikować,
sublicencjonować ani rozpowszechniać Programu. We
wszystkich pozostałych wypadkach, każda próba skopiowania,
niniejszej Licencji, nie możesz kopiować, modyfikować,
sublicencjonować ani rozpowszechniać Programu. We
wszystkich pozostałych wypadkach, każda próba skopiowania,
sublicencjonowania lub rozpowszechnienia Programu jest
nieważna i powoduje automatyczne wygaśnięcie twoich praw z
tytułu Licencji. Niemniej jednak, stronom, które już
otrzymały od ciebie kopie albo prawa w ramach niniejszej
Licencji, licencje nie wygasają tak długo, jak długo
strony te w pełni stosują się do nich.
nieważna i powoduje automatyczne wygaśnięcie twoich praw z
tytułu Licencji. Niemniej jednak, stronom, które już
otrzymały od ciebie kopie albo prawa w ramach niniejszej
Licencji, licencje nie wygasają tak długo, jak długo
strony te w pełni stosują się do nich.
5. Nie musisz akceptować niniejszej Licencji, jeżeli jej
nie podpisałeś. Niemniej jednak, nic innego nie zapewni ci
5. Nie musisz akceptować niniejszej Licencji, jeżeli jej
nie podpisałeś. Niemniej jednak, nic innego nie zapewni ci
zezwolenia na modyfikowanie lub rozprowadzanie Programu i
pochodzących od niego prac. Działania takie są prawnie
zabronione, jeżeli nie przyjmujesz niniejszej Licencji.
Dlatego też, poprzez modyfikowanie bądź rozpowszechnianie
pochodzących od niego prac. Działania takie są prawnie
zabronione, jeżeli nie przyjmujesz niniejszej Licencji.
Dlatego też, poprzez modyfikowanie bądź rozpowszechnianie
Programu (lub pracy na nim opartej) dajesz wyraz swojej
akceptacji dla Licencji i wszelkich jej postanowień i
warunków dotyczących kopiowania, rozprowadzania i
akceptacji dla Licencji i wszelkich jej postanowień i
warunków dotyczących kopiowania, rozprowadzania i
modyfikowania Programu lub opartych na nim prac.
6. W każdym przypadku redystrybucji przez ciebie
6. W każdym przypadku redystrybucji przez ciebie
Programu (albo opartej na nim pracy), odbiorca
automatycznie otrzymuje od pierwotnego licencjodawcy
licencję na kopiowanie, rozpowszechnianie i modyfikowanie
licencję na kopiowanie, rozpowszechnianie i modyfikowanie
Programu na niniejszych zasadach i warunkach. Na
korzystanie przez odbiorcę z udzielonych w niniejszej
Licencji praw nie możesz narzucać już dalszych ograniczeń.
Nie jesteś stroną odpowiedzialną za kontrolę
korzystanie przez odbiorcę z udzielonych w niniejszej
Licencji praw nie możesz narzucać już dalszych ograniczeń.
Nie jesteś stroną odpowiedzialną za kontrolę
przestrzegania Licencji przez osoby trzecie.
7. Jeśli na skutek wyroku sądowego lub zarzutu
naruszenia patentu, jak też z każdej innej przyczyny (nie
ograniczonej do kwestii patentowych) zostaną narzucone na
ciebie (niezależnie czy to mocą wyroku sądowego, umowy,
czy w inny sposób) warunki sprzeczne z warunkami
niniejszej Licencji, to nie zwalniają one ciebie z
warunków Licencji. Jeśli nie możesz prowadzić dystrybucji
tak, aby wypełniać jednocześnie swoje obowiązki z tytułu
niniejszej Licencji i inne odnośne obowiązki, to w
rezultacie nie możesz wcale rozprowadzać Programu. Na
przykład, gdyby licencja patentowa nie zezwalała na wolną
od opłat licencyjnych redystrybucję Programu przez
wszystkie osoby, które otrzymały kopie bezpośrednio lub
pośrednio od ciebie, to jedynym sposobem pozwalającym ci
7. Jeśli na skutek wyroku sądowego lub zarzutu
naruszenia patentu, jak też z każdej innej przyczyny (nie
ograniczonej do kwestii patentowych) zostaną narzucone na
ciebie (niezależnie czy to mocą wyroku sądowego, umowy,
czy w inny sposób) warunki sprzeczne z warunkami
niniejszej Licencji, to nie zwalniają one ciebie z
warunków Licencji. Jeśli nie możesz prowadzić dystrybucji
tak, aby wypełniać jednocześnie swoje obowiązki z tytułu
niniejszej Licencji i inne odnośne obowiązki, to w
rezultacie nie możesz wcale rozprowadzać Programu. Na
przykład, gdyby licencja patentowa nie zezwalała na wolną
od opłat licencyjnych redystrybucję Programu przez
wszystkie osoby, które otrzymały kopie bezpośrednio lub
pośrednio od ciebie, to jedynym sposobem pozwalającym ci
na przestrzeganie i licencji patentowej, i Licencji
niniejszej, byłoby całkowite powstrzymanie się od
niniejszej, byłoby całkowite powstrzymanie się od
jakiejkolwiek dystrybucji Programu.
Jeżeli w jakichś szczególnych okolicznościach któryś
fragment niniejszego punktu stałby się nieważny lub
niewykonywalny, to intencją jest, aby znajdowała
zastosowanie pozostała część punktu, a treść całego punktu
była stosowana w pozostałych okolicznościach.
Jeżeli w jakichś szczególnych okolicznościach któryś
fragment niniejszego punktu stałby się nieważny lub
niewykonywalny, to intencją jest, aby znajdowała
zastosowanie pozostała część punktu, a treść całego punktu
była stosowana w pozostałych okolicznościach.
Celem niniejszego punktu nie jest zachęcanie do
naruszania patentów czy innych praw własności, albo też do
podważania ich ważności; niniejszy punkt za swój jedyny
cel ma ochronę integralności systemu rozpowszechniania
wolnego oprogramowania, realizowanego za pomocą
publicznych licencji. Wielu ludzi bezinteresownie wniosło
swój wkład do stworzenia szerokiego zakresu oprogramowania
upowszechnianego w tym systemie, mając zaufanie do
konsekwentnego jego stosowania; wyłącznie do
autora/ofiarodawcy należy decyzja, czy życzy on sobie
rozprowadzania oprogramowania za pośrednictwem innego
systemu i licencjobiorca nie może tego prawa wyboru
ograniczać.
Celem niniejszego punktu nie jest zachęcanie do
naruszania patentów czy innych praw własności, albo też do
podważania ich ważności; niniejszy punkt za swój jedyny
cel ma ochronę integralności systemu rozpowszechniania
wolnego oprogramowania, realizowanego za pomocą
publicznych licencji. Wielu ludzi bezinteresownie wniosło
swój wkład do stworzenia szerokiego zakresu oprogramowania
upowszechnianego w tym systemie, mając zaufanie do
konsekwentnego jego stosowania; wyłącznie do
autora/ofiarodawcy należy decyzja, czy życzy on sobie
rozprowadzania oprogramowania za pośrednictwem innego
systemu i licencjobiorca nie może tego prawa wyboru
ograniczać.
Intencją niniejszego punktu jest jasne i wyraźne
przedstawienie tego, co uważa się za skutki, jakie rodzi
pozostała część niniejszej Licencji.
Intencją niniejszego punktu jest jasne i wyraźne
przedstawienie tego, co uważa się za skutki, jakie rodzi
pozostała część niniejszej Licencji.
8. W przypadku, gdy dystrybucja i/lub używanie Programu
w niektórych krajach poddane jest ograniczeniom patentowym
lub zastrzeżeniom prawami autorskimi, początkowy posiadacz
praw autorskich, który poddaje Program pod oddziaływanie
niniejszej Licencji, może dodać wyraźnie zakreślone
geograficzne ograniczenie rozpowszechniania wyłączające te
kraje, dzięki czemu dystrybucja dozwolona będzie wyłącznie
w krajach czy wśród krajów nie objętych takim wyłączeniem.
8. W przypadku, gdy dystrybucja i/lub używanie Programu
w niektórych krajach poddane jest ograniczeniom patentowym
lub zastrzeżeniom prawami autorskimi, początkowy posiadacz
praw autorskich, który poddaje Program pod oddziaływanie
niniejszej Licencji, może dodać wyraźnie zakreślone
geograficzne ograniczenie rozpowszechniania wyłączające te
kraje, dzięki czemu dystrybucja dozwolona będzie wyłącznie
w krajach czy wśród krajów nie objętych takim wyłączeniem.
W przypadku takim, niniejsza Licencja obejmuje dane
ograniczenie tak, jakby było ono wpisane w jej treść.
ograniczenie tak, jakby było ono wpisane w jej treść.
9. W miarę potrzeby Fundacja Wolnego Oprogramowania może
publikować poprawione i/lub nowe wersje Powszechnej
Licencji Publicznej. Takie nowe wersje będą napisane w
duchu podobnym do obecnej wersji, ale mogą różnić się w
szczegółach poruszających nowe problemy czy zagadnienia.
9. W miarę potrzeby Fundacja Wolnego Oprogramowania może
publikować poprawione i/lub nowe wersje Powszechnej
Licencji Publicznej. Takie nowe wersje będą napisane w
duchu podobnym do obecnej wersji, ale mogą różnić się w
szczegółach poruszających nowe problemy czy zagadnienia.
Każdej wersji nadaje się wyróżniający ją numer. Jeżeli
Program podaje numer wersji niniejszej Licencji, odnoszący
się do tej wersji i "wszelkich wersji następnych", masz do
wyboru albo stosować się do postanowień i warunków tej
wersji, albo którejkolwiek wersji późniejszej wydanej
przez Fundację Wolnego Oprogramowania. O ile Program nie
podaje numeru wersji niniejszej Licencji, możesz wybrać
dowolną wersję kiedykolwiek opublikowaną przez Fundację.
Każdej wersji nadaje się wyróżniający ją numer. Jeżeli
Program podaje numer wersji niniejszej Licencji, odnoszący
się do tej wersji i "wszelkich wersji następnych", masz do
wyboru albo stosować się do postanowień i warunków tej
wersji, albo którejkolwiek wersji późniejszej wydanej
przez Fundację Wolnego Oprogramowania. O ile Program nie
podaje numeru wersji niniejszej Licencji, możesz wybrać
dowolną wersję kiedykolwiek opublikowaną przez Fundację.
10. Jeśli chcesz włączyć części Programu do innych
wolnych programów, których warunki rozpowszechniania są
inne, zwróć się pisemnie do autora z prośbą o pozwolenie.
W przypadku oprogramowania objętego przez Fundację prawem
10. Jeśli chcesz włączyć części Programu do innych
wolnych programów, których warunki rozpowszechniania są
inne, zwróć się pisemnie do autora z prośbą o pozwolenie.
W przypadku oprogramowania objętego przez Fundację prawem
autorskim, napisz do Fundacji; czasami czynimy od tego
odstępstwa. W naszej decyzji kierujemy się dwoma celami:
odstępstwa. W naszej decyzji kierujemy się dwoma celami:
utrzymania wolnego statusu wszystkich pochodnych naszego
wolnego oprogramowania oraz - generalnie - promowania
współudziału i wielokrotnego stosowania oprogramowania.
współudziału i wielokrotnego stosowania oprogramowania.
WYRÓB BEZ GWARANCJI
WYRÓB BEZ GWARANCJI
11. PONIEWAŻ PROGRAM JEST LICENCJONOWANY BEZPŁATNIE, NIE
JEST OBJĘTY GWARANCJĄ W ZAKRESIE DOZWOLONYM PRZEZ
OBOWIĄZUJĄCE PRZEPISY. O ILE NA PIŚMIE NIE STANOWI SIĘ
11. PONIEWAŻ PROGRAM JEST LICENCJONOWANY BEZPŁATNIE, NIE
JEST OBJĘTY GWARANCJĄ W ZAKRESIE DOZWOLONYM PRZEZ
OBOWIĄZUJĄCE PRZEPISY. O ILE NA PIŚMIE NIE STANOWI SIĘ
INACZEJ, POSIADACZE PRAW AUTORSKICH I/LUB INNE STRONY
ZAPEWNIAJĄ PROGRAM W STANIE, W JAKIM JEST ("JAK WIDAĆ")
BEZ JAKIEJKOLWIEK GWARANCJI, ANI WYRAŹNEJ, ANI DOMYŚLNEJ,
W TYM MIĘDZY INNYMI DOMYŚLNYCH GWARANCJI CO DO
PRZYDATNOŚCI HANDLOWEJ I PRZYDATNOŚCI DO OKREŚLONYCH
ZASTOSOWAŃ. CAŁOŚĆ RYZYKA W ZAKRESIE JAKOŚCI I
SKUTECZNOŚCI DZIAŁANIA PROGRAMU PONOSISZ SAM. W RAZIE
GDYBY PROGRAM OKAZAŁ SIĘ WADLIWY, PONOSISZ KOSZT CAŁEGO
NIEZBĘDNEGO SERWISU, NAPRAWY I KORYGOWANIA.
ZAPEWNIAJĄ PROGRAM W STANIE, W JAKIM JEST ("JAK WIDAĆ")
BEZ JAKIEJKOLWIEK GWARANCJI, ANI WYRAŹNEJ, ANI DOMYŚLNEJ,
W TYM MIĘDZY INNYMI DOMYŚLNYCH GWARANCJI CO DO
PRZYDATNOŚCI HANDLOWEJ I PRZYDATNOŚCI DO OKREŚLONYCH
ZASTOSOWAŃ. CAŁOŚĆ RYZYKA W ZAKRESIE JAKOŚCI I
SKUTECZNOŚCI DZIAŁANIA PROGRAMU PONOSISZ SAM. W RAZIE
GDYBY PROGRAM OKAZAŁ SIĘ WADLIWY, PONOSISZ KOSZT CAŁEGO
NIEZBĘDNEGO SERWISU, NAPRAWY I KORYGOWANIA.
12. O ILE OBOWIĄZUJĄCE PRAWO NIE STANOWI INACZEJ ALBO
CZEGOŚ INNEGO NIE UZGODNIONO W FORMIE PISEMNEJ, ŻADEN
POSIADACZ PRAW AUTORSKICH ANI INNA STRONA MODYFIKUJĄCA
I/LUB REDYSTRYBUJĄCA PROGRAM ZGODNIE Z POWYŻSZYMI
ZEZWOLENIAMI, W ŻADNYM WYPADKU NIE JEST ODPOWIEDZIALNA
WOBEC CIEBIE ZA SZKODY, W TYM SZKODY OGÓLNE, SPECJALNE,
UBOCZNE LUB SKUTKOWE, WYNIKŁE Z UŻYCIA BĄDŹ NIEMOŻLIWOŚCI
UŻYCIA PROGRAMU (W TYM, MIĘDZY INNYMI, ZA UTRATĘ DANYCH
LUB POWSTANIE DANYCH NIEDOKŁADNYCH, ALBO ZA STRATY
PONIESIONE PRZEZ CIEBIE LUB STRONY TRZECIE, JAK TEŻ
NIEDZIAŁANIE PROGRAMU Z INNYMI PROGRAMAMI), NAWET JEŚLI
DANY POSIADACZ BĄDŹ INNA STRONA ZOSTALI POWIADOMIENI O
MOŻLIWOŚCI POWSTANIA TAKICH SZKÓD.
12. O ILE OBOWIĄZUJĄCE PRAWO NIE STANOWI INACZEJ ALBO
CZEGOŚ INNEGO NIE UZGODNIONO W FORMIE PISEMNEJ, ŻADEN
POSIADACZ PRAW AUTORSKICH ANI INNA STRONA MODYFIKUJĄCA
I/LUB REDYSTRYBUJĄCA PROGRAM ZGODNIE Z POWYŻSZYMI
ZEZWOLENIAMI, W ŻADNYM WYPADKU NIE JEST ODPOWIEDZIALNA
WOBEC CIEBIE ZA SZKODY, W TYM SZKODY OGÓLNE, SPECJALNE,
UBOCZNE LUB SKUTKOWE, WYNIKŁE Z UŻYCIA BĄDŹ NIEMOŻLIWOŚCI
UŻYCIA PROGRAMU (W TYM, MIĘDZY INNYMI, ZA UTRATĘ DANYCH
LUB POWSTANIE DANYCH NIEDOKŁADNYCH, ALBO ZA STRATY
PONIESIONE PRZEZ CIEBIE LUB STRONY TRZECIE, JAK TEŻ
NIEDZIAŁANIE PROGRAMU Z INNYMI PROGRAMAMI), NAWET JEŚLI
DANY POSIADACZ BĄDŹ INNA STRONA ZOSTALI POWIADOMIENI O
MOŻLIWOŚCI POWSTANIA TAKICH SZKÓD.
KONIEC ZASAD I WARUNKÓW
KONIEC ZASAD I WARUNKÓW
Jak stosować niniejsze Warunki do Twoich nowych
programów
Jak stosować niniejsze Warunki do Twoich nowych
programów
Jeśli opracowujesz nowy program i chciałbyś, aby stał
się on przydatny dla szerokiego ogółu, najlepszą drogą do
osiągnięcia tego będzie nadanie twemu programowi
charakteru wolnego oprogramowania, które każdy może
redystrybuować i zmieniać na niniejszych warunkach.
Jeśli opracowujesz nowy program i chciałbyś, aby stał
się on przydatny dla szerokiego ogółu, najlepszą drogą do
osiągnięcia tego będzie nadanie twemu programowi
charakteru wolnego oprogramowania, które każdy może
redystrybuować i zmieniać na niniejszych warunkach.
W tym celu do programu dołącz poniższe informacje.
Bezpieczniej jest dołączyć je na początku każdego pliku
źródłowego, dzięki czemu najskuteczniej można przekazać
fakt nieistnienia gwarancji; każdy plik powinien przy tym
nosić uwagę "copyright" i odnośnik, gdzie można znaleźć
pełną informację.
W tym celu do programu dołącz poniższe informacje.
Bezpieczniej jest dołączyć je na początku każdego pliku
źródłowego, dzięki czemu najskuteczniej można przekazać
fakt nieistnienia gwarancji; każdy plik powinien przy tym
nosić uwagę "copyright" i odnośnik, gdzie można znaleźć
pełną informację.
nazwa programu i informacja, do czego on służy.
nazwa programu i informacja, do czego on służy.
Copyright (C) 19../20.. nazwisko autora
Niniejszy program jest wolnym oprogramowaniem;
możesz go rozprowadzać dalej i/lub modyfikować na
możesz go rozprowadzać dalej i/lub modyfikować na
warunkach Powszechnej Licencji Publicznej GNU,
wydanej przez Fundację Wolnego Oprogramowania -
według wersji 2-giej tej Licencji lub którejś z
późniejszych wersji.
wydanej przez Fundację Wolnego Oprogramowania -
według wersji 2-giej tej Licencji lub którejś z
późniejszych wersji.
Niniejszy program rozpowszechniany jest z nadzieją,
iż będzie on użyteczny - jednak BEZ JAKIEJKOLWIEK
GWARANCJI, nawet domyślnej gwarancji PRZYDATNOŚCI
HANDLOWEJ albo PRZYDATNOŚCI DO OKREŚLONYCH
ZASTOSOWAŃ. W celu uzyskania bliższych informacji -
Niniejszy program rozpowszechniany jest z nadzieją,
iż będzie on użyteczny - jednak BEZ JAKIEJKOLWIEK
GWARANCJI, nawet domyślnej gwarancji PRZYDATNOŚCI
HANDLOWEJ albo PRZYDATNOŚCI DO OKREŚLONYCH
ZASTOSOWAŃ. W celu uzyskania bliższych informacji -
Powszechna Licencja Publiczna GNU.
Z pewnością wraz z niniejszym programem otrzymałeś
też egzemplarz Powszechnej Licencji Publicznej GNU
(GNU General Public License); jeśli nie - napisz do
Z pewnością wraz z niniejszym programem otrzymałeś
też egzemplarz Powszechnej Licencji Publicznej GNU
(GNU General Public License); jeśli nie - napisz do
Free Software Foundation, Inc., 51 Franklin Street,
Fifth Floor, Boston, MA 02110-1301 USA
Podaj też informacje o sposobie kontaktowania się z
tobą pocztą elektroniczną lub zwykłą.
Podaj też informacje o sposobie kontaktowania się z
tobą pocztą elektroniczną lub zwykłą.
Jeśli dany program jest interaktywny, spraw, aby w
momencie wchodzenia w tryb interaktywny wyświetlał on
komunikat jak w poniższym przykładzie:
Jeśli dany program jest interaktywny, spraw, aby w
momencie wchodzenia w tryb interaktywny wyświetlał on
komunikat jak w poniższym przykładzie:
Gnomovision wersja 69, Copyright C 19.. nazwisko
Gnomovision wydawany jest ABSOLUTNIE BEZ ŻADNEJ
GWARANCJI - w celu uzyskania dalszych szczegółów
Gnomovision wydawany jest ABSOLUTNIE BEZ ŻADNEJ
GWARANCJI - w celu uzyskania dalszych szczegółów
wpisz "show w". To jest wolne oprogramowanie i mile
widziane jest dalsze rozpowszechnianie go przez
ciebie na określonych warunkach - w celu uzyskania
bliższych szczegółów wpisz "show c".
ciebie na określonych warunkach - w celu uzyskania
bliższych szczegółów wpisz "show c".
Powyższe hipotetyczne polecenia "show w" i "show c"
winny powodować wyświetlenie odpowiednich części
Powszechnej Licencji Publicznej. Oczywiście możesz używać
innych poleceń niż "show w" i "show c"; mogą to być nawet
kliknięcia myszą lub pozycje menu - co tylko sobie uznasz
Powyższe hipotetyczne polecenia "show w" i "show c"
winny powodować wyświetlenie odpowiednich części
Powszechnej Licencji Publicznej. Oczywiście możesz używać
innych poleceń niż "show w" i "show c"; mogą to być nawet
kliknięcia myszą lub pozycje menu - co tylko sobie uznasz
za stosowne.
Powinieneś też poprosić swego pracodawcę (jeśli
pracujesz jako programista) czy też swoją szkołę (jeśli
jesteś uczniem), o podpisanie, w razie potrzeby,
"Rezygnacji z praw autorskich" do programu. Poniżej
podajemy przykład (zmień nazwy/nazwiska):
Powinieneś też poprosić swego pracodawcę (jeśli
pracujesz jako programista) czy też swoją szkołę (jeśli
jesteś uczniem), o podpisanie, w razie potrzeby,
"Rezygnacji z praw autorskich" do programu. Poniżej
podajemy przykład (zmień nazwy/nazwiska):
My, firma Jojodyne Sp. z o.o. niniejszym zrzekamy
się i rezygnujemy z wszelkich interesów prawnych w
się i rezygnujemy z wszelkich interesów prawnych w
zakresie praw autorskich do programu "Gnomovision"
(który realizuje następujące funkcje...), napisanego
(który realizuje następujące funkcje...), napisanego
przez p.Jana Kowalskiego.
Podpis: /-/ Gniewosław Wielkoważny
Podpis: /-/ Gniewosław Wielkoważny
Gniewosław Wielkoważny, Prezes...itp
Gniewosław Wielkoważny, Prezes...itp
Powszechna Licencja Publiczna nie zezwala na włączanie
twego programu do programów prawnie zastrzeżonych. Jeśli
twój program jest biblioteką podprogramów, możesz
rozważyć, czy nie będzie korzystniej zezwolić na
powiązanie prawnie zastrzeżonych aplikacji z biblioteką.
Jeśli chciałbyś właśnie tego dokonać, zamiast niniejszej
Licencji zastosuj Powszechną Licencję Publiczną GNU dla
Powszechna Licencja Publiczna nie zezwala na włączanie
twego programu do programów prawnie zastrzeżonych. Jeśli
twój program jest biblioteką podprogramów, możesz
rozważyć, czy nie będzie korzystniej zezwolić na
powiązanie prawnie zastrzeżonych aplikacji z biblioteką.
Jeśli chciałbyś właśnie tego dokonać, zamiast niniejszej
Licencji zastosuj Powszechną Licencję Publiczną GNU dla
Bibliotek.
[QueryBox]
Okna zapytania
W oknach dialogowych użyj kursorów lub naciśnij
podświetloną literę aby wybrać opcję. Możesz też kliknąć
myszą na odpowiednim przycisku.
W oknach dialogowych użyj kursorów lub naciśnij
podświetloną literę aby wybrać opcję. Możesz też kliknąć
myszą na odpowiednim przycisku.
[How to use help]
Jak korzystać z pomocy
Jak korzystać z pomocy
Do obsługi przeglądarki pomocy możesz użyć kursorów lub
myszy. Naciśnij strzałkę w dół aby przejść do
następnej pozycji lub przewinąć ekran w dół. Naciśnij
strzałkę w górę aby przejść do poprzedniej pozycji lub
przewinąć ekran w górę. Naciśnij strzałkę w prawo aby
podążyć za zaznaczonym odnośnikiem. Naciśnij strzałkę w
lewo aby powrócić do poprzedniego odwiedzonego węzła w
Do obsługi przeglądarki pomocy możesz użyć kursorów lub
myszy. Naciśnij strzałkę w dół aby przejść do
następnej pozycji lub przewinąć ekran w dół. Naciśnij
strzałkę w górę aby przejść do poprzedniej pozycji lub
przewinąć ekran w górę. Naciśnij strzałkę w prawo aby
podążyć za zaznaczonym odnośnikiem. Naciśnij strzałkę w
lewo aby powrócić do poprzedniego odwiedzonego węzła w
historii.
Jeśli twój terminal nie obsługuje klawiszy kursorów,
możesz użyć spacji aby przewinąć do przodu i klawisza
b aby przewinąć do tyłu. Użyj TAB aby przejść do
następnej pozycji i ENTER aby odwiedzić zaznaczony
odnośnik. Klawisz l wraca do poprzedniego odwiedzonego
węzła w historii. Naciśnij ESC aby wyjść z
przeglądarki pomocy.
Jeśli twój terminal nie obsługuje klawiszy kursorów,
możesz użyć spacji aby przewinąć do przodu i klawisza
b aby przewinąć do tyłu. Użyj TAB aby przejść do
następnej pozycji i ENTER aby odwiedzić zaznaczony
odnośnik. Klawisz l wraca do poprzedniego odwiedzonego
węzła w historii. Naciśnij ESC aby wyjść z
przeglądarki pomocy.
Lewy przycisk myszy uaktywnia odnośnik lub przewija ekran.
Prawy wraca do poprzedniego węzła w historii.
Lewy przycisk myszy uaktywnia odnośnik lub przewija ekran.
Prawy wraca do poprzedniego węzła w historii.
Pełna lista klawiszy przeglądarki pomocy:
Pełna lista klawiszy przeglądarki pomocy:
Podstawowe klawisze ruchuGeneral Movement Keys także
działają.
Podstawowe klawisze ruchuGeneral Movement Keys także
działają.
tab Następna pozycja.
tab Następna pozycja.
M-tab Poprzednia pozycja.
dół Następna pozycja lub przewiń ekran w dół.
góra Poprzednia pozycja lub przewiń w górę.
prawo , enter Uaktywnia odnośnik.
lewo , l Poprzedni węzeł w historii.
F1 Pomoc dla przeglądarki pomocy.
n Następny węzeł.
p Poprzedni węzeł.
c Przejście do Spisu treści.
F10 , esc Wyjście z przeglądarki pomocy.
dół Następna pozycja lub przewiń ekran w dół.
góra Poprzednia pozycja lub przewiń w górę.
prawo , enter Uaktywnia odnośnik.
lewo , l Poprzedni węzeł w historii.
F1 Pomoc dla przeglądarki pomocy.
n Następny węzeł.
p Poprzedni węzeł.
c Przejście do Spisu treści.
F10 , esc Wyjście z przeglądarki pomocy.

Local variables:
fill-column: 58

View File

@ -0,0 +1,21 @@
Charset of this file: utf-8
Warning: Это ВРЕМЕННЫЙ файл!
Перекодировка в mc.
Список кодировок.
Список кодировок находится в файле lib/mc.charsets
В файле src/strutil.c определены одно-многобайтные кодировки.
При этом кодировки разбиты по группам:
1) однобайтные 7-ми битные
2) однобайтные 8-ми битные
3) многобайтные
ИМХО бред. Нужно, чтобы не было различий между кодировками.
подумаю ещё как...

File diff suppressed because it is too large Load Diff

View File

@ -6,19 +6,19 @@
v v v mqv v v v mqu v v mj
qqqqqqCommander qj 
Вы сейчас видите главное окно интерактивной подсказки
программы GNU Midnight Commander .
Вы сейчас видите главное окно интерактивной подсказки
программы GNU Midnight Commander .
Чтобы узнать, как пользоваться подсказкой, нажмите клавишу
EnterHow to use help, иначе переходите к перечню разделовContents подсказки.
Чтобы узнать, как пользоваться подсказкой, нажмите клавишу
EnterHow to use help, иначе переходите к перечню разделовContents подсказки.
Программа Midnight Commander поставляется АБСОЛЮТНО БЕЗ
ВСЯКИХ ГАРАНТИЙГарантия. Это свободно распространяемое программное
обеспечение, созданное группой авторовAUTHORS. Вы можете передавать
его другим при условии соблюдения требований лицензии GNUЛицензия (оригинал на английском)
(прочитайте неофициальный переводЛицензия этой лицензии).
Программа Midnight Commander поставляется АБСОЛЮТНО БЕЗ
ВСЯКИХ ГАРАНТИЙГарантия. Это свободно распространяемое программное
обеспечение, созданное группой авторовAUTHORS. Вы можете передавать
его другим при условии соблюдения требований лицензии GNUЛицензия (оригинал на английском)
(прочитайте неофициальный переводЛицензия этой лицензии).
Русский перевод текста подсказки - Костромин В.А., 1999 г.[Лицензия (оригинал на английском)]
Русский перевод текста подсказки - Костромин В.А., 1999 г.[Лицензия (оригинал на английском)]
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
@ -429,478 +429,478 @@ to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU
Library General Public License instead of this License.
[Лицензия]
[Лицензия]
УНИВЕРСАЛЬНАЯ ОБЩЕСТВЕННАЯ ЛИЦЕНЗИЯ GNU
УНИВЕРСАЛЬНАЯ ОБЩЕСТВЕННАЯ ЛИЦЕНЗИЯ GNU
Версия 2, июнь 1991
Версия 2, июнь 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
(C) Перевод. О.В. Кузина, В.М. Юфа, 1993
(C) Перевод. О.С. Тихонов, 1998
(C) Перевод. О.В. Кузина, В.М. Юфа, 1993
(C) Перевод. О.С. Тихонов, 1998
Всем разрешается копировать и распространять дословные копии
этого лицензионного документа, но изменять его нельзя.
Всем разрешается копировать и распространять дословные копии
этого лицензионного документа, но изменять его нельзя.
Преамбула
Преамбула
Лицензии на большую часть программного обеспечения (ПО) сос-
тавлены так, чтобы лишить вас свободы совместно использовать
и изменять его. Напротив, Универсальная Общественная Лицензия
GNU предназначена гарантировать вашу свободу совместно ис-
пользовать и изменять свободное ПО, т.е. удостоверить, что ПО
является свободным для всех его пользователей. Эта Универ-
сальная Общественная Лицензия применима к большей части ПО
Фонда Свободного ПО и ко всем другим программам, чьи авторы
принимают на себя обязательства ее использовать. (Вместо нее
для части ПО Фонда Свободного ПО применяется Универсальная
Общественная Лицензия GNU для библиотек.) Вы тоже можете
использовать ее для своих программ.
Лицензии на большую часть программного обеспечения (ПО) сос-
тавлены так, чтобы лишить вас свободы совместно использовать
и изменять его. Напротив, Универсальная Общественная Лицензия
GNU предназначена гарантировать вашу свободу совместно ис-
пользовать и изменять свободное ПО, т.е. удостоверить, что ПО
является свободным для всех его пользователей. Эта Универ-
сальная Общественная Лицензия применима к большей части ПО
Фонда Свободного ПО и ко всем другим программам, чьи авторы
принимают на себя обязательства ее использовать. (Вместо нее
для части ПО Фонда Свободного ПО применяется Универсальная
Общественная Лицензия GNU для библиотек.) Вы тоже можете
использовать ее для своих программ.
Когда мы говорим о свободном ПО, мы имеем в виду свободу, а
не цену. Предполагается, что наши Универсальные Общественные
Лицензии гарантируют, что вы пользуетесь свободой распростра-
нять копии свободного ПО (и получать за это вознаграждение,
если вы того желаете); что вы получаете исходный код или
можете получить его, если захотите; что вы можете изменять
ПО или использовать его части в новых свободных программах;
и что вы знаете, что вы можете все это делать.
Когда мы говорим о свободном ПО, мы имеем в виду свободу, а
не цену. Предполагается, что наши Универсальные Общественные
Лицензии гарантируют, что вы пользуетесь свободой распростра-
нять копии свободного ПО (и получать за это вознаграждение,
если вы того желаете); что вы получаете исходный код или
можете получить его, если захотите; что вы можете изменять
ПО или использовать его части в новых свободных программах;
и что вы знаете, что вы можете все это делать.
Чтобы защитить ваши права, нам нужно ввести такие ограниче-
ния, которые запретят кому бы то ни было отказывать вам в
этих правах или потребовать от вас отказаться от этих прав.
Эти ограничения переводятся в некоторые обязательства для
вас, если вы распространяете копии ПО или если вы модифици-
руете его.
Чтобы защитить ваши права, нам нужно ввести такие ограниче-
ния, которые запретят кому бы то ни было отказывать вам в
этих правах или потребовать от вас отказаться от этих прав.
Эти ограничения переводятся в некоторые обязательства для
вас, если вы распространяете копии ПО или если вы модифици-
руете его.
Например, если вы распространяете копии такой программы
бесплатно или за вознаграждение, вы должны предоставить
получателям все права, которыми вы обладаете. Вы должны
гарантировать, что они тоже получат или смогут получить
исходный код. И вы должны показать им эти условия, чтобы
они знали о своих правах.
Например, если вы распространяете копии такой программы
бесплатно или за вознаграждение, вы должны предоставить
получателям все права, которыми вы обладаете. Вы должны
гарантировать, что они тоже получат или смогут получить
исходный код. И вы должны показать им эти условия, чтобы
они знали о своих правах.
Мы защищаем ваши права в два этапа: (1) сохраняем авторские
права на ПО и (2) предлагаем вам эту лицензию, которая дает
вам законное право копировать, распространять и/или модифи-
цировать ПО.
Мы защищаем ваши права в два этапа: (1) сохраняем авторские
права на ПО и (2) предлагаем вам эту лицензию, которая дает
вам законное право копировать, распространять и/или модифи-
цировать ПО.
Также, чтобы защитить нас и каждого автора, мы хотим удосто-
вериться, что все понимают, что гарантий на это свободное ПО
нет. Если ПО модифицируется и передается кем-то еще, мы
хотим, чтобы получатели ПО знали, что то, что у них есть --
это не оригинал, чтобы любые проблемы, созданные другими, не
отразились на репутации первоначальных авторов.
Также, чтобы защитить нас и каждого автора, мы хотим удосто-
вериться, что все понимают, что гарантий на это свободное ПО
нет. Если ПО модифицируется и передается кем-то еще, мы
хотим, чтобы получатели ПО знали, что то, что у них есть --
это не оригинал, чтобы любые проблемы, созданные другими, не
отразились на репутации первоначальных авторов.
И наконец, каждой свободной программе постоянно угрожают па-
тенты на ПО. Мы хотим избежать опасности, что повторные рас-
пространители свободной программы самостоятельно получат па-
тенты, делая программу таким образом частной собственностью.
Чтобы предотвратить это, мы явно заявляем, что любой патент
должен быть либо предоставлен всем для свободного использо-
вания, либо не предоставлен никому.
И наконец, каждой свободной программе постоянно угрожают па-
тенты на ПО. Мы хотим избежать опасности, что повторные рас-
пространители свободной программы самостоятельно получат па-
тенты, делая программу таким образом частной собственностью.
Чтобы предотвратить это, мы явно заявляем, что любой патент
должен быть либо предоставлен всем для свободного использо-
вания, либо не предоставлен никому.
Ниже следуют точные определения и условия для копирования,
распространения и модификации.
Ниже следуют точные определения и условия для копирования,
распространения и модификации.
ОПРЕДЕЛЕНИЯ И УСЛОВИЯ ДЛЯ КОПИРОВАНИЯ, РАСПРОСТРАНЕНИЯ И
МОДИФИКАЦИИ
ОПРЕДЕЛЕНИЯ И УСЛОВИЯ ДЛЯ КОПИРОВАНИЯ, РАСПРОСТРАНЕНИЯ И
МОДИФИКАЦИИ
1. Эта Лицензия применима к любой программе или другому
произведению, содержащему уведомление, помещенное держа-
телем авторских прав и сообщающее о том, что оно может
распространяться при условиях, оговоренных в данной Уни-
версальной Общественной Лицензии. В последующем термин
"Программа" относится к любой такой программе или произ-
ведению, а термин "произведение, основанное на Программе"
означает Программу или любое произведение, содержащее
Программу или ее часть, дословную, или модифицированную,
и/или переведенную на другой язык. (Здесь и далее перевод
включается без ограничений в понятие "модификация".)
Каждый обладатель лицензии адресуется как "вы". Виды дея-
тельности, не являющиеся копированием, распространением
или модификацией не охватываются этой Лицензией; они за
пределами ее влияния. Использование Программы по ее функ-
циональному назначению не ограничено, и выходные данные
Программы охватываются этой Лицензией, только если их со-
держание является произведением, основанным на Программе
(вне зависимости от того, были ли они получены в процессе
использования Программы). Являются ли они таковыми, зави-
сит от того, что именно делает Программа.
2. Вы можете копировать и распространять дословные копии ис-
ходного кода Программы по его получении на любом носите-
ле, при условии что вы соответствующим образом помещаете
на видном месте в каждой копии соответствующее уведомле-
ние об авторских правах и отказ от гарантий; оставляете
нетронутыми все уведомления, относящиеся к данной Лицен-
зии и к отсутствию каких-либо гарантий; и передаете всем
другим получателям Программы копию данной Лицензии вместе
с Программой. Вы можете назначить плату за физический акт
передачи копии и можете по своему усмотрению предостав-
лять гарантии за вознаграждение.
3. Вы можете изменять свою копию или копии Программы или
любой ее части, создавая таким образом произведение, ос-
нованное на Программе, и копировать и распространять эти
модификации или произведение в соответствии с Разделом 1,
приведенным выше, при условии, что вы выполните все ниже-
следующие условия:
1. Вы обязаны снабдить модифицированные файлы заметными
уведомлениями, содержащими указания на то, что вы
изменили файлы, и дату каждого изменения.
2. Вы обязаны предоставить всем третьим лицам лицензию
на бесплатное использование каждого произведения,
которое вы распространяете или публикуете, целиком,
и которое полностью или частично содержит Программу
или какую-либо ее часть, на условиях, оговоренных в
данной Лицензии.
3. Если модифицированная программа обычно читает коман-
ды в интерактивном режиме работы, вы должны сделать
так, чтобы при запуске для работы в таком интер-
активном режиме обычным для нее способом она печа-
тала или выводила на экран объявление, содержащее
соответствующее уведомление об авторских правах и
уведомление о том, что гарантий нет (или, наоборот,
сообщающее о том, что вы обеспечиваете гарантии), и
что пользователи могут повторно распространять про-
грамму при этих условиях, и указывающее пользовате-
лю, как просмотреть копию данной Лицензии.
(Исключение: если сама Программа работает в интер-
активном режиме, но обычно не выводит подобное
объявление, то ваше произведение, основанное на
Программе, не обязано выводить объявление.)
Эти требования применяются к модифицированному произве-
дению в целом. Если известные части этого произведения
не были основаны на Программе и могут обоснованно счи-
таться независимыми и самостоятельными произведениями,
то эта Лицензия и ее условия не распространяются на эти
части, если вы распространяете их как отдельные произве-
дения. Но если вы распространяете эти части как часть
целого произведения, основанного на Программе, то вы
обязаны делать это в соответствии с условиями данной Ли-
цензии, распространяя права получателей лицензии на все
произведение и, таким образом, на каждую часть, вне за-
висимости от того, кто ее написал. Таким образом, содер-
жание этого раздела не имеет цели претендовать на ваши
права на произведение, написанное полностью вами, или
оспаривать их; цель скорее в том, чтобы развить право
управлять распространением производных или коллективных
произведений, основанных на Программе. Кроме того, прос-
тое нахождение другого произведения, не основанного на
этой Программе, совместно с Программой (или с произведе-
нием, основанным на этой Программе) на том же носителе
для постоянного хранения или распространяемом носителе
не распространяет действие этой Лицензии на другое произ-
ведение.
4. Вы можете копировать и распространять Программу (или
произведение, основанное на ней) согласно Разделу 2) в
объектном коде или в выполнимом виде в соответствии с
Разделами 1 и 2, приведенными выше, при условии, что вы
также выполните одно из следующих требований:
1. Сопроводите ее полным соответствующим машиночитаемым
исходным кодом, который должен распространяться в
соответствии с Разделами 1 и 2, приведенными выше,
на носителе, обычно используемом для обмена ПО; или,
2. Сопроводите ее письменным предложением, действитель-
ным по крайней мере в течение трех лет, предоставить
любому третьему лицу за вознаграждение не большее
стоимости физического акта изготовления копии полную
машиночитаемую копию соответствующего исходного
кода, подлежащую распространению в соответствии с
Разделами 1 и 2, приведенными выше; или
3. Сопроводите ее информацией, полученной вами в ка-
честве предложения распространить соответствующий
исходный код. (Эта возможность допустима только для
некоммерческого распространения, и только если вы
получили программу в объектном коде или в выполнимом
виде с предложением в соответствии с Пунктом b)
выше.)
Исходный код для произведения означает его вид, пред-
почтительный для выполнения в нем модификаций. Для ис-
полняемого произведения полный исходный код означает все
исходные коды для всех модулей, которые он содержит, плюс
любые связанные с произведением файлы определения
интерфейса, плюс сценарии, используемые для управления
компиляцией и установкой исполняемого произведения.
Однако, в виде особого исключения распространяемый исход-
ный код не обязан включать то, что обычно предоставляется
с основными компонентами операционной системы, под
управлением которой работает исполняемое произведение, за
исключением случая, когда сам компонент сопровождает
исполняемое произведение. Если распространение исполня-
емого произведения или объектного кода происходит путем
предоставления доступа для копирования с обозначенного
места, то предоставление доступа для копирования исходно-
го кода с того же места считается распространением исход-
ного кода, даже если третьи лица не принуждаются к копи-
рованию исходного кода вместе с объектным кодом.
5. Вы не можете копировать, изменять, повторно лицензиро-
вать, или распространять Программу иначе, чем это явно
предусмотрено данной Лицензией. Любая попытка копировать,
изменять, повторно лицензировать, или распространять Про-
грамму каким-либо другим способом неправомерна и автома-
тически прекращает ваши права данные вам этой Лицензией.
Однако лицензии лиц, получивших от вас копии или права
согласно данной Универсальной Общественной Лицензии, не
прекратят своего действия до тех пор, пока эти лица пол-
ностью соблюдают условия.
6. Вы не обязаны соглашаться с этой Лицензией, так как вы
не подписывали ее. Однако тогда вы не получаете права
модифицировать или распространять Программу или основан-
ные на Программе произведения. Эти действия запрещены
законом, если вы не принимаете к соблюдению эту Лицензию.
А значит, изменяя или распространяя Программу (или
произведение, основанное на Программе), вы изъявляете
свое согласие с этой Лицензией и всеми ее условиями о
копировании, распространении или модификации Программы
или произведений, основанных на ней.
7. Каждый раз, когда вы повторно распространяете Программу
(или любое произведение, основанное на Программе), полу-
чатель этого произведения автоматически получает лицензию
от первоначального держателя лицензии на копирование,
распространение или модификацию Программы, обсуждаемую
в этих определениях и условиях. Вы не можете налагать
каких-либо дополнительных ограничений на осуществление
получателем прав, предоставленных данным документом. Вы
не несете ответственности за соблюдение третьими лицами
условий этой Лицензии.
8. Если в результате судебного разбирательства, или обвине-
ния в нарушении патента или по любой другой причине (не
обязательно связанной с патентами), вам навязаны условия,
противоречащие данной Лицензии (как по решению суда, так
и нет), то это не освобождает вас от соблюдения Лицензии.
Если вы не можете заниматься распространением так, чтобы
одновременно удовлетворить требованиям и этой Лицензии,
и всем другим требованиям, то вы не должны заниматься
распространением Программы.
Например, если патент не позволяет безвозмездное повтор-
ное распространение Программы всем, кто получил копии от
вас непосредственно или через посредников, то единствен-
ным способом удовлетворить и патенту, и этой Лицензии
будет ваш полный отказ от распространения Программы. Если
какая-либо часть этого раздела не имеет силы или не может
быть применена при любых конкретных обстоятельствах, то
подразумевается, что имеет силу остальная часть раздела,
и весь Раздел имеет силу при других обстоятельствах. Цель
этого раздела -- не побудить вас делать заявления о нару-
шениях прав на патент, или заявлять о других претензиях
на право собственности, или оспаривать правильность по-
добных претензий; единственная цель этого раздела -- за-
щита целостности системы распространения свободного ПО,
которая реализуется использованием общих лицензий. Многие
люди благодаря этой системе внесли щедрый вклад в широкий
спектр распространяемого ПО полагаясь на согласованное
применение этой системы; автору принадлежит право решать
хочет ли он или она распространять ПО в этой системе или
в какой-то другой, и получатель лицензии не может влиять
на принятие этого решения. Этот раздел предназначен для
того, чтобы тщательно прояснить, что полагается следстви-
ем из остальной части данной Лицензии.
9. Если распространение и/или применение Программы ограниче-
но в ряде стран либо патентами, либо авторскими правами
на интерфейсы, первоначальный обладатель авторских прав,
выпускающий Программу с этой Лицензией, может добавить
явное ограничение на географическое распространение,
исключив такие страны, так что распространение разреша-
ется только в тех странах, которые не были исключены. В
этом случае данная Лицензия включает в себя это ограниче-
ние, как если бы оно было написано в тексте данной Лицен-
зии.
10. Фонд Свободного ПО может время от времени публиковать
пересмотренные и/или новые версии Универсальной Общест-
венной Лицензии. Такие новые версии будут сходны по духу
с настоящей версией, но могут отличаться в деталях,
направленных на новые проблемы или обстоятельства. Каждой
версии придается отличительный номер версии. Если в Про-
грамме указан номер версии данной Лицензии, которая к ней
применима, и слова "любая последующая версия", вы можете
по выбору следовать определениям и условиям либо данной
версии, либо любой последующей версии, опубликованной
Фондом Свободного ПО. Если в Программе не указан номер
версии данной Лицензии, вы можете выбрать любую версию,
когда-либо опубликованную Фондом Свободного ПО.
11. Если вы хотите встроить части Программы в другие свобод-
ные программы с иными условиями распространения, напишите
автору с просьбой о разрешении. Для ПО, которое охраняет-
ся авторскими правами Фонда Свободного ПО, напишите в
Фонд Свободного ПО; мы иногда делаем исключения для
этого. Наше решение будет руководствоваться двумя целями:
сохранения свободного статуса всех производных нашего
свободного ПО и содействия совместному и повторному ис-
пользованию ПО вообще.
1. Эта Лицензия применима к любой программе или другому
произведению, содержащему уведомление, помещенное держа-
телем авторских прав и сообщающее о том, что оно может
распространяться при условиях, оговоренных в данной Уни-
версальной Общественной Лицензии. В последующем термин
"Программа" относится к любой такой программе или произ-
ведению, а термин "произведение, основанное на Программе"
означает Программу или любое произведение, содержащее
Программу или ее часть, дословную, или модифицированную,
и/или переведенную на другой язык. (Здесь и далее перевод
включается без ограничений в понятие "модификация".)
Каждый обладатель лицензии адресуется как "вы". Виды дея-
тельности, не являющиеся копированием, распространением
или модификацией не охватываются этой Лицензией; они за
пределами ее влияния. Использование Программы по ее функ-
циональному назначению не ограничено, и выходные данные
Программы охватываются этой Лицензией, только если их со-
держание является произведением, основанным на Программе
(вне зависимости от того, были ли они получены в процессе
использования Программы). Являются ли они таковыми, зави-
сит от того, что именно делает Программа.
2. Вы можете копировать и распространять дословные копии ис-
ходного кода Программы по его получении на любом носите-
ле, при условии что вы соответствующим образом помещаете
на видном месте в каждой копии соответствующее уведомле-
ние об авторских правах и отказ от гарантий; оставляете
нетронутыми все уведомления, относящиеся к данной Лицен-
зии и к отсутствию каких-либо гарантий; и передаете всем
другим получателям Программы копию данной Лицензии вместе
с Программой. Вы можете назначить плату за физический акт
передачи копии и можете по своему усмотрению предостав-
лять гарантии за вознаграждение.
3. Вы можете изменять свою копию или копии Программы или
любой ее части, создавая таким образом произведение, ос-
нованное на Программе, и копировать и распространять эти
модификации или произведение в соответствии с Разделом 1,
приведенным выше, при условии, что вы выполните все ниже-
следующие условия:
1. Вы обязаны снабдить модифицированные файлы заметными
уведомлениями, содержащими указания на то, что вы
изменили файлы, и дату каждого изменения.
2. Вы обязаны предоставить всем третьим лицам лицензию
на бесплатное использование каждого произведения,
которое вы распространяете или публикуете, целиком,
и которое полностью или частично содержит Программу
или какую-либо ее часть, на условиях, оговоренных в
данной Лицензии.
3. Если модифицированная программа обычно читает коман-
ды в интерактивном режиме работы, вы должны сделать
так, чтобы при запуске для работы в таком интер-
активном режиме обычным для нее способом она печа-
тала или выводила на экран объявление, содержащее
соответствующее уведомление об авторских правах и
уведомление о том, что гарантий нет (или, наоборот,
сообщающее о том, что вы обеспечиваете гарантии), и
что пользователи могут повторно распространять про-
грамму при этих условиях, и указывающее пользовате-
лю, как просмотреть копию данной Лицензии.
(Исключение: если сама Программа работает в интер-
активном режиме, но обычно не выводит подобное
объявление, то ваше произведение, основанное на
Программе, не обязано выводить объявление.)
Эти требования применяются к модифицированному произве-
дению в целом. Если известные части этого произведения
не были основаны на Программе и могут обоснованно счи-
таться независимыми и самостоятельными произведениями,
то эта Лицензия и ее условия не распространяются на эти
части, если вы распространяете их как отдельные произве-
дения. Но если вы распространяете эти части как часть
целого произведения, основанного на Программе, то вы
обязаны делать это в соответствии с условиями данной Ли-
цензии, распространяя права получателей лицензии на все
произведение и, таким образом, на каждую часть, вне за-
висимости от того, кто ее написал. Таким образом, содер-
жание этого раздела не имеет цели претендовать на ваши
права на произведение, написанное полностью вами, или
оспаривать их; цель скорее в том, чтобы развить право
управлять распространением производных или коллективных
произведений, основанных на Программе. Кроме того, прос-
тое нахождение другого произведения, не основанного на
этой Программе, совместно с Программой (или с произведе-
нием, основанным на этой Программе) на том же носителе
для постоянного хранения или распространяемом носителе
не распространяет действие этой Лицензии на другое произ-
ведение.
4. Вы можете копировать и распространять Программу (или
произведение, основанное на ней) согласно Разделу 2) в
объектном коде или в выполнимом виде в соответствии с
Разделами 1 и 2, приведенными выше, при условии, что вы
также выполните одно из следующих требований:
1. Сопроводите ее полным соответствующим машиночитаемым
исходным кодом, который должен распространяться в
соответствии с Разделами 1 и 2, приведенными выше,
на носителе, обычно используемом для обмена ПО; или,
2. Сопроводите ее письменным предложением, действитель-
ным по крайней мере в течение трех лет, предоставить
любому третьему лицу за вознаграждение не большее
стоимости физического акта изготовления копии полную
машиночитаемую копию соответствующего исходного
кода, подлежащую распространению в соответствии с
Разделами 1 и 2, приведенными выше; или
3. Сопроводите ее информацией, полученной вами в ка-
честве предложения распространить соответствующий
исходный код. (Эта возможность допустима только для
некоммерческого распространения, и только если вы
получили программу в объектном коде или в выполнимом
виде с предложением в соответствии с Пунктом b)
выше.)
Исходный код для произведения означает его вид, пред-
почтительный для выполнения в нем модификаций. Для ис-
полняемого произведения полный исходный код означает все
исходные коды для всех модулей, которые он содержит, плюс
любые связанные с произведением файлы определения
интерфейса, плюс сценарии, используемые для управления
компиляцией и установкой исполняемого произведения.
Однако, в виде особого исключения распространяемый исход-
ный код не обязан включать то, что обычно предоставляется
с основными компонентами операционной системы, под
управлением которой работает исполняемое произведение, за
исключением случая, когда сам компонент сопровождает
исполняемое произведение. Если распространение исполня-
емого произведения или объектного кода происходит путем
предоставления доступа для копирования с обозначенного
места, то предоставление доступа для копирования исходно-
го кода с того же места считается распространением исход-
ного кода, даже если третьи лица не принуждаются к копи-
рованию исходного кода вместе с объектным кодом.
5. Вы не можете копировать, изменять, повторно лицензиро-
вать, или распространять Программу иначе, чем это явно
предусмотрено данной Лицензией. Любая попытка копировать,
изменять, повторно лицензировать, или распространять Про-
грамму каким-либо другим способом неправомерна и автома-
тически прекращает ваши права данные вам этой Лицензией.
Однако лицензии лиц, получивших от вас копии или права
согласно данной Универсальной Общественной Лицензии, не
прекратят своего действия до тех пор, пока эти лица пол-
ностью соблюдают условия.
6. Вы не обязаны соглашаться с этой Лицензией, так как вы
не подписывали ее. Однако тогда вы не получаете права
модифицировать или распространять Программу или основан-
ные на Программе произведения. Эти действия запрещены
законом, если вы не принимаете к соблюдению эту Лицензию.
А значит, изменяя или распространяя Программу (или
произведение, основанное на Программе), вы изъявляете
свое согласие с этой Лицензией и всеми ее условиями о
копировании, распространении или модификации Программы
или произведений, основанных на ней.
7. Каждый раз, когда вы повторно распространяете Программу
(или любое произведение, основанное на Программе), полу-
чатель этого произведения автоматически получает лицензию
от первоначального держателя лицензии на копирование,
распространение или модификацию Программы, обсуждаемую
в этих определениях и условиях. Вы не можете налагать
каких-либо дополнительных ограничений на осуществление
получателем прав, предоставленных данным документом. Вы
не несете ответственности за соблюдение третьими лицами
условий этой Лицензии.
8. Если в результате судебного разбирательства, или обвине-
ния в нарушении патента или по любой другой причине (не
обязательно связанной с патентами), вам навязаны условия,
противоречащие данной Лицензии (как по решению суда, так
и нет), то это не освобождает вас от соблюдения Лицензии.
Если вы не можете заниматься распространением так, чтобы
одновременно удовлетворить требованиям и этой Лицензии,
и всем другим требованиям, то вы не должны заниматься
распространением Программы.
Например, если патент не позволяет безвозмездное повтор-
ное распространение Программы всем, кто получил копии от
вас непосредственно или через посредников, то единствен-
ным способом удовлетворить и патенту, и этой Лицензии
будет ваш полный отказ от распространения Программы. Если
какая-либо часть этого раздела не имеет силы или не может
быть применена при любых конкретных обстоятельствах, то
подразумевается, что имеет силу остальная часть раздела,
и весь Раздел имеет силу при других обстоятельствах. Цель
этого раздела -- не побудить вас делать заявления о нару-
шениях прав на патент, или заявлять о других претензиях
на право собственности, или оспаривать правильность по-
добных претензий; единственная цель этого раздела -- за-
щита целостности системы распространения свободного ПО,
которая реализуется использованием общих лицензий. Многие
люди благодаря этой системе внесли щедрый вклад в широкий
спектр распространяемого ПО полагаясь на согласованное
применение этой системы; автору принадлежит право решать
хочет ли он или она распространять ПО в этой системе или
в какой-то другой, и получатель лицензии не может влиять
на принятие этого решения. Этот раздел предназначен для
того, чтобы тщательно прояснить, что полагается следстви-
ем из остальной части данной Лицензии.
9. Если распространение и/или применение Программы ограниче-
но в ряде стран либо патентами, либо авторскими правами
на интерфейсы, первоначальный обладатель авторских прав,
выпускающий Программу с этой Лицензией, может добавить
явное ограничение на географическое распространение,
исключив такие страны, так что распространение разреша-
ется только в тех странах, которые не были исключены. В
этом случае данная Лицензия включает в себя это ограниче-
ние, как если бы оно было написано в тексте данной Лицен-
зии.
10. Фонд Свободного ПО может время от времени публиковать
пересмотренные и/или новые версии Универсальной Общест-
венной Лицензии. Такие новые версии будут сходны по духу
с настоящей версией, но могут отличаться в деталях,
направленных на новые проблемы или обстоятельства. Каждой
версии придается отличительный номер версии. Если в Про-
грамме указан номер версии данной Лицензии, которая к ней
применима, и слова "любая последующая версия", вы можете
по выбору следовать определениям и условиям либо данной
версии, либо любой последующей версии, опубликованной
Фондом Свободного ПО. Если в Программе не указан номер
версии данной Лицензии, вы можете выбрать любую версию,
когда-либо опубликованную Фондом Свободного ПО.
11. Если вы хотите встроить части Программы в другие свобод-
ные программы с иными условиями распространения, напишите
автору с просьбой о разрешении. Для ПО, которое охраняет-
ся авторскими правами Фонда Свободного ПО, напишите в
Фонд Свободного ПО; мы иногда делаем исключения для
этого. Наше решение будет руководствоваться двумя целями:
сохранения свободного статуса всех производных нашего
свободного ПО и содействия совместному и повторному ис-
пользованию ПО вообще.
[Гарантия]
НИКАКИХ ГАРАНТИЙ
[Гарантия]
НИКАКИХ ГАРАНТИЙ
12. ПОСКОЛЬКУ ПРОГРАММА ПРЕДОСТАВЛЯЕТСЯ БЕСПЛАТНО, НА ПРО-
ГРАММУ НЕТ ГАРАНТИЙ В ТОЙ МЕРЕ, КАКАЯ ДОПУСТИМА ПРИМЕНИ-
МЫМ ЗАКОНОМ, ЗА ИСКЛЮЧЕНИЕМ ТЕХ СЛУЧАЕВ, КОГДА ПРОТИВНОЕ
ЗАЯВЛЕНО В ПИСЬМЕННОЙ ФОРМЕ.
ДЕРЖАТЕЛИ АВТОРСКИХ ПРАВ И/ИЛИ ДРУГИЕ СТОРОНЫ ПОСТАВЛЯЮТ
ПРОГРАММУ "КАК ОНА ЕСТЬ" БЕЗ КАКОГО-ЛИБО ВИДА ГАРАНТИЙ,
ВЫРАЖЕННЫХ ЯВНО ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ
ОГРАНИЧИВАЯСЬ ПОДРАЗУМЕВАЕМЫМИ ГАРАНТИЯМИ КОММЕРЧЕСКОЙ
ЦЕННОСТИ И ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ. ВЕСЬ РИСК В
ОТНОШЕНИИ КАЧЕСТВА И ПРОИЗВОДИТЕЛЬНОСТИ ПРОГРАММЫ
ОСТАЕТСЯ ПРИ ВАС. ЕСЛИ ПРОГРАММА ОКАЖЕТСЯ ДЕФЕКТИВНОЙ,
ВЫ ПРИНИМАЕТЕ НА СЕБЯ СТОИМОСТЬ ВСЕГО НЕОБХОДИМОГО
ОБСЛУЖИВАНИЯ, ВОССТАНОВЛЕНИЯ ИЛИ ИСПРАВЛЕНИЯ.
13. НИ В КОЕМ СЛУЧАЕ, ЕСЛИ НЕ ТРЕБУЕТСЯ ПОДХОДЯЩИМ ЗАКОНОМ
ИЛИ НЕ УСЛОВЛЕНО В ПИСЬМЕННОЙ ФОРМЕ, НИКАКОЙ ДЕРЖАТЕЛЬ
АВТОРСКИХ ПРАВ ИЛИ НИКАКОЕ ДРУГОЕ ЛИЦО, КОТОРОЕ МОЖЕТ
ИЗМЕНЯТЬ И/ИЛИ ПОВТОРНО РАСПРОСТРАНЯТЬ ПРОГРАММУ, КАК
БЫЛО РАЗРЕШЕНО ВЫШЕ, НЕ ОТВЕТСТВЕННЫ ПЕРЕД ВАМИ ЗА УБЫТ-
КИ, ВКЛЮЧАЯ ЛЮБЫЕ ОБЩИЕ, СПЕЦИАЛЬНЫЕ, СЛУЧАЙНЫЕ ИЛИ
ПОСЛЕДОВАВШИЕ УБЫТКИ, ПРОИСТЕКАЮЩИЕ ИЗ ИСПОЛЬЗОВАНИЯ ИЛИ
НЕВОЗМОЖНОСТИ ИСПОЛЬЗОВАНИЯ ПРОГРАММЫ (ВКЛЮЧАЯ, НО НЕ
ОГРАНИЧИВАЯСЬ ПОТЕРЕЙ ДАННЫХ, ИЛИ ДАННЫМИ, СТАВШИМИ
НЕПРАВИЛЬНЫМИ, ИЛИ ПОТЕРЯМИ, ПОНЕСЕННЫМИ ИЗ-ЗА ВАС ИЛИ
ТРЕТЬИХ ЛИЦ, ИЛИ ОТКАЗОМ ПРОГРАММЫ РАБОТАТЬ СОВМЕСТНО С
ЛЮБЫМИ ДРУГИМИ ПРОГРАММАМИ), ДАЖЕ ЕСЛИ ТАКОЙ ДЕРЖАТЕЛЬ ИЛИ
ДРУГОЕ ЛИЦО БЫЛИ ИЗВЕЩЕНЫ О ВОЗМОЖНОСТИ ТАКИХ УБЫТКОВ.
12. ПОСКОЛЬКУ ПРОГРАММА ПРЕДОСТАВЛЯЕТСЯ БЕСПЛАТНО, НА ПРО-
ГРАММУ НЕТ ГАРАНТИЙ В ТОЙ МЕРЕ, КАКАЯ ДОПУСТИМА ПРИМЕНИ-
МЫМ ЗАКОНОМ, ЗА ИСКЛЮЧЕНИЕМ ТЕХ СЛУЧАЕВ, КОГДА ПРОТИВНОЕ
ЗАЯВЛЕНО В ПИСЬМЕННОЙ ФОРМЕ.
ДЕРЖАТЕЛИ АВТОРСКИХ ПРАВ И/ИЛИ ДРУГИЕ СТОРОНЫ ПОСТАВЛЯЮТ
ПРОГРАММУ "КАК ОНА ЕСТЬ" БЕЗ КАКОГО-ЛИБО ВИДА ГАРАНТИЙ,
ВЫРАЖЕННЫХ ЯВНО ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ
ОГРАНИЧИВАЯСЬ ПОДРАЗУМЕВАЕМЫМИ ГАРАНТИЯМИ КОММЕРЧЕСКОЙ
ЦЕННОСТИ И ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ. ВЕСЬ РИСК В
ОТНОШЕНИИ КАЧЕСТВА И ПРОИЗВОДИТЕЛЬНОСТИ ПРОГРАММЫ
ОСТАЕТСЯ ПРИ ВАС. ЕСЛИ ПРОГРАММА ОКАЖЕТСЯ ДЕФЕКТИВНОЙ,
ВЫ ПРИНИМАЕТЕ НА СЕБЯ СТОИМОСТЬ ВСЕГО НЕОБХОДИМОГО
ОБСЛУЖИВАНИЯ, ВОССТАНОВЛЕНИЯ ИЛИ ИСПРАВЛЕНИЯ.
13. НИ В КОЕМ СЛУЧАЕ, ЕСЛИ НЕ ТРЕБУЕТСЯ ПОДХОДЯЩИМ ЗАКОНОМ
ИЛИ НЕ УСЛОВЛЕНО В ПИСЬМЕННОЙ ФОРМЕ, НИКАКОЙ ДЕРЖАТЕЛЬ
АВТОРСКИХ ПРАВ ИЛИ НИКАКОЕ ДРУГОЕ ЛИЦО, КОТОРОЕ МОЖЕТ
ИЗМЕНЯТЬ И/ИЛИ ПОВТОРНО РАСПРОСТРАНЯТЬ ПРОГРАММУ, КАК
БЫЛО РАЗРЕШЕНО ВЫШЕ, НЕ ОТВЕТСТВЕННЫ ПЕРЕД ВАМИ ЗА УБЫТ-
КИ, ВКЛЮЧАЯ ЛЮБЫЕ ОБЩИЕ, СПЕЦИАЛЬНЫЕ, СЛУЧАЙНЫЕ ИЛИ
ПОСЛЕДОВАВШИЕ УБЫТКИ, ПРОИСТЕКАЮЩИЕ ИЗ ИСПОЛЬЗОВАНИЯ ИЛИ
НЕВОЗМОЖНОСТИ ИСПОЛЬЗОВАНИЯ ПРОГРАММЫ (ВКЛЮЧАЯ, НО НЕ
ОГРАНИЧИВАЯСЬ ПОТЕРЕЙ ДАННЫХ, ИЛИ ДАННЫМИ, СТАВШИМИ
НЕПРАВИЛЬНЫМИ, ИЛИ ПОТЕРЯМИ, ПОНЕСЕННЫМИ ИЗ-ЗА ВАС ИЛИ
ТРЕТЬИХ ЛИЦ, ИЛИ ОТКАЗОМ ПРОГРАММЫ РАБОТАТЬ СОВМЕСТНО С
ЛЮБЫМИ ДРУГИМИ ПРОГРАММАМИ), ДАЖЕ ЕСЛИ ТАКОЙ ДЕРЖАТЕЛЬ ИЛИ
ДРУГОЕ ЛИЦО БЫЛИ ИЗВЕЩЕНЫ О ВОЗМОЖНОСТИ ТАКИХ УБЫТКОВ.
КОНЕЦ ОПРЕДЕЛЕНИЙ И УСЛОВИЙ
КОНЕЦ ОПРЕДЕЛЕНИЙ И УСЛОВИЙ
Как применять эти условия к вашим новым программам
Как применять эти условия к вашим новым программам
Если вы разрабатываете новую программу и хотите, чтобы она
принесла максимально возможную пользу обществу, лучший способ
достичь этого - включить ее в свободное ПО, которое каждый
может повторно распространять и изменять согласно данным
условиям.
Если вы разрабатываете новую программу и хотите, чтобы она
принесла максимально возможную пользу обществу, лучший способ
достичь этого - включить ее в свободное ПО, которое каждый
может повторно распространять и изменять согласно данным
условиям.
Чтобы сделать это, добавьте в программу следующие уведомле-
ния. Самое безопасное -- это добавить их в начало каждого
исходного файла, чтобы наиболее эффективно отобразить исклю-
чение гарантий; и каждый файл должен содержать по меньшей
мере строку, содержащую знак охраны авторского права и
указание на то, где находится полное уведомление.
Чтобы сделать это, добавьте в программу следующие уведомле-
ния. Самое безопасное -- это добавить их в начало каждого
исходного файла, чтобы наиболее эффективно отобразить исклю-
чение гарантий; и каждый файл должен содержать по меньшей
мере строку, содержащую знак охраны авторского права и
указание на то, где находится полное уведомление.
одна строка, содержащая название программы и краткое
описание того, что она делает.
(C) наименование (имя) автора 19гг
одна строка, содержащая название программы и краткое
описание того, что она делает.
(C) наименование (имя) автора 19гг
Это свободная программа; вы можете повторно распространять
ее и/или модифицировать ее в соответствии с Универсальной
Общественной Лицензией GNU, опубликованной Фондом Свободного
ПО; либо версии 2, либо (по вашему выбору) любой более
поздней версии.
Это свободная программа; вы можете повторно распространять
ее и/или модифицировать ее в соответствии с Универсальной
Общественной Лицензией GNU, опубликованной Фондом Свободного
ПО; либо версии 2, либо (по вашему выбору) любой более
поздней версии.
Эта программа распространяется в надежде, что она будет
полезной, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумевае-
мых гарантий КОММЕРЧЕСКОЙ ЦЕННОСТИ или ПРИГОДНОСТИ ДЛЯ
КОНКРЕТНОЙ ЦЕЛИ. Для получения подробных сведений смотрите
Универсальную Общественную Лицензию GNU.
Эта программа распространяется в надежде, что она будет
полезной, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумевае-
мых гарантий КОММЕРЧЕСКОЙ ЦЕННОСТИ или ПРИГОДНОСТИ ДЛЯ
КОНКРЕТНОЙ ЦЕЛИ. Для получения подробных сведений смотрите
Универсальную Общественную Лицензию GNU.
Вы должны были получить копию Универсальной Общественной
Лицензии GNU вместе с этой программой; если нет, напишите
по адресу: Free Software Foundation, Inc., 51 Franklin Street,
Вы должны были получить копию Универсальной Общественной
Лицензии GNU вместе с этой программой; если нет, напишите
по адресу: Free Software Foundation, Inc., 51 Franklin Street,
Fifth Floor, Boston, MA 02110-1301 USA
Добавьте также сведения о том, как связаться с вами по
электронной и обычной почте.
Добавьте также сведения о том, как связаться с вами по
электронной и обычной почте.
Если программа интерактивная, сделайте так, чтобы при запуске
в интерактивном режиме она выдавала краткое уведомление типа
следующего:
Если программа интерактивная, сделайте так, чтобы при запуске
в интерактивном режиме она выдавала краткое уведомление типа
следующего:
Gnomovision, версия 69, (C) имя автора 19гг
Gnomovision поставляется АБСОЛЮТНО БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ;
для получения подробностей напечатайте 'show w'. Это свобод-
ная программа, и вы приглашаетесь повторно распространять ее
при определенных условиях; для получения подробностей введите
Gnomovision, версия 69, (C) имя автора 19гг
Gnomovision поставляется АБСОЛЮТНО БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ;
для получения подробностей напечатайте 'show w'. Это свобод-
ная программа, и вы приглашаетесь повторно распространять ее
при определенных условиях; для получения подробностей введите
'show c'.
Гипотетические команды `show w' и `show c' должны показывать
соответствующие части Универсальной Общественной Лицензии.
Конечно, используемые вами команды могут называться как-ни-
будь иначе, нежели `show w' и `show c'; они даже могут выби-
раться с помощью мыши или быть пунктами меню -- все, что
подходит для вашей программы.
Гипотетические команды `show w' и `show c' должны показывать
соответствующие части Универсальной Общественной Лицензии.
Конечно, используемые вами команды могут называться как-ни-
будь иначе, нежели `show w' и `show c'; они даже могут выби-
раться с помощью мыши или быть пунктами меню -- все, что
подходит для вашей программы.
Вы также должны добиться того, чтобы ваш работодатель (если
вы работаете программистом) или ваше учебное заведение, если
таковое имеется, подписали в случае необходимости "отказ от
имущественных прав" на эту программу. Вот образец; замените
фамилии:
Вы также должны добиться того, чтобы ваш работодатель (если
вы работаете программистом) или ваше учебное заведение, если
таковое имеется, подписали в случае необходимости "отказ от
имущественных прав" на эту программу. Вот образец; замените
фамилии:
Компания ``Братья Ёёдины'' настоящим отказывается от всех
имущественных прав на программу 'Gnomovision' (которая делает
пассы в сторону компиляторов), написанную Абстрактным К.И.
Компания ``Братья Ёёдины'' настоящим отказывается от всех
имущественных прав на программу 'Gnomovision' (которая делает
пассы в сторону компиляторов), написанную Абстрактным К.И.
подпись Мага Ната, 1 апреля 1989 г
Маг Нат, Президент фирмы Вице.
подпись Мага Ната, 1 апреля 1989 г
Маг Нат, Президент фирмы Вице.
Данная Универсальная Общественная Лицензия не позволяет вам
включать вашу программу в программы, являющиеся частной соб-
ственностью. Если ваша программа -- это библиотека процедур,
вам стоит подумать, не будет ли лучше разрешить программам,
являющимся частной собственностью, связываться с вашей
библиотекой. Если это то, чего вы хотите, используйте вместо
этой Лицензии Универсальную Общественную Лицензию GNU для
библиотек.
Данная Универсальная Общественная Лицензия не позволяет вам
включать вашу программу в программы, являющиеся частной соб-
ственностью. Если ваша программа -- это библиотека процедур,
вам стоит подумать, не будет ли лучше разрешить программам,
являющимся частной собственностью, связываться с вашей
библиотекой. Если это то, чего вы хотите, используйте вместо
этой Лицензии Универсальную Общественную Лицензию GNU для
библиотек.
[QueryBox]
Диалоговые окна запросов
Диалоговые окна запросов
В окнах запросов для выбора какого-либо варианта ответа
(которые обычно задаются в виде экранных кнопок) Вы можете
использовать либо клавиши со стрелками, либо выбрать ответ
путем нажатия клавиши с выделенной в названии кнопки
буквой, либо щелкнув по нужной кнопке мышкой.
В окнах запросов для выбора какого-либо варианта ответа
(которые обычно задаются в виде экранных кнопок) Вы можете
использовать либо клавиши со стрелками, либо выбрать ответ
путем нажатия клавиши с выделенной в названии кнопки
буквой, либо щелкнув по нужной кнопке мышкой.
[How to use help]
Как пользоваться помощью
Как пользоваться помощью
При работе с программой Midnight Commander практически в
любой момент можно обратиться к интерактивной подсказке,
вызов которой осуществляется нажатием клавиши F1. Для
перемещения в окне просмотра подсказки Вы можете
использовать клавиши перемещения курсора (стрелки) или
мышь. Стрелка вниз вызывает переход к следующей ссылке
(выделены голубым фоном) или сдвиг текста на одну строку
вверх. Стрелка вверх вызывает переход к предыдущей ссылке
или сдвиг текста на одну строку вверх. Стрелка вправо
вызывает переход по ссылке, которая в данный момент
выделена синим фоном (текущая ссылка). По стрелке влево
происходит переход к ранее просмотренным разделам
подсказки.
При работе с программой Midnight Commander практически в
любой момент можно обратиться к интерактивной подсказке,
вызов которой осуществляется нажатием клавиши F1. Для
перемещения в окне просмотра подсказки Вы можете
использовать клавиши перемещения курсора (стрелки) или
мышь. Стрелка вниз вызывает переход к следующей ссылке
(выделены голубым фоном) или сдвиг текста на одну строку
вверх. Стрелка вверх вызывает переход к предыдущей ссылке
или сдвиг текста на одну строку вверх. Стрелка вправо
вызывает переход по ссылке, которая в данный момент
выделена синим фоном (текущая ссылка). По стрелке влево
происходит переход к ранее просмотренным разделам
подсказки.
Если Ваш терминал не поддерживает клавиши-стрелки, Вы
можете использовать клавишу пробела для перехода к
следующей странице подсказки и клавишу 'b' для перехода к
предыдущей странице. Клавиша TAB вызывает переход к
следующей ссылке, а нажатие ENTER - переход по текущей
ссылке. При просмотре подсказки программа запоминает
последовательность переходов по ссылкам и позволяет
вернуться к ранее просмотренным разделам, воспользовавшись
клавишей 'l' (last). Нажатие на ESC вызывает выход из окна
подсказки.
Если Ваш терминал не поддерживает клавиши-стрелки, Вы
можете использовать клавишу пробела для перехода к
следующей странице подсказки и клавишу 'b' для перехода к
предыдущей странице. Клавиша TAB вызывает переход к
следующей ссылке, а нажатие ENTER - переход по текущей
ссылке. При просмотре подсказки программа запоминает
последовательность переходов по ссылкам и позволяет
вернуться к ранее просмотренным разделам, воспользовавшись
клавишей 'l' (last). Нажатие на ESC вызывает выход из окна
подсказки.
По щелчку левой клавиши мыши происходит переход по ссылке
или перемещение по тексту подсказки. Щелчок правой кнопкой
мыши используется для переход к ранее просмотренным
разделам.
По щелчку левой клавиши мыши происходит переход по ссылке
или перемещение по тексту подсказки. Щелчок правой кнопкой
мыши используется для переход к ранее просмотренным
разделам.
Полный список управляющих комбинаций для окна просмотра
подсказки:
Полный список управляющих комбинаций для окна просмотра
подсказки:
Работают все клавиши управления перемещениемGeneral Movement Keys.
Работают все клавиши управления перемещениемGeneral Movement Keys.
tab Переход на следующую ссылку.
M-tab Переход на предыдущую ссылку.
down Переход на следующую ссылку или смещение
текста на одну строку вверх.
up Переход на следующую ссылку или смещение
текста на одну строку вниз.
right, enter Переход по текущей ссылке.
left, l Переход к ранее просмотренным разделам.
F1 Помощь по использованию самой подсказки.
n Переход к следующему разделу помощи.
p Переход к предыдущему разделу помощи.
c Переход к оглавлению подсказки.
F10, esc Выход из окна просмотра подсказки.
tab Переход на следующую ссылку.
M-tab Переход на предыдущую ссылку.
down Переход на следующую ссылку или смещение
текста на одну строку вверх.
up Переход на следующую ссылку или смещение
текста на одну строку вниз.
right, enter Переход по текущей ссылке.
left, l Переход к ранее просмотренным разделам.
F1 Помощь по использованию самой подсказки.
n Переход к следующему разделу помощи.
p Переход к предыдущему разделу помощи.
c Переход к оглавлению подсказки.
F10, esc Выход из окна просмотра подсказки.


File diff suppressed because it is too large Load Diff

View File

@ -6,25 +6,25 @@
x x lqk w w lqk tqk w w w w
x x x x tqu x x x x tqu x x
v x mqj v v mqj x v v v mqv
mqqqнаредник qqj 
mqqqнаредник qqj 
Ово је главни екран помоћи за ГНУ-овог поноћног наредника .
Ово је главни екран помоћи за ГНУ-овог поноћног наредника .
Да бисте сазнали више о томе како да користите интерактивни
систем помоћи потребно је да притиснете EnterHow to use help.
Можете и одмах отићи на садржајContents помоћи.
Да бисте сазнали више о томе како да користите интерактивни
систем помоћи потребно је да притиснете EnterHow to use help.
Можете и одмах отићи на садржајContents помоћи.
ГНУ-овог поноћног наредника су написали његови ауториAUTHORS.
ГНУ-овог поноћног наредника су написали његови ауториAUTHORS.
ГНУ-ов поноћни наредник се испоручује БЕЗ ИКАКВЕ ГАРАНЦИЈЕWarranty.
Ово је слободни софтвер, а ви сте позвани да га
расподелите под одредбама ГНУ-ове опште јавне лиценцеЛиценца (оригинал на енглеском).
Погледајте и незваничан превод ГНУ-ове ОЈЛ на српскиЛиценца (на српском).
ГНУ-ов поноћни наредник се испоручује БЕЗ ИКАКВЕ ГАРАНЦИЈЕWarranty.
Ово је слободни софтвер, а ви сте позвани да га
расподелите под одредбама ГНУ-ове опште јавне лиценцеЛиценца (оригинал на енглеском).
Погледајте и незваничан превод ГНУ-ове ОЈЛ на српскиЛиценца (на српском).
Превод Поноћног наредника и ове датотеке помоћи на српски:
Страхиња Радић, <mr99164@alas.matf.bg.ac.yu >
СРД `Уликс', http://uliks.sourceforge.net
[Лиценца (оригинал на енглеском)]
Превод Поноћног наредника и ове датотеке помоћи на српски:
Страхиња Радић, <mr99164@alas.matf.bg.ac.yu >
СРД `Уликс', http://uliks.sourceforge.net
[Лиценца (оригинал на енглеском)]
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
@ -435,499 +435,499 @@ to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU
Library General Public License instead of this License.
[Лиценца (на српском)]
[Лиценца (на српском)]
ГНУ-ОВА ОПШТА ЈАВНА ЛИЦЕНЦА
Верзија 2, јун 1991 (*)
ГНУ-ОВА ОПШТА ЈАВНА ЛИЦЕНЦА
Верзија 2, јун 1991 (*)
Ауторска права (C) 1989, 1991 Free Software Foundation,
Ауторска права (C) 1989, 1991 Free Software Foundation,
Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
USA.
Дозвољено је умножавање и расподела дословног примерка
текста ове лиценце, али није дозвољено њено мењање.
Дозвољено је умножавање и расподела дословног примерка
текста ове лиценце, али није дозвољено њено мењање.
Уговор
Уговор
За већину софтвера лиценце су начињене са циљем да вам
одузму слободу да га делите са другима и мењате. Насупрот
томе, ГНУ-ова општа јавна лиценца вам гарантује слободу
дељења и измене слободног софтвера да би осигурала слободу
софтвера за све његове кориснике. Ова Општа јавна лиценца
се односи на већину софтвера из Задужбине за слободни
софтвер и на сваки други програм, чији се аутори обавежу
на њено коришћење. (Други софтвер Задужбине за слободни
софтвер је уместо ове лиценце покривен ГНУ-овом
библиотечком општом јавном лиценцом (**).) И ви је можете
применити на ваше програме.
За већину софтвера лиценце су начињене са циљем да вам
одузму слободу да га делите са другима и мењате. Насупрот
томе, ГНУ-ова општа јавна лиценца вам гарантује слободу
дељења и измене слободног софтвера да би осигурала слободу
софтвера за све његове кориснике. Ова Општа јавна лиценца
се односи на већину софтвера из Задужбине за слободни
софтвер и на сваки други програм, чији се аутори обавежу
на њено коришћење. (Други софтвер Задужбине за слободни
софтвер је уместо ове лиценце покривен ГНУ-овом
библиотечком општом јавном лиценцом (**).) И ви је можете
применити на ваше програме.
Када говоримо о слободном софтверу, мислимо на слободу,
а не на цену. Наше опште јавне лиценце су замишљене да
осигурају вашу слободу расподеле примерака слободног
софтвера (и наплаћивања за ту услугу по жељи), примања
изворног кода или његовог добијања по жељи, могућности
измене софтвера или коришћења делова истог у новим
слободним програмима; и да вам дају до знања да то можете
да урадите.
Када говоримо о слободном софтверу, мислимо на слободу,
а не на цену. Наше опште јавне лиценце су замишљене да
осигурају вашу слободу расподеле примерака слободног
софтвера (и наплаћивања за ту услугу по жељи), примања
изворног кода или његовог добијања по жељи, могућности
измене софтвера или коришћења делова истог у новим
слободним програмима; и да вам дају до знања да то можете
да урадите.
Да бисмо заштитили ваша права, морамо да поставимо
ограничења која забрањују било коме да вам оспори ова
права или да тражи од вас да их се одрекнете. Ова
ограничења су и обавезујућа за вас ако расподељујете
примерке софтвера, или га измените.
Да бисмо заштитили ваша права, морамо да поставимо
ограничења која забрањују било коме да вам оспори ова
права или да тражи од вас да их се одрекнете. Ова
ограничења су и обавезујућа за вас ако расподељујете
примерке софтвера, или га измените.
На пример, ако расподељујете примерке таквог програма,
бесплатно или за одређену новчану надокнаду, морате дати и
примаоцима сва права која сами поседујете. Морате се
постарати да и они приме или могу да добију изворни код.
Најзад, морате им показати ове одредбе да би били упознати
са својим правима.
На пример, ако расподељујете примерке таквог програма,
бесплатно или за одређену новчану надокнаду, морате дати и
примаоцима сва права која сами поседујете. Морате се
постарати да и они приме или могу да добију изворни код.
Најзад, морате им показати ове одредбе да би били упознати
са својим правима.
Ми штитимо ваша права у два корака: (1) штитимо софтвер
заштитом ауторских права, и (2) нудимо вам ову лиценцу
која вам даје правну дозволу да умножавате, расподељујете
и/или мењате софтвер.
Ми штитимо ваша права у два корака: (1) штитимо софтвер
заштитом ауторских права, и (2) нудимо вам ову лиценцу
која вам даје правну дозволу да умножавате, расподељујете
и/или мењате софтвер.
Такође, ради заштите сваког аутора и нас хоћемо да се
осигурамо да свако разуме да не постоји гаранција за овај
слободни софтвер. Ако је софтвер неко други изменио и
проследио га, хоћемо да примаоци знају да оно што имају
није оригинал, тако да се било какви проблеми који су
настали због других, неће одразити на углед аутора
оригинала.
Такође, ради заштите сваког аутора и нас хоћемо да се
осигурамо да свако разуме да не постоји гаранција за овај
слободни софтвер. Ако је софтвер неко други изменио и
проследио га, хоћемо да примаоци знају да оно што имају
није оригинал, тако да се било какви проблеми који су
настали због других, неће одразити на углед аутора
оригинала.
Најзад, све слободне програме непрестано угрожавају
софтверски патенти. Ми хоћемо да избегнемо опасност да
расподељивачи слободног програма индивидуално добију
патентне лиценце и на тај начин ставе програм у приватно
власништво. Да бисмо спречили ово, јасно смо истакли да
сваки патент мора да буде лиценциран за свачију слободну
употребу или да уопште не буде лиценциран.
Најзад, све слободне програме непрестано угрожавају
софтверски патенти. Ми хоћемо да избегнемо опасност да
расподељивачи слободног програма индивидуално добију
патентне лиценце и на тај начин ставе програм у приватно
власништво. Да бисмо спречили ово, јасно смо истакли да
сваки патент мора да буде лиценциран за свачију слободну
употребу или да уопште не буде лиценциран.
Прецизне одредбе и услови умножавања, расподеле и измене
следе.
Прецизне одредбе и услови умножавања, расподеле и измене
следе.
ГНУ-ОВА ОПШТА ЈАВНА ЛИЦЕНЦА
ОДРЕДБЕ И УСЛОВИ УМНОЖАВАЊА, РАСПОДЕЛЕ И ИЗМЕНЕ
ГНУ-ОВА ОПШТА ЈАВНА ЛИЦЕНЦА
ОДРЕДБЕ И УСЛОВИ УМНОЖАВАЊА, РАСПОДЕЛЕ И ИЗМЕНЕ
0. Ова лиценца се односи на сваки програм или друго дело
које садржи саопштење власника ауторских права у ком стоји
да може бити расподељен под одредбама ове опште јавне
лиценце. ,,Програм`` ће надаље означавати сваки такав
програм или рад, а ,,дело засновано на Програму`` ће
означавати Програм или било који рад проистекао из њега по
Закону о ауторским правима; тј. дело које садржи Програм
или његов део, било дословни или са изменама и/или
преведен на други језик. (Одавде па надаље, превод је
укључен без ограничења у погледу израза ,,измена``.) Сваки
корисник лиценце је означен као ,,ви``.
0. Ова лиценца се односи на сваки програм или друго дело
које садржи саопштење власника ауторских права у ком стоји
да може бити расподељен под одредбама ове опште јавне
лиценце. ,,Програм`` ће надаље означавати сваки такав
програм или рад, а ,,дело засновано на Програму`` ће
означавати Програм или било који рад проистекао из њега по
Закону о ауторским правима; тј. дело које садржи Програм
или његов део, било дословни или са изменама и/или
преведен на други језик. (Одавде па надаље, превод је
укључен без ограничења у погледу израза ,,измена``.) Сваки
корисник лиценце је означен као ,,ви``.
Друге активности осим умножавања, расподеле и измене нису
обухваћене овом лиценцом; оне су изван њеног домена. Чин
покретања Програма није ограничен, а добијени резултат
извршавања Програма је обухваћен у случају да се његов
садржај састоји од дела заснованог на Програму (независно
од чињенице да је настао као резултат покретања Програма).
Ово непосредно зависи од тога шта Програм ради.
Друге активности осим умножавања, расподеле и измене нису
обухваћене овом лиценцом; оне су изван њеног домена. Чин
покретања Програма није ограничен, а добијени резултат
извршавања Програма је обухваћен у случају да се његов
садржај састоји од дела заснованог на Програму (независно
од чињенице да је настао као резултат покретања Програма).
Ово непосредно зависи од тога шта Програм ради.
1. Ви можете умножавати и расподелити дословне примерке
изворног кода Програма чим га примите, на било којем
медијуму, уз услов да на адекватан и одговарајући начин
означите на сваком примерку одговарајуће саопштење о
ауторским правима и објашњење гаранције; сачувате
недирнутим саопштења која се позивају на ову лиценцу и
одсуство било какве гаранције; и свим другим примаоцима
Програма дате примерак ове лиценце заједно са Програмом.
1. Ви можете умножавати и расподелити дословне примерке
изворног кода Програма чим га примите, на било којем
медијуму, уз услов да на адекватан и одговарајући начин
означите на сваком примерку одговарајуће саопштење о
ауторским правима и објашњење гаранције; сачувате
недирнутим саопштења која се позивају на ову лиценцу и
одсуство било какве гаранције; и свим другим примаоцима
Програма дате примерак ове лиценце заједно са Програмом.
Ви можете наплаћивати новчану надокнаду за чин физичког
преноса примерка, и по вашем избору можете понудити
заштиту гаранцијом у замену за новчану надокнаду.
Ви можете наплаћивати новчану надокнаду за чин физичког
преноса примерка, и по вашем избору можете понудити
заштиту гаранцијом у замену за новчану надокнаду.
2. Ви можете изменити ваш примерак или примерке Програма
или било ког његовог дела, образујући дело засновано на
Програму, и умножавати и расподелити такве измене или дела
под горњим одредбама члана 1, уз услов да сами такође
испуните сваки од следећих услова:
2. Ви можете изменити ваш примерак или примерке Програма
или било ког његовог дела, образујући дело засновано на
Програму, и умножавати и расподелити такве измене или дела
под горњим одредбама члана 1, уз услов да сами такође
испуните сваки од следећих услова:
а) морате осигурати да измењене датотеке носе уочљива
обавештења да сте ви изменили датотеке као и датум
било какве измене;
а) морате осигурати да измењене датотеке носе уочљива
обавештења да сте ви изменили датотеке као и датум
било какве измене;
б) морате осигурати да свако дело које расподељујете
или издајете, а које у целини или делом садржи или је
изведено из Програма или било ког његовог дела, буде
лиценцирано у целини без новчане надокнаде свим трећим
лицима под одредбама ове лиценце;
б) морате осигурати да свако дело које расподељујете
или издајете, а које у целини или делом садржи или је
изведено из Програма или било ког његовог дела, буде
лиценцирано у целини без новчане надокнаде свим трећим
лицима под одредбама ове лиценце;
в) ако измењени програм чита команде интерактивно када
је покренут, ви морате осигурати да, када је покренут
у циљу такве интерактивне употребе на уобичајен начин,
испише или прикаже објаву која укључује одговарајуће
саопштење о ауторским правима и саопштење да не
постоји гаранција (или да ви дајете гаранцију) да
корисници могу расподелити програм под овим условима,
и објашњење кориснику како да прикаже примерак ове
лиценце. (Изузетак: ако је Програм интерактиван али
обично не исписује такву објаву, ваше дело засновано
на Програму не мора да испише објаву.)
в) ако измењени програм чита команде интерактивно када
је покренут, ви морате осигурати да, када је покренут
у циљу такве интерактивне употребе на уобичајен начин,
испише или прикаже објаву која укључује одговарајуће
саопштење о ауторским правима и саопштење да не
постоји гаранција (или да ви дајете гаранцију) да
корисници могу расподелити програм под овим условима,
и објашњење кориснику како да прикаже примерак ове
лиценце. (Изузетак: ако је Програм интерактиван али
обично не исписује такву објаву, ваше дело засновано
на Програму не мора да испише објаву.)
Ови захтеви се односе на измењено дело као целину. Ако
уочљиви делови таквог дела нису изведени из Програма, па
се могу разумно схватити као независна и одвојена дела за
себе, онда се ова лиценца и њене одредбе не односе на те
делове када их расподељујете као одвојена дела. Али када
расподељујете исте делове као део целине која је дело
засновано на Програму, расподела целине мора бити под
одредбама ове лиценце, чије дозволе за друге њене носиоце
се проширују на целину, а самим тим на сваки део без
обзира ко га је написао.
Ови захтеви се односе на измењено дело као целину. Ако
уочљиви делови таквог дела нису изведени из Програма, па
се могу разумно схватити као независна и одвојена дела за
себе, онда се ова лиценца и њене одредбе не односе на те
делове када их расподељујете као одвојена дела. Али када
расподељујете исте делове као део целине која је дело
засновано на Програму, расподела целине мора бити под
одредбама ове лиценце, чије дозволе за друге њене носиоце
се проширују на целину, а самим тим на сваки део без
обзира ко га је написао.
Намера овог члана није да тражи права или оспори ваша
права на дело које сте у целини написали; намера је
првенствено да се успостави право на контролу расподеле
изведених или колективних дела заснованих на Програму.
Намера овог члана није да тражи права или оспори ваша
права на дело које сте у целини написали; намера је
првенствено да се успостави право на контролу расподеле
изведених или колективних дела заснованих на Програму.
Само прикључивање Програму (или делу заснованом на
Програму) другог дела које на њему није засновано на
јединици за складиштење или медијуму за расподелу не
доводи друго дело под оквир ове лиценце.
Само прикључивање Програму (или делу заснованом на
Програму) другог дела које на њему није засновано на
јединици за складиштење или медијуму за расподелу не
доводи друго дело под оквир ове лиценце.
3. Можете умножавати и расподелити Програм (или дело
засновано на њему, по члану 2) у објектном коду или
извршном облику под горњим одредбама чланова 1 и 2 уз
услов да урадите једну од следећих ствари:
3. Можете умножавати и расподелити Програм (или дело
засновано на њему, по члану 2) у објектном коду или
извршном облику под горњим одредбама чланова 1 и 2 уз
услов да урадите једну од следећих ствари:
а) да приложите уз њега потпуни одговарајући машински
читљив изворни код, који мора бити расподељен према
горњим одредбама чланова 1 и 2 на медијуму уобичајеном
за размену софтвера; или,
а) да приложите уз њега потпуни одговарајући машински
читљив изворни код, који мора бити расподељен према
горњим одредбама чланова 1 и 2 на медијуму уобичајеном
за размену софтвера; или,
б) да приложите уз њега писмену понуду, важећу бар три
године, о достављању било којој трећој страни, уз
новчану надокнаду не већу од цене потребне да обавите
физичку расподелу извора, потпуног машински читљивог
примерка одговарајућег изворног кода, за расподелу
према горњим одредбама чланова 1 и 2 на медијуму
уобичајеном за размену софтвера; или,
б) да приложите уз њега писмену понуду, важећу бар три
године, о достављању било којој трећој страни, уз
новчану надокнаду не већу од цене потребне да обавите
физичку расподелу извора, потпуног машински читљивог
примерка одговарајућег изворног кода, за расподелу
према горњим одредбама чланова 1 и 2 на медијуму
уобичајеном за размену софтвера; или,
в) да приложите уз њега информацију коју сте добили
као понуду о расподели одговарајућег изворног кода.
(Ова могућност је дозвољена само за некомерцијалну
расподелу и само ако сте добили програм у објектном
коду или извршном виду уз такву понуду, према горњој
тачки б.)
в) да приложите уз њега информацију коју сте добили
као понуду о расподели одговарајућег изворног кода.
(Ова могућност је дозвољена само за некомерцијалну
расподелу и само ако сте добили програм у објектном
коду или извршном виду уз такву понуду, према горњој
тачки б.)
Изворни код дела подразумева облик дела најпогоднији за
прављење измена на њему. За дело у извршном облику,
потпуни изворни код подразумева сав изворни код за све
модуле које оно садржи, са додатком свих датотека који
дефинишу интеракцију и списа за контролу превођења и
инсталирања извршне верзије. Међутим, као посебан
изузетак, расподељени изворни код не мора да укључи све
што се обично расподељује (било у изворном или извршном
облику) са главним компонентама (преводиоцем, језгром, и
тако даље) оперативног система на ком се покреће извршна
датотека, осим уколико се сама та компонента не испоручује
са извршном датотеком.
Изворни код дела подразумева облик дела најпогоднији за
прављење измена на њему. За дело у извршном облику,
потпуни изворни код подразумева сав изворни код за све
модуле које оно садржи, са додатком свих датотека који
дефинишу интеракцију и списа за контролу превођења и
инсталирања извршне верзије. Међутим, као посебан
изузетак, расподељени изворни код не мора да укључи све
што се обично расподељује (било у изворном или извршном
облику) са главним компонентама (преводиоцем, језгром, и
тако даље) оперативног система на ком се покреће извршна
датотека, осим уколико се сама та компонента не испоручује
са извршном датотеком.
Ако се расподела извршног или објектног кода врши понудом
приступа примерку са одређеног места, онда се понуда
истоветног изворног кода са истог места рачуна као
расподела изворног кода, чак и у случају када се од треће
стране не захтева да умножава изворни код заједно са
објектним кодом.
Ако се расподела извршног или објектног кода врши понудом
приступа примерку са одређеног места, онда се понуда
истоветног изворног кода са истог места рачуна као
расподела изворног кода, чак и у случају када се од треће
стране не захтева да умножава изворни код заједно са
објектним кодом.
4. Програм се не сме умножавати, мењати, подлиценцирати
или расподелити другачије него што је изричито истакнуто
овом лиценцом. Сваки другачији покушај умножавања, мењања,
подлиценцирања или расподеле програма није пуноважан и
аутоматски обуставља ваша права под овом лиценцом.
Међутим, странама које су од вас примиле примерак или
права под овом лиценцом неће се обуставити њихове лиценце
све док се оне потпуно придржавају њених одредби.
4. Програм се не сме умножавати, мењати, подлиценцирати
или расподелити другачије него што је изричито истакнуто
овом лиценцом. Сваки другачији покушај умножавања, мењања,
подлиценцирања или расподеле програма није пуноважан и
аутоматски обуставља ваша права под овом лиценцом.
Међутим, странама које су од вас примиле примерак или
права под овом лиценцом неће се обуставити њихове лиценце
све док се оне потпуно придржавају њених одредби.
5. Од вас се не тражи да прихватите ову лиценцу, пошто
је нисте потписали. Међутим, ништа друго вам не дозвољава
да мењате или расподељујете Програм или изведена дела.
Такве радње су забрањене законом уколико не прихватите ову
лиценцу. Тако, изменом или расподелом Програма (или дела
заснованог на Програму), прихватате да то урадите под овом
лиценцом и под свим њеним одредбама и условима за
умножавање, расподелу или измену Програма или дела
заснованих на њему.
5. Од вас се не тражи да прихватите ову лиценцу, пошто
је нисте потписали. Међутим, ништа друго вам не дозвољава
да мењате или расподељујете Програм или изведена дела.
Такве радње су забрањене законом уколико не прихватите ову
лиценцу. Тако, изменом или расподелом Програма (или дела
заснованог на Програму), прихватате да то урадите под овом
лиценцом и под свим њеним одредбама и условима за
умножавање, расподелу или измену Програма или дела
заснованих на њему.
6. Сваки пут када расподељујете Програм (или било које
дело засновано на Програму), прималац ће аутоматски
примити лиценцу од првобитног носиоца за умножавање,
расподелу или измену Програма према овим одредбама и
условима. Ви не можете даље ограничити примаочево
коришћење овде датих права, као што ви нисте ни одговорни
ако трећа страна наметне усклађивање са одредбама ове
лиценце.
6. Сваки пут када расподељујете Програм (или било које
дело засновано на Програму), прималац ће аутоматски
примити лиценцу од првобитног носиоца за умножавање,
расподелу или измену Програма према овим одредбама и
условима. Ви не можете даље ограничити примаочево
коришћење овде датих права, као што ви нисте ни одговорни
ако трећа страна наметне усклађивање са одредбама ове
лиценце.
7. Ако су вам, као последица судске пресуде или под
изговором кршења патента или било каквог другог разлога
(не ограничавајући се искључиво на питања патената),
наметнути услови (било судским налогом, поравнањем или
другачије) који су у супротности са условима ове лиценце,
они вас не изузимају од услова ове лиценце. Ако је
расподела или било која друга ваша применљива обавеза у
супротности са овом лиценцом, онда као последицу тога не
можете уопште расподелити Програм. На пример, ако патентна
лиценца не дозвољава бесплатну расподелу Програма од
стране свих прималаца примерка или индиректно преко вас,
онда је једини начин да се задовољи и ова лиценца да се у
потпуности одрекнете расподеле Програма.
7. Ако су вам, као последица судске пресуде или под
изговором кршења патента или било каквог другог разлога
(не ограничавајући се искључиво на питања патената),
наметнути услови (било судским налогом, поравнањем или
другачије) који су у супротности са условима ове лиценце,
они вас не изузимају од услова ове лиценце. Ако је
расподела или било која друга ваша применљива обавеза у
супротности са овом лиценцом, онда као последицу тога не
можете уопште расподелити Програм. На пример, ако патентна
лиценца не дозвољава бесплатну расподелу Програма од
стране свих прималаца примерка или индиректно преко вас,
онда је једини начин да се задовољи и ова лиценца да се у
потпуности одрекнете расподеле Програма.
Ако се било који део овог члана означи као неодговарајући
или неприменљив под било којом одређеном околношћу,
примењује се остатак члана а члан као целина се примењује
под другим околностима.
Ако се било који део овог члана означи као неодговарајући
или неприменљив под било којом одређеном околношћу,
примењује се остатак члана а члан као целина се примењује
под другим околностима.
Циљ овог члана није да вас наведе да прекршите било које
патенте или друга права на својину нити да оспори
валидност таквих права; овај члан има за свој једини циљ
заштиту интегритета система расподеле слободног софтвера,
који је имплементиран применом јавних лиценци. Многи људи
су дали свој несебични допринос у широком спектру софтвера
расподељеног кроз овај систем, ослањајући се на његову
доследну примену; на аутору/донатору је да одлучи да ли је
вољан/вољна да расподељује софтвер кроз било који систем,
а лиценца не може наметнути тај избор.
Циљ овог члана није да вас наведе да прекршите било које
патенте или друга права на својину нити да оспори
валидност таквих права; овај члан има за свој једини циљ
заштиту интегритета система расподеле слободног софтвера,
који је имплементиран применом јавних лиценци. Многи људи
су дали свој несебични допринос у широком спектру софтвера
расподељеног кроз овај систем, ослањајући се на његову
доследну примену; на аутору/донатору је да одлучи да ли је
вољан/вољна да расподељује софтвер кроз било који систем,
а лиценца не може наметнути тај избор.
Овај члан треба да детаљно разјасни оно што може бити
последица остатка ове лиценце.
Овај члан треба да детаљно разјасни оно што може бити
последица остатка ове лиценце.
8. Ако су расподела и/или коришћење Програма забрањени у
одређеним земљама, било патентима или ауторским правима,
првобитни носилац ауторских права који стави Програм под
ову лиценцу може да приложи експлицитно географско
ограничење расподеле, које искључује такве земље; тако да
је расподела дозвољена само у земљи или земљама које нису
искључене на такав начин. У том случају, ова лиценца
укључује ограничење као да је део њеног текста.
8. Ако су расподела и/или коришћење Програма забрањени у
одређеним земљама, било патентима или ауторским правима,
првобитни носилац ауторских права који стави Програм под
ову лиценцу може да приложи експлицитно географско
ограничење расподеле, које искључује такве земље; тако да
је расподела дозвољена само у земљи или земљама које нису
искључене на такав начин. У том случају, ова лиценца
укључује ограничење као да је део њеног текста.
9. Задужбина за слободни софтвер може повремено објавити
ревидиране и/или нове верзије Опште јавне лиценце. Такве
ревизије ће бити сличне по духу садашњој верзији, али се
могу разликовати у детаљима у циљу разрешења нових
проблема или питања.
9. Задужбина за слободни софтвер може повремено објавити
ревидиране и/или нове верзије Опште јавне лиценце. Такве
ревизије ће бити сличне по духу садашњој верзији, али се
могу разликовати у детаљима у циљу разрешења нових
проблема или питања.
Свака верзија ће добити различит број. Ако Програм истиче
број верзије Лиценце која се примењује на њега и текст ,,и
било која следећа верзија``, можете примењивати одредбе и
услове те или било које следеће верзије коју објави
Задужбина за слободни софтвер. Ако Програм не истиче број
верзије ове лиценце, можете изабрати било коју верзију
коју је објавила Задужбина за слободни софтвер.
Свака верзија ће добити различит број. Ако Програм истиче
број верзије Лиценце која се примењује на њега и текст ,,и
било која следећа верзија``, можете примењивати одредбе и
услове те или било које следеће верзије коју објави
Задужбина за слободни софтвер. Ако Програм не истиче број
верзије ове лиценце, можете изабрати било коју верзију
коју је објавила Задужбина за слободни софтвер.
10. Ако желите да употребите делове Програма у другим
слободним програмима чији су услови расподеле другачији,
пишите аутору и замолите га за дозволу. За софтвер над
којим ауторска права има Задужбина за слободни софтвер,
пишите Задужбини за слободни софтвер; ми понекад начинимо
изузетке за овакве ствари. Наша одлука ће бити мотивисана
са два циља: чувања слободног статуса свега што је
изведено из нашег слободног софтвера и промовисања дељења
и поновне употребе софтвера уопште.
10. Ако желите да употребите делове Програма у другим
слободним програмима чији су услови расподеле другачији,
пишите аутору и замолите га за дозволу. За софтвер над
којим ауторска права има Задужбина за слободни софтвер,
пишите Задужбини за слободни софтвер; ми понекад начинимо
изузетке за овакве ствари. Наша одлука ће бити мотивисана
са два циља: чувања слободног статуса свега што је
изведено из нашег слободног софтвера и промовисања дељења
и поновне употребе софтвера уопште.
ОДСУСТВО ГАРАНЦИЈЕ
ОДСУСТВО ГАРАНЦИЈЕ
11. УСЛЕД ЛИЦЕНЦИРАЊА ОВОГ ПРОГРАМА БЕЗ НОВЧАНЕ
НАДОКНАДЕ, НЕ ПОСТОЈИ ГАРАНЦИЈА ЗА ПРОГРАМ У ОКВИРУ
ПОСТОЈЕЋИХ ЗАКОНА. АКО НИЈЕ ДРУГАЧИЈЕ НАПИСАНО, НОСИОЦИ
АУТОРСКИХ ПРАВА И/ИЛИ ДРУГА ЛИЦА НУДЕ ПРОГРАМ ,,ТАКАВ
КАКАВ ЈЕ`` БЕЗ БИЛО КАКВЕ ГАРАНЦИЈЕ, БИЛО ЕКСПЛИЦИТНЕ ИЛИ
ИМПЛИЦИТНЕ, УКЉУЧУЈУЋИ АЛИ СЕ НЕ ОГРАНИЧАВАЈУЋИ НА
ИМПЛИЦИТНЕ ГАРАНЦИЈЕ КОМЕРЦИЈАЛНЕ ВРЕДНОСТИ ИЛИ ИСПУЊАВАЊА
ОДРЕЂЕНЕ ПОТРЕБЕ. ЦЕЛОКУПАН РИЗИК КВАЛИТЕТА И ПЕРФОРМАНСИ
ЈЕ НА ВАМА. У СЛУЧАЈУ ДА СЕ ИСПОСТАВИ ДА ЈЕ ПРОГРАМ
ДЕФЕКТАН, ВИ СНОСИТЕ ТРОШКОВЕ ПОТРЕБНОГ СЕРВИСИРАЊА ИЛИ
ПОПРАВКЕ.
11. УСЛЕД ЛИЦЕНЦИРАЊА ОВОГ ПРОГРАМА БЕЗ НОВЧАНЕ
НАДОКНАДЕ, НЕ ПОСТОЈИ ГАРАНЦИЈА ЗА ПРОГРАМ У ОКВИРУ
ПОСТОЈЕЋИХ ЗАКОНА. АКО НИЈЕ ДРУГАЧИЈЕ НАПИСАНО, НОСИОЦИ
АУТОРСКИХ ПРАВА И/ИЛИ ДРУГА ЛИЦА НУДЕ ПРОГРАМ ,,ТАКАВ
КАКАВ ЈЕ`` БЕЗ БИЛО КАКВЕ ГАРАНЦИЈЕ, БИЛО ЕКСПЛИЦИТНЕ ИЛИ
ИМПЛИЦИТНЕ, УКЉУЧУЈУЋИ АЛИ СЕ НЕ ОГРАНИЧАВАЈУЋИ НА
ИМПЛИЦИТНЕ ГАРАНЦИЈЕ КОМЕРЦИЈАЛНЕ ВРЕДНОСТИ ИЛИ ИСПУЊАВАЊА
ОДРЕЂЕНЕ ПОТРЕБЕ. ЦЕЛОКУПАН РИЗИК КВАЛИТЕТА И ПЕРФОРМАНСИ
ЈЕ НА ВАМА. У СЛУЧАЈУ ДА СЕ ИСПОСТАВИ ДА ЈЕ ПРОГРАМ
ДЕФЕКТАН, ВИ СНОСИТЕ ТРОШКОВЕ ПОТРЕБНОГ СЕРВИСИРАЊА ИЛИ
ПОПРАВКЕ.
12. НИ У КАКВИМ ОКОЛНОСТИМА, ИЗУЗЕВ АКО ТО ЗАХТЕВА
ПОСТОЈЕЋИ ЗАКОН ИЛИ ПИСМЕНИ ДОГОВОР, НОСИЛАЦ АУТОРСКИХ
ПРАВА ИЛИ БИЛО КОЈЕ ДРУГО ЛИЦЕ КОЈЕ МОЖЕ ИЗМЕНИТИ И/ИЛИ
РАСПОДЕЛИТИ ПРОГРАМ УЗ ПОШТОВАЊЕ ПРЕТХОДНЕ ДОЗВОЛЕ, НЕЋЕ
ВАМ БИТИ ОДГОВОРНИ ЗА ШТЕТЕ, КОЈЕ ОБУХВАТАЈУ СВЕ ОПШТЕ,
ПОСЕБНЕ, СЛУЧАЈНЕ ИЛИ НАМЕРНЕ ШТЕТЕ ПРОУЗРОКОВАНЕ
УПОТРЕБОМ ИЛИ НЕМОГУЋНОШЋУ УПОТРЕБЕ ПРОГРАМА (УКЉУЧУЈУЋИ
АЛИ СЕ НЕ ОГРАНИЧАВАЈУЋИ НА ГУБИТАК ПОДАТАКА ИЛИ ПОГРЕШАН
ПРИКАЗ ПОДАТАКА ИЛИ ГУБИТКЕ КОЈЕ СТЕ ИЗАЗВАЛИ ВИ ИЛИ ТРЕЋА
ЛИЦА ИЛИ НЕМОГУЋНОСТ ПРОГРАМА ДА ФУНКЦИОНИШЕ СА БИЛО КОЈИМ
ДРУГИМ ПРОГРАМИМА), ЧАК И АКО СУ ТАЈ НОСИЛАЦ ИЛИ ДРУГА
ЛИЦА БИЛИ УПОЗНАТИ СА МОГУЋНОШЋУ ТАКВИХ ШТЕТА.
12. НИ У КАКВИМ ОКОЛНОСТИМА, ИЗУЗЕВ АКО ТО ЗАХТЕВА
ПОСТОЈЕЋИ ЗАКОН ИЛИ ПИСМЕНИ ДОГОВОР, НОСИЛАЦ АУТОРСКИХ
ПРАВА ИЛИ БИЛО КОЈЕ ДРУГО ЛИЦЕ КОЈЕ МОЖЕ ИЗМЕНИТИ И/ИЛИ
РАСПОДЕЛИТИ ПРОГРАМ УЗ ПОШТОВАЊЕ ПРЕТХОДНЕ ДОЗВОЛЕ, НЕЋЕ
ВАМ БИТИ ОДГОВОРНИ ЗА ШТЕТЕ, КОЈЕ ОБУХВАТАЈУ СВЕ ОПШТЕ,
ПОСЕБНЕ, СЛУЧАЈНЕ ИЛИ НАМЕРНЕ ШТЕТЕ ПРОУЗРОКОВАНЕ
УПОТРЕБОМ ИЛИ НЕМОГУЋНОШЋУ УПОТРЕБЕ ПРОГРАМА (УКЉУЧУЈУЋИ
АЛИ СЕ НЕ ОГРАНИЧАВАЈУЋИ НА ГУБИТАК ПОДАТАКА ИЛИ ПОГРЕШАН
ПРИКАЗ ПОДАТАКА ИЛИ ГУБИТКЕ КОЈЕ СТЕ ИЗАЗВАЛИ ВИ ИЛИ ТРЕЋА
ЛИЦА ИЛИ НЕМОГУЋНОСТ ПРОГРАМА ДА ФУНКЦИОНИШЕ СА БИЛО КОЈИМ
ДРУГИМ ПРОГРАМИМА), ЧАК И АКО СУ ТАЈ НОСИЛАЦ ИЛИ ДРУГА
ЛИЦА БИЛИ УПОЗНАТИ СА МОГУЋНОШЋУ ТАКВИХ ШТЕТА.
КРАЈ ОДРЕДБИ И УСЛОВА
КРАЈ ОДРЕДБИ И УСЛОВА
Како да примените ове одредбе на ваше нове програме
Како да примените ове одредбе на ваше нове програме
Ако развијете нови програм и желите да буде што
кориснији јавности, најбољи начин да то постигнете је да
га означите као слободни софтвер који свако може
расподелити и мењати под овим одредбама.
Ако развијете нови програм и желите да буде што
кориснији јавности, најбољи начин да то постигнете је да
га означите као слободни софтвер који свако може
расподелити и мењати под овим одредбама.
Да бисте то урадили, додајте следећа обавештења вашем
програму. Најсигурније је да их додате на почетак сваке
изворне датотеке, да бисте најефикасније саопштили
одсуство гаранције; свака датотека требало би да садржи
најмање линију са ауторским правима и информацију где се
може пронаћи пуно обавештење.
Да бисте то урадили, додајте следећа обавештења вашем
програму. Најсигурније је да их додате на почетак сваке
изворне датотеке, да бисте најефикасније саопштили
одсуство гаранције; свака датотека требало би да садржи
најмање линију са ауторским правима и информацију где се
може пронаћи пуно обавештење.
<у једној линији наведите назив програма и кратак опис
онога шта ради.>
Ауторска права (C) <гггг> <име аутора>
<у једној линији наведите назив програма и кратак опис
онога шта ради.>
Ауторска права (C) <гггг> <име аутора>
Овај програм је слободни софтвер; можете га
расподелити и/или мењати под одредбама ГНУ-ове опште
јавне лиценце коју је објавила Задужбина за слободни
софтвер; и то, било верзије 2 Лиценце, или (по вашем
избору) било које следеће верзије.
Овај програм је слободни софтвер; можете га
расподелити и/или мењати под одредбама ГНУ-ове опште
јавне лиценце коју је објавила Задужбина за слободни
софтвер; и то, било верзије 2 Лиценце, или (по вашем
избору) било које следеће верзије.
Овај програм се расподељује у намери да буде користан,
али БЕЗ ИКАКВЕ ГАРАНЦИЈЕ; чак и без имплицитне
гаранције КОМЕРЦИЈАЛНЕ ВРЕДНОСТИ или ИСПУЊАВАЊА
ОДРЕЂЕНЕ ПОТРЕБЕ. Погледајте ГНУ-ову општу јавну
лиценцу за више детаља.
Овај програм се расподељује у намери да буде користан,
али БЕЗ ИКАКВЕ ГАРАНЦИЈЕ; чак и без имплицитне
гаранције КОМЕРЦИЈАЛНЕ ВРЕДНОСТИ или ИСПУЊАВАЊА
ОДРЕЂЕНЕ ПОТРЕБЕ. Погледајте ГНУ-ову општу јавну
лиценцу за више детаља.
Требало би да примите примерак ГНУ-ове опште јавне
лиценце заједно са овим програмом; ако то није случај,
пишите Задужбини за слободни софтвер на адресу: Free
Требало би да примите примерак ГНУ-ове опште јавне
лиценце заједно са овим програмом; ако то није случај,
пишите Задужбини за слободни софтвер на адресу: Free
Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301 USA.
Такође додајте обавештење како вам се може јавити преко
електронске и обичне поште.
Такође додајте обавештење како вам се може јавити преко
електронске и обичне поште.
Ако је програм интерактиван, треба да исписује кратко
саопштење слично овом при покретању у интерактивном
режиму:
Ако је програм интерактиван, треба да исписује кратко
саопштење слично овом при покретању у интерактивном
режиму:
Гномовизија верзија 69, Ауторска права (C) година име
аутора Гномовизија се испоручује БЕЗ ИКАКВЕ ГАРАНЦИЈЕ;
за детаље откуцајте `прикажи г'. Ово је слободни
софтвер, а ви сте позвани да га расподелите под
извесним условима; откуцајте `прикажи у' за детаље.
Гномовизија верзија 69, Ауторска права (C) година име
аутора Гномовизија се испоручује БЕЗ ИКАКВЕ ГАРАНЦИЈЕ;
за детаље откуцајте `прикажи г'. Ово је слободни
софтвер, а ви сте позвани да га расподелите под
извесним условима; откуцајте `прикажи у' за детаље.
Хипотетичке команде `прикажи г' и `прикажи у' би требало
да прикажу одговарајуће делове Опште јавне лиценце.
Наравно, команде које ви користите могу се разликовати од
`прикажи г' и `прикажи у'; то чак могу бити и кликови
мишем или ставке менија или нешто што највише одговара
вашем програму.
Хипотетичке команде `прикажи г' и `прикажи у' би требало
да прикажу одговарајуће делове Опште јавне лиценце.
Наравно, команде које ви користите могу се разликовати од
`прикажи г' и `прикажи у'; то чак могу бити и кликови
мишем или ставке менија или нешто што највише одговара
вашем програму.
Такође би требало да затражите од вашег послодавца (ако
сте запослени као програмер) или ваше школе (ако сте у
школи) да потпише ,,објашњење ауторских права`` за
програм, у случају да је то потребно. На пример (измените
имена):
Такође би требало да затражите од вашег послодавца (ако
сте запослени као програмер) или ваше школе (ако сте у
школи) да потпише ,,објашњење ауторских права`` за
програм, у случају да је то потребно. На пример (измените
имена):
Јојодин, д.д., се овим одриче свих ауторских права за
програм `Гномовизија' (који пролази кроз преводиоце)
који је написао Петар Хакер.
Јојодин, д.д., се овим одриче свих ауторских права за
програм `Гномовизија' (који пролази кроз преводиоце)
који је написао Петар Хакер.
<потпис Тај Куна>, 1. април 1989.
Тај Кун, председник пода
<потпис Тај Куна>, 1. април 1989.
Тај Кун, председник пода
Ова општа јавна лиценца не дозвољава укључење вашег
програма у програме у приватном власништву. Ако је ваш
програм библиотека рутина, може вам бити корисније да
дозволите повезивање власничких апликација са библиотеком.
Ако је то оно што желите, користите ГНУ-ову библиотечку
општу јавну лиценцу (**) уместо ове лиценце.
Ова општа јавна лиценца не дозвољава укључење вашег
програма у програме у приватном власништву. Ако је ваш
програм библиотека рутина, може вам бити корисније да
дозволите повезивање власничких апликација са библиотеком.
Ако је то оно што желите, користите ГНУ-ову библиотечку
општу јавну лиценцу (**) уместо ове лиценце.
Напомене у тексту
Напомене у тексту
(*) Коначна српска верзија ГНУ-ове ОЈЛ је уобличена 6.
августа 2001. године у Београду, уз мање исправке 20.
септембра 2002., 3. и 16. фебруара 2003., 5. и 10.
маја 2003. и 1. и 6. септембра 2003.
(*) Коначна српска верзија ГНУ-ове ОЈЛ је уобличена 6.
августа 2001. године у Београду, уз мање исправке 20.
септембра 2002., 3. и 16. фебруара 2003., 5. и 10.
маја 2003. и 1. и 6. септембра 2003.
(**) ГНУ-ова библиотечка општа јавна лиценца (БОЈЛ, енг.
LGPL/Library General Public License) се сада зове
ГНУ-ова мања општа јавна лиценца (МОЈЛ, енг.
(**) ГНУ-ова библиотечка општа јавна лиценца (БОЈЛ, енг.
LGPL/Library General Public License) се сада зове
ГНУ-ова мања општа јавна лиценца (МОЈЛ, енг.
LGPL/Lesser General Public License).
Заслуге за српску верзију ГНУ-ове ОЈЛ
Заслуге за српску верзију ГНУ-ове ОЈЛ
превод са енглеског:
превод са енглеског:
Страхиња Радић, студент на Математичком факултету у
Београду,
<mr99164 на серверу alas.matf.bg.ac.yu>
Страхиња Радић, студент на Математичком факултету у
Београду,
<mr99164 на серверу alas.matf.bg.ac.yu>
сугестије:
сугестије:
Милош Ранчић, студент на Филолошком факултету у
Београду,
<millosh на серверу isgf.grf.bg.ac.yu>
Милош Ранчић, студент на Филолошком факултету у
Београду,
<millosh на серверу isgf.grf.bg.ac.yu>
Зоран Стефановић, председник пројекта ,,Растко``,
<orfej на серверу rastko.org.yu>
Зоран Стефановић, председник пројекта ,,Растко``,
<orfej на серверу rastko.org.yu>
правни савети:
правни савети:
Марко Милосављевић, студент на Правном факултету у
Београду.
Марко Милосављевић, студент на Правном факултету у
Београду.
Захваљујем се многим другима које овде нисам поменуо, а
који су дали свој допринос настојањима да српска верзија
ГНУ-ове ОЈЛ заживи. Превод је настао као пројекат Српског
рачунарског друштва ,,УЛИКС``,
Захваљујем се многим другима које овде нисам поменуо, а
који су дали свој допринос настојањима да српска верзија
ГНУ-ове ОЈЛ заживи. Превод је настао као пројекат Српског
рачунарског друштва ,,УЛИКС``,
<http://uliks.sourceforge.net/>.
[QueryBox]
Прозори упита
Прозори упита
У дијалозима упита можете да користите тастере са
стрелицама или прво слово да бисте изабрали ставку или
можете да притиснете дугме миша када се показивач налази
изнад дугмета на екрану.
У дијалозима упита можете да користите тастере са
стрелицама или прво слово да бисте изабрали ставку или
можете да притиснете дугме миша када се показивач налази
изнад дугмета на екрану.
[How to use help]
Како користити помоћ
Како користити помоћ
Можете да користите курсорске тастере да бисте се кретали
у оквиру прегледача помоћи. Притисните стрелицу надоле
да бисте се померили на следећу ставку или клизали надоле.
Притисните стрелицу нагоре да бисте се померили на
претходну ставку или клизали нагоре. Притисните стрелицу
надесно да бисте пратили текућу везу. Притисните
стрелицу налево да бисте се вратили уназад у оквиру
историје посећених чворова.
Можете да користите курсорске тастере да бисте се кретали
у оквиру прегледача помоћи. Притисните стрелицу надоле
да бисте се померили на следећу ставку или клизали надоле.
Притисните стрелицу нагоре да бисте се померили на
претходну ставку или клизали нагоре. Притисните стрелицу
надесно да бисте пратили текућу везу. Притисните
стрелицу налево да бисте се вратили уназад у оквиру
историје посећених чворова.
Ако ваш терминал не подржава курсорске тастере, можете да
користите размакницу да бисте клизали унапред и b
(латинично б) да бисте клизали уназад. Користите тастер
TAB да бисте прешли на следећу ставку а ENTER да
бисте пратили текућу везу. Тастер l (латинично л) се
може користити за враћање уназад у историји чворова које
сте посетили. Притисните тастер ESC да бисте изашли из
прегледача помоћи.
Ако ваш терминал не подржава курсорске тастере, можете да
користите размакницу да бисте клизали унапред и b
(латинично б) да бисте клизали уназад. Користите тастер
TAB да бисте прешли на следећу ставку а ENTER да
бисте пратили текућу везу. Тастер l (латинично л) се
може користити за враћање уназад у историји чворова које
сте посетили. Притисните тастер ESC да бисте изашли из
прегледача помоћи.
Притиском на лево дугме миша ћете пратити везу или
клизати. Притиском на десно дугме миша ћете се враћати
уназад у историји чворова.
Притиском на лево дугме миша ћете пратити везу или
клизати. Притиском на десно дугме миша ћете се враћати
уназад у историји чворова.
Потпун списак тастера прегледача помоћи:
Потпун списак тастера прегледача помоћи:
Дозвољене су опште пречице за кретањеGeneral Movement Keys.
Дозвољене су опште пречице за кретањеGeneral Movement Keys.
tab Помери се на следећу ставку.
M-tab Помери се на претходну ставку.
доле Помери се на след. ставку или клизај 1 ред надоле.
горе Помери се на прет. ставку или клизај 1 ред нагоре.
десно , enter Прати текућу везу.
лево , l Врати се уназад у историји посећених чворова.
F1 Прикажи помоћ око прегледача помоћи.
n Иди на следећи чвор.
p Иди на претходни чвор.
c Иди на чвор `садржај'.
F10 , esc Излаз из прегледача помоћи.
tab Помери се на следећу ставку.
M-tab Помери се на претходну ставку.
доле Помери се на след. ставку или клизај 1 ред надоле.
горе Помери се на прет. ставку или клизај 1 ред нагоре.
десно , enter Прати текућу везу.
лево , l Врати се уназад у историји посећених чворова.
F1 Прикажи помоћ око прегледача помоћи.
n Иди на следећи чвор.
p Иди на претходни чвор.
c Иди на чвор `садржај'.
F10 , esc Излаз из прегледача помоћи.

Local variables:
fill-column: 58

View File

@ -297,124 +297,124 @@ menu_user_menu_cmd (void)
static menu_entry FileMenu[] =
{
{' ', N_("&Open file..."), 'O', menu_load_cmd},
{' ', N_("&New C-n"), 'N', menu_new_cmd},
{' ', "", ' ', 0},
{' ', N_("&Save F2"), 'S', menu_save_cmd},
{' ', N_("Save &as... F12"), 'A', menu_save_as_cmd},
{' ', "", ' ', 0},
{' ', N_("&Insert file... F15"), 'I', menu_insert_file_cmd},
{' ', N_("Copy to &file... C-f"), 'F', menu_cut_cmd},
{' ', "", ' ', 0},
{' ', N_("&User menu... F11"), 'U', menu_user_menu_cmd},
{' ', "", ' ', 0},
{' ', N_("A&bout... "), 'B', edit_about_cmd},
{' ', "", ' ', 0},
{' ', N_("&Quit F10"), 'Q', menu_quit_cmd}
{' ', N_("&Open file..."), NULL_HOTKEY, menu_load_cmd},
{' ', N_("&New C-n"), NULL_HOTKEY, menu_new_cmd},
{' ', "", NULL_HOTKEY, 0},
{' ', N_("&Save F2"), NULL_HOTKEY, menu_save_cmd},
{' ', N_("Save &as... F12"), NULL_HOTKEY, menu_save_as_cmd},
{' ', "", NULL_HOTKEY, 0},
{' ', N_("&Insert file... F15"), NULL_HOTKEY, menu_insert_file_cmd},
{' ', N_("Copy to &file... C-f"), NULL_HOTKEY, menu_cut_cmd},
{' ', "", NULL_HOTKEY, 0},
{' ', N_("&User menu... F11"), NULL_HOTKEY, menu_user_menu_cmd},
{' ', "", NULL_HOTKEY, 0},
{' ', N_("A&bout... "), NULL_HOTKEY, edit_about_cmd},
{' ', "", NULL_HOTKEY, 0},
{' ', N_("&Quit F10"), NULL_HOTKEY, menu_quit_cmd}
};
static menu_entry FileMenuEmacs[] =
{
{' ', N_("&Open file..."), 'O', menu_load_cmd},
{' ', N_("&New C-x k"), 'N', menu_new_cmd},
{' ', "", ' ', 0},
{' ', N_("&Save F2"), 'S', menu_save_cmd},
{' ', N_("Save &as... F12"), 'A', menu_save_as_cmd},
{' ', "", ' ', 0},
{' ', N_("&Insert file... F15"), 'I', menu_insert_file_cmd},
{' ', N_("Copy to &file... "), 'F', menu_cut_cmd},
{' ', "", ' ', 0},
{' ', N_("&User menu... F11"), 'U', menu_user_menu_cmd},
{' ', "", ' ', 0},
{' ', N_("A&bout... "), 'B', edit_about_cmd},
{' ', "", ' ', 0},
{' ', N_("&Quit F10"), 'Q', menu_quit_cmd}
{' ', N_("&Open file..."), NULL_HOTKEY, menu_load_cmd},
{' ', N_("&New C-x k"), NULL_HOTKEY, menu_new_cmd},
{' ', "", NULL_HOTKEY, 0},
{' ', N_("&Save F2"), NULL_HOTKEY, menu_save_cmd},
{' ', N_("Save &as... F12"), NULL_HOTKEY, menu_save_as_cmd},
{' ', "", NULL_HOTKEY, 0},
{' ', N_("&Insert file... F15"), NULL_HOTKEY, menu_insert_file_cmd},
{' ', N_("Copy to &file... "), NULL_HOTKEY, menu_cut_cmd},
{' ', "", NULL_HOTKEY, 0},
{' ', N_("&User menu... F11"), NULL_HOTKEY, menu_user_menu_cmd},
{' ', "", NULL_HOTKEY, 0},
{' ', N_("A&bout... "), NULL_HOTKEY, edit_about_cmd},
{' ', "", NULL_HOTKEY, 0},
{' ', N_("&Quit F10"), NULL_HOTKEY, menu_quit_cmd}
};
static menu_entry EditMenu[] =
{
{' ', N_("&Toggle Mark F3"), 'T', menu_mark_cmd},
{' ', N_("&Mark Columns S-F3"), 'T', menu_markcol_cmd},
{' ', "", ' ', 0},
{' ', N_("Toggle &ins/overw Ins"), 'I', menu_ins_cmd},
{' ', "", ' ', 0},
{' ', N_("&Copy F5"), 'C', menu_copy_cmd},
{' ', N_("&Move F6"), 'M', menu_move_cmd},
{' ', N_("&Delete F8"), 'D', menu_delete_cmd},
{' ', "", ' ', 0},
{' ', N_("&Undo C-u"), 'U', menu_undo_cmd},
{' ', "", ' ', 0},
{' ', N_("&Beginning C-PgUp"), 'B', menu_beginning_cmd},
{' ', N_("&End C-PgDn"), 'E', menu_end_cmd}
{' ', N_("&Toggle Mark F3"), NULL_HOTKEY, menu_mark_cmd},
{' ', N_("&Mark Columns S-F3"), NULL_HOTKEY, menu_markcol_cmd},
{' ', "", NULL_HOTKEY, 0},
{' ', N_("Toggle &ins/overw Ins"), NULL_HOTKEY, menu_ins_cmd},
{' ', "", NULL_HOTKEY, 0},
{' ', N_("&Copy F5"), NULL_HOTKEY, menu_copy_cmd},
{' ', N_("&Move F6"), NULL_HOTKEY, menu_move_cmd},
{' ', N_("&Delete F8"), NULL_HOTKEY, menu_delete_cmd},
{' ', "", NULL_HOTKEY, 0},
{' ', N_("&Undo C-u"), NULL_HOTKEY, menu_undo_cmd},
{' ', "", NULL_HOTKEY, 0},
{' ', N_("&Beginning C-PgUp"), NULL_HOTKEY, menu_beginning_cmd},
{' ', N_("&End C-PgDn"), NULL_HOTKEY, menu_end_cmd}
};
#define EditMenuEmacs EditMenu
static menu_entry SearReplMenu[] =
{
{' ', N_("&Search... F7"), 'S', menu_search_cmd},
{' ', N_("Search &again F17"), 'A', menu_search_again_cmd},
{' ', N_("&Replace... F4"), 'R', menu_replace_cmd}
{' ', N_("&Search... F7"), NULL_HOTKEY, menu_search_cmd},
{' ', N_("Search &again F17"), NULL_HOTKEY, menu_search_again_cmd},
{' ', N_("&Replace... F4"), NULL_HOTKEY, menu_replace_cmd}
};
#define SearReplMenuEmacs SearReplMenu
static menu_entry CmdMenu[] =
{
{' ', N_("&Go to line... M-l"), 'G', menu_goto_line},
{' ', N_("Go to matching &bracket M-b"), 'B', menu_goto_bracket},
{' ', "", ' ', 0},
{' ', N_("Insert &literal... C-q"), 'L', menu_lit_cmd},
{' ', "", ' ', 0},
{' ', N_("&Refresh screen C-l"), 'R', menu_refresh_cmd},
{' ', "", ' ', 0},
{' ', N_("&Start record macro C-r"), 'S', menu_begin_record_cmd},
{' ', N_("&Finish record macro... C-r"), 'F', menu_end_record_cmd},
{' ', N_("&Execute macro... C-a, KEY"), 'E', menu_exec_macro_cmd},
{' ', N_("Delete macr&o... "), 'O', menu_exec_macro_delete_cmd},
{' ', "", ' ', 0},
{' ', N_("Insert &date/time "), 'D', menu_date_cmd},
{' ', "", ' ', 0},
{' ', N_("Format p&aragraph M-p"), 'A', menu_format_paragraph},
{' ', N_("'ispell' s&pell check C-p"), 'P', menu_ispell_cmd},
{' ', N_("Sor&t... M-t"), 'T', menu_sort_cmd},
{' ', N_("Paste o&utput of... M-u"), 'U', menu_ext_cmd},
{' ', N_("E&xternal Formatter F19"), 'C', menu_c_form_cmd},
{' ', N_("&Mail... "), 'M', menu_mail_cmd}
{' ', N_("&Go to line... M-l"), NULL_HOTKEY, menu_goto_line},
{' ', N_("Go to matching &bracket M-b"), NULL_HOTKEY, menu_goto_bracket},
{' ', "", NULL_HOTKEY, 0},
{' ', N_("Insert &literal... C-q"), NULL_HOTKEY, menu_lit_cmd},
{' ', "", NULL_HOTKEY, 0},
{' ', N_("&Refresh screen C-l"), NULL_HOTKEY, menu_refresh_cmd},
{' ', "", NULL_HOTKEY, 0},
{' ', N_("&Start record macro C-r"), NULL_HOTKEY, menu_begin_record_cmd},
{' ', N_("&Finish record macro... C-r"), NULL_HOTKEY, menu_end_record_cmd},
{' ', N_("&Execute macro... C-a, KEY"), NULL_HOTKEY, menu_exec_macro_cmd},
{' ', N_("Delete macr&o... "), NULL_HOTKEY, menu_exec_macro_delete_cmd},
{' ', "", NULL_HOTKEY, 0},
{' ', N_("Insert &date/time "), NULL_HOTKEY, menu_date_cmd},
{' ', "", NULL_HOTKEY, 0},
{' ', N_("Format p&aragraph M-p"), NULL_HOTKEY, menu_format_paragraph},
{' ', N_("'ispell' s&pell check C-p"), NULL_HOTKEY, menu_ispell_cmd},
{' ', N_("Sor&t... M-t"), NULL_HOTKEY, menu_sort_cmd},
{' ', N_("Paste o&utput of... M-u"), NULL_HOTKEY, menu_ext_cmd},
{' ', N_("E&xternal Formatter F19"), NULL_HOTKEY, menu_c_form_cmd},
{' ', N_("&Mail... "), NULL_HOTKEY, menu_mail_cmd}
};
static menu_entry CmdMenuEmacs[] =
{
{' ', N_("&Go to line... M-l"), 'G', menu_goto_line},
{' ', N_("Go to matching &bracket M-b"), 'B', menu_goto_bracket},
{' ', "", ' ', 0},
{' ', N_("Insert &literal... C-q"), 'L', menu_lit_cmd},
{' ', "", ' ', 0},
{' ', N_("&Refresh screen C-l"), 'R', menu_refresh_cmd},
{' ', "", ' ', 0},
{' ', N_("&Start record macro C-r"), 'S', menu_begin_record_cmd},
{' ', N_("&Finish record macro... C-r"), 'F', menu_end_record_cmd},
{' ', N_("&Execute macro... C-x e, KEY"), 'E', menu_exec_macro_cmd},
{' ', N_("Delete macr&o... "), 'o', menu_exec_macro_delete_cmd},
{' ', "", ' ', 0},
{' ', N_("Insert &date/time "), 'D', menu_date_cmd},
{' ', "", ' ', 0},
{' ', N_("Format p&aragraph M-p"), 'a', menu_format_paragraph},
{' ', N_("'ispell' s&pell check M-$"), 'P', menu_ispell_cmd},
{' ', N_("Sor&t... M-t"), 'T', menu_sort_cmd},
{' ', N_("Paste o&utput of... M-u"), 'U', menu_ext_cmd},
{' ', N_("E&xternal Formatter F19"), 'C', menu_c_form_cmd},
{' ', N_("&Mail... "), 'M', menu_mail_cmd}
{' ', N_("&Go to line... M-l"), NULL_HOTKEY, menu_goto_line},
{' ', N_("Go to matching &bracket M-b"), NULL_HOTKEY, menu_goto_bracket},
{' ', "", NULL_HOTKEY, 0},
{' ', N_("Insert &literal... C-q"), NULL_HOTKEY, menu_lit_cmd},
{' ', "", NULL_HOTKEY, 0},
{' ', N_("&Refresh screen C-l"), NULL_HOTKEY, menu_refresh_cmd},
{' ', "", NULL_HOTKEY, 0},
{' ', N_("&Start record macro C-r"), NULL_HOTKEY, menu_begin_record_cmd},
{' ', N_("&Finish record macro... C-r"), NULL_HOTKEY, menu_end_record_cmd},
{' ', N_("&Execute macro... C-x e, KEY"), NULL_HOTKEY, menu_exec_macro_cmd},
{' ', N_("Delete macr&o... "), NULL_HOTKEY, menu_exec_macro_delete_cmd},
{' ', "", NULL_HOTKEY, 0},
{' ', N_("Insert &date/time "), NULL_HOTKEY, menu_date_cmd},
{' ', "", NULL_HOTKEY, 0},
{' ', N_("Format p&aragraph M-p"), NULL_HOTKEY, menu_format_paragraph},
{' ', N_("'ispell' s&pell check M-$"), NULL_HOTKEY, menu_ispell_cmd},
{' ', N_("Sor&t... M-t"), NULL_HOTKEY, menu_sort_cmd},
{' ', N_("Paste o&utput of... M-u"), NULL_HOTKEY, menu_ext_cmd},
{' ', N_("E&xternal Formatter F19"), NULL_HOTKEY, menu_c_form_cmd},
{' ', N_("&Mail... "), NULL_HOTKEY, menu_mail_cmd}
};
static menu_entry OptMenu[] =
{
{' ', N_("&General... "), 'G', menu_options},
{' ', N_("&Save mode..."), 'S', menu_save_mode_cmd},
{' ', N_("Learn &Keys..."), 'K', learn_keys},
{' ', N_("Syntax &Highlighting..."), 'H', menu_syntax},
{' ', "", ' ', 0},
{' ', N_("Save setu&p..."), 'p', save_setup_cmd}
{' ', N_("&General... "), NULL_HOTKEY, menu_options},
{' ', N_("&Save mode..."), NULL_HOTKEY, menu_save_mode_cmd},
{' ', N_("Learn &Keys..."), NULL_HOTKEY, learn_keys},
{' ', N_("Syntax &Highlighting..."), NULL_HOTKEY, menu_syntax},
{' ', "", NULL_HOTKEY, 0},
{' ', N_("Save setu&p..."), NULL_HOTKEY, save_setup_cmd}
};
#define OptMenuEmacs OptMenu

View File

@ -10,3 +10,4 @@ CP852 CP 852
CP866 CP 866
KOI8-R KOI8-R
KOI8-U KOI8-U
UTF-8 UTF-8

View File

@ -1,43 +1,43 @@
Tip: C-x t vloží na příkazovou řádku označené soubory.
Tip: C-x p vloží na příkazovou řádku jméno aktuálního adresáře.
Tip: K doplňování použijte M-Tab (nebo Esc+Tab). Dvojitým zadání získáte seznam.
Tip: Použitím M-p nebo M-n se pohybujete v historii příkazů.
Tip: Chcete zadat speciální znak(např. tabelátor)? Použijte Ctrl-Q a daný znak.
Tip: Nechcete již vidět tipy? Vypněte je v Nastavení/Zobrazení/Další nastavení.
Tip: Adresáře vyberete přidáním lomítka na konec vzorku.
Tip: Pokud Váš terminál nezná nebo nemá funkční klávesy, použijte Esc+číslo.
Tip: Domácí stránka programu Midnight Commander je http://www.midnight-commander.org/
Tip: Zprávy o chybách posílejte na mc-devel@gnome.org (anglicky).
Tip: Pomocí klávesy Tab změníte aktuální panel.
Tip: Stiskem Enter na souboru .tar nebo .tar.gz si prohlédnete obsah.
Tip: Existuje také manuálová stránka [mc(1)].
Tip: Přejete si klávesy stejně jako v lynxu? Nastavte to v Nastavení.
Tip: Makra uvozená % pracují na příkazové řádce.
Tip: Pomocí M-! můžete spustit příkaz a prohlédnout si výstup v okně.
Tip: Zobrazení v panelech může být upraveno. Z 'man mc' se dozvíte více.
Tip: %D/%T se rozvine na soubory označené v druhém panelu.
Tip: Chcete opět váš shell? Stiskněte C-o. Do MC se vrátíte opět přes C-o.
Tip: Nastavením proměnné CDPATH můžete šetřit klávesnici.
Tip: Pokud chcete vidět soubory začínající tečkou, řekněte to v Nastavení.
Tip: Chcete vidět zálohy svých souborů (končí ~). Použijte Nastavení.
Tip: Doplňování funguje ve vstupních řádkách všech dialogů. Použijte M-Tab.
Tip: Na terminálech s pomalou odezvou skuste na parametr -s (mc -s).
Tip: S nalezenými soubory můžete pracovat. Stiskněte tlačítko Panelizace.
Tip: Pro opravdu složité operace zkuste příkaz Příkaz/Externí panelizace.
Tip: Pokud chcete změnit adresář při práci na příkoazové řádce, zkuste M-c.
Poznámka: Příkazy shellu nefungují, pokud nepracujete na lokální systému souborů.
Tip: Smazaný text obnovíte C-y.
Tip: Pokud některé klávesy nefungují, použijte menu Nastavení/učení kláves.
Tip: F13 (nebo Shift-F3) vyvolá prohlížení bez zpracování obsahu souboru.
Tip: Editor pro klávesu F4 určíte pomocí proměnné prostředí EDITOR.
Tip: Externí prohlížeč určíte proměnnou PAGER.
Tip: Všechny žádosti o potvrzení můžete zakázat v Nastavení/Potvrzování.
Tip: K seznam často používaných adresářů se můžete dostat i přes C-\.
Tip: Na anonymní FTP se připojíte pomocí 'cd /#ftp:stroj.domena.cz'
Tip: MC vestavěný FTP protokol. Podívejte se do menu Levý/Ftp spojení.
Tip: M-t rychle mění formát zobrazení panelů.
Tip: Při FTP spojení můžete zadat i jméno: 'cd /#ftp:jmeno@stroj.domena.cz'
Tip: RPM soubory si prohlédnete stiskem Enter.
Tip: Pokud chcete označit adresář, přidejte '/' (lomítko).
Tip: Chcete-li použít myš pro zkopírování nebo vložení textu, stiskněte Shift.
Tip: V seznamu adresářů můžete mít i často navštěvované ftp servery. Zkuste C-\.
Tip: C-x t vloží na příkazovou řádku označené soubory.
Tip: C-x p vloží na příkazovou řádku jméno aktuálního adresáře.
Tip: K doplňování použijte M-Tab (nebo Esc+Tab). Dvojitým zadání získáte seznam.
Tip: Použitím M-p nebo M-n se pohybujete v historii příkazů.
Tip: Chcete zadat speciální znak(např. tabelátor)? Použijte Ctrl-Q a daný znak.
Tip: Nechcete již vidět tipy? Vypněte je v Nastavení/Zobrazení/Další nastavení.
Tip: Adresáře vyberete přidáním lomítka na konec vzorku.
Tip: Pokud Váš terminál nezná nebo nemá funkční klávesy, použijte Esc+číslo.
Tip: Domácí stránka programu Midnight Commander je http://www.midnight-commander.org/
Tip: Zprávy o chybách posílejte na mc-devel@gnome.org (anglicky).
Tip: Pomocí klávesy Tab změníte aktuální panel.
Tip: Stiskem Enter na souboru .tar nebo .tar.gz si prohlédnete obsah.
Tip: Existuje také manuálová stránka [mc(1)].
Tip: Přejete si klávesy stejně jako v lynxu? Nastavte to v Nastavení.
Tip: Makra uvozená % pracují na příkazové řádce.
Tip: Pomocí M-! můžete spustit příkaz a prohlédnout si výstup v okně.
Tip: Zobrazení v panelech může být upraveno. Z 'man mc' se dozvíte více.
Tip: %D/%T se rozvine na soubory označené v druhém panelu.
Tip: Chcete opět váš shell? Stiskněte C-o. Do MC se vrátíte opět přes C-o.
Tip: Nastavením proměnné CDPATH můžete šetřit klávesnici.
Tip: Pokud chcete vidět soubory začínající tečkou, řekněte to v Nastavení.
Tip: Chcete vidět zálohy svých souborů (končí ~). Použijte Nastavení.
Tip: Doplňování funguje ve vstupních řádkách všech dialogů. Použijte M-Tab.
Tip: Na terminálech s pomalou odezvou skuste na parametr -s (mc -s).
Tip: S nalezenými soubory můžete pracovat. Stiskněte tlačítko Panelizace.
Tip: Pro opravdu složité operace zkuste příkaz Příkaz/Externí panelizace.
Tip: Pokud chcete změnit adresář při práci na příkoazové řádce, zkuste M-c.
Poznámka: Příkazy shellu nefungují, pokud nepracujete na lokální systému souborů.
Tip: Smazaný text obnovíte C-y.
Tip: Pokud některé klávesy nefungují, použijte menu Nastavení/učení kláves.
Tip: F13 (nebo Shift-F3) vyvolá prohlížení bez zpracování obsahu souboru.
Tip: Editor pro klávesu F4 určíte pomocí proměnné prostředí EDITOR.
Tip: Externí prohlížeč určíte proměnnou PAGER.
Tip: Všechny žádosti o potvrzení můžete zakázat v Nastavení/Potvrzování.
Tip: K seznam často používaných adresářů se můžete dostat i přes C-\.
Tip: Na anonymní FTP se připojíte pomocí 'cd /#ftp:stroj.domena.cz'
Tip: MC vestavěný FTP protokol. Podívejte se do menu Levý/Ftp spojení.
Tip: M-t rychle mění formát zobrazení panelů.
Tip: Při FTP spojení můžete zadat i jméno: 'cd /#ftp:jmeno@stroj.domena.cz'
Tip: RPM soubory si prohlédnete stiskem Enter.
Tip: Pokud chcete označit adresář, přidejte '/' (lomítko).
Tip: Chcete-li použít myš pro zkopírování nebo vložení textu, stiskněte Shift.
Tip: V seznamu adresářů můžete mít i často navštěvované ftp servery. Zkuste C-\.

View File

@ -1,45 +1,45 @@
Ayudita: C-x t pone los archivos marcados en la línea de órdenes.
Ayudita: C-x p copia la trayectoria completa en la línea de órdenes.
Ayudita: C-x C-p copia la trayectoria del panel opuesto en la línea de órdenes.
Ayudita: C-x t pone los archivos marcados en la línea de órdenes.
Ayudita: C-x p copia la trayectoria completa en la línea de órdenes.
Ayudita: C-x C-p copia la trayectoria del panel opuesto en la línea de órdenes.
Ayudita: M-Tab (o Esc+Tab) completa nombres; dos veces y muestra una lista.
Ayudita: M-p y M-n permiten acceder a la historia de órdenes.
Ayudita: Para introducir un carácter especial: C-q y el caracter.
Ayudita: ¿Harto de mensajitos? Se quitan en el menú Opciones/Presentación.
Ayudita: Para seleccionar directorios añadir "/" tras el patrón a buscar.
Ayudita: Si no funcionan las teclas de función, ESC+número sirve.
Ayudita: El web del Midnight Commander está en http://www.midnight-commander.org/
Ayudita: M-p y M-n permiten acceder a la historia de órdenes.
Ayudita: Para introducir un carácter especial: C-q y el caracter.
Ayudita: ¿Harto de mensajitos? Se quitan en el menú Opciones/Presentación.
Ayudita: Para seleccionar directorios añadir "/" tras el patrón a buscar.
Ayudita: Si no funcionan las teclas de función, ESC+número sirve.
Ayudita: El web del Midnight Commander está en http://www.midnight-commander.org/
Ayudita: El sitio oficial del Midnight Commander es http://www.midnight-commander.org/
Ayudita: Comunique cualquier defecto a mc-devel@gnome.org
Ayudita: El tabulador cambia de panel.
Ayudita: ¡El mejor VFS! Al <entrar> en un archivo comprimido se ve su contenido.
Ayudita: ¡El mejor VFS! Al <entrar> en un archivo comprimido se ve su contenido.
Ayudita: El Midnight Commander tiene manual: "man mc"
Ayudita: ¿Desea navegar con las flechas al estilo lynx? Está en Configuración.
Ayudita: Las macros con % funcionan incluso en la línea de órdenes.
Ayudita: ¿Desea navegar con las flechas al estilo lynx? Está en Configuración.
Ayudita: Las macros con % funcionan incluso en la línea de órdenes.
Ayudita: Con M-! puede ejecutar programas y ver la salida en el visor.
Ayudita: El formato del listado se puede personalizar; "man mc" para ver pistas.
Ayudita: %D/%T representa los archivos seleccionados en el panel opuesto.
Ayudita: Con C-o se puede ir y volver a la shell de siempre.
Ayudita: La variable CDPATH ahorra teclas al cambiar de directorios.
Ayudita: Para ver los archivos .* basta indicarlo en Configuración.
Ayudita: Para ver los archivos de seguridad tipo *~ ir a Configuración.
Ayudita: Se puede auto-completar nombres también en los diálogos con M-Tab.
Ayudita: En terminales lentos la opción -s puede ayudar.
Ayudita: Para ver los archivos .* basta indicarlo en Configuración.
Ayudita: Para ver los archivos de seguridad tipo *~ ir a Configuración.
Ayudita: Se puede auto-completar nombres también en los diálogos con M-Tab.
Ayudita: En terminales lentos la opción -s puede ayudar.
Ayudita: Puede "Llevar al panel" los resultados de "Buscar archivos" y usarlos.
Ayudita: Puede hacer y guardar búsquedas complejas con "Búsquedas externas".
Ayudita: Con M-c cambiar de directorio es un poco más cómodo.
Ayudita: Puede hacer y guardar búsquedas complejas con "Búsquedas externas".
Ayudita: Con M-c cambiar de directorio es un poco más cómodo.
Nota: Las instrucciones de la Shell no funcionan fuera del sistema local.
Ayudita: Con C-y puede recuperar texto eliminado.
Ayudita: ¿Alguna tecla rebelde? Puede educarla con "Redefinir teclas".
Ayudita: ¿Alguna tecla rebelde? Puede educarla con "Redefinir teclas".
Ayudita: Para ver la salida de una orden por el visor M-!
Ayudita: F13 (o Mayúsculas-F3) invoca el visor en modo primitivo, sin formatos.
Ayudita: F13 (o Mayúsculas-F3) invoca el visor en modo primitivo, sin formatos.
Ayudita: F4 puede usar cualquier editor que indiquemos en la variable EDITOR.
Ayudita: Se puede usar un visor externo indicado en la variable PAGER.
Ayudita: Para deshabilitar los mensajes de Confirmación vaya al menú Opciones.
Ayudita: Apunte los directorios y sitios más usados en "Favoritos".
Ayudita: Para hacer un FTP anónimo con mc: 'cd /#ftp:maquina.dominio'
Ayudita: FTP está integrado en Midnight Commander, en "conexión por FTP..."
Ayudita: M-t permite cambiar rápidamente entre varios modos de listado.
Ayudita: Para hacer un FTP no-anónimo: 'cd /#ftp:usuario@maquina.dominio'
Ayudita: Para examinar un archivo RPM basta pulsar <intro> sobre él.
Ayudita: Para copiar y pegar con ratón mantener presionada la tecla MAYÚSCULAS.
Ayudita: Para deshabilitar los mensajes de Confirmación vaya al menú Opciones.
Ayudita: Apunte los directorios y sitios más usados en "Favoritos".
Ayudita: Para hacer un FTP anónimo con mc: 'cd /#ftp:maquina.dominio'
Ayudita: FTP está integrado en Midnight Commander, en "conexión por FTP..."
Ayudita: M-t permite cambiar rápidamente entre varios modos de listado.
Ayudita: Para hacer un FTP no-anónimo: 'cd /#ftp:usuario@maquina.dominio'
Ayudita: Para examinar un archivo RPM basta pulsar <intro> sobre él.
Ayudita: Para copiar y pegar con ratón mantener presionada la tecla MAYÚSCULAS.
Ayudita: Los ftp habituales se pueden guardar en "Favoritos".

View File

@ -1,44 +1,44 @@
Tipp: A kijelölt fájlnevek parancssorba való másolása: C-x t
Tipp: Az aktuális elérési út parancssorba való másolása: C-x p
Tipp: Kiegészítés: M-Tab (vagy Esc Tab). Kétszer lenyomva listát ad.
Tipp: Korábbi parancsok előhozása: M-p illetve M-n
Tipp: Speciális karakter beírásához használja ezt: Control-q <karakter>
Tipp: Az itt megjelenő üzenetek kikapcsolhatók a "Beállítások/Megjelenés"-nél.
Tipp: Könyvtárak kijelölése a minta végére / jelet írva lehetséges.
Tipp: Ha a terminálon nincsenek funkcióbillentyűk, használja ezt: Esc <szám>
Tipp: A kijelölt fájlnevek parancssorba való másolása: C-x t
Tipp: Az aktuális elérési út parancssorba való másolása: C-x p
Tipp: Kiegészítés: M-Tab (vagy Esc Tab). Kétszer lenyomva listát ad.
Tipp: Korábbi parancsok előhozása: M-p illetve M-n
Tipp: Speciális karakter beírásához használja ezt: Control-q <karakter>
Tipp: Az itt megjelenő üzenetek kikapcsolhatók a "Beállítások/Megjelenés"-nél.
Tipp: Könyvtárak kijelölése a minta végére / jelet írva lehetséges.
Tipp: Ha a terminálon nincsenek funkcióbillentyűk, használja ezt: Esc <szám>
Tipp: A Midnight Commander honlapja: http://www.midnight-commander.org/
Tipp: Hibabejelentéseket a következő címre lehet küldeni: mc-devel@gnome.org
Tipp: A Tab billentyűvel lehet panelt váltani.
Tipp: VFS-funkció: egy Tar-fájlon Entert nyomva megjelenik annak tartalma.
Tipp: A Midnight Commandernek van "man" (kézikönyv) lapja is.
Tipp: Szeretne Lynx-stílusú navigációt? Be lehet állítani az Alapbeállításoknál.
Tipp: A % makrók még a parancssorban is használhatók.
Tipp: Program végrehajtása a kimenetnek a fájlmegjelenítőbe való küldésével: M-!
Tipp: A fájlok listázási módja beállítható; részletek a "man mc" paranccsal.
Tipp: A %D/%T sztring a másik panel kijelölt fájljaival lesz helyettesítve.
Tipp: A sima shell-t szeretné? Használja ezt: C-o (visszatérés MC-be: ugyanígy).
Tipp: A CDPATH változó beállításával egyszerűbbé tehető a "cd" parancsok kiadása.
Tipp: Ha látni szeretné a .* rejtett fájlokat, állítsa be az Alapbeállításoknál.
Tipp: Ha látni szeretné a *~ másolatfájlokat, állítsa be az Alapbeállításoknál.
Tipp: A kiegészítés minden ablak összes beviteli mezőjében működik: M-Tab
Tipp: Lassú terminálokon a -s opció hasznos lehet.
Tipp: Fájlkeresés: műveletek végzése a megtalált fájlokkal: "Listát a panelra".
Tipp: Komplex keresések végzéséhez a "Külső panel-parancs" funkció javasolt.
Tipp: Könyvtárváltás egy parancs begépelése közben: M-c (gyors könyvtárváltás).
Megjegyzés: A shell-parancsok távoli fájlrendszereken nem használhatók.
Tipp: A pufferben levő (például "C-k"-val oda tett) szöveg visszahozása: C-y
Tipp: Ha nem működnek bizonyos billentyűk: "Beállítások/Billentyűk".
Tipp: Egy parancs kimenetének megjelenítése a fájlmegjelenítőben: M-!
Tipp: Az F13 (vagy Shift-F3) a fájlmegjelenítőt "nyers" módban indítja el.
Tipp: Az F4-re használandó szerkesztőt az EDITOR shell-változóval lehet megadni.
Tipp: A külső fájlmegjelenítőt a PAGER shell-változóval lehet megadni.
Tipp: Az összes megerősítéskérés kikapcsolható: "Beállítások/Megerősítések".
Tipp: Egyszerű módon elérhetők a gyakran használt könyvtárak: C-\
Tipp: "Anonymous" FTP-zés végezhető ezzel a paranccsal: "cd /#ftp:gépnév.edu".
Tipp: Az FTP be van építve a Midnight Commanderbe: "FTP-kapcsolat" menüpontok.
Tipp: A listázási mód gyorsan váltható a következő billentyűkombinációval: M-t
Tipp: FTP-zésnél felhasználónév is megadható: "cd /#ftp:felhasználó@gépnév.edu".
Tipp: Az RPM-csomagfájlok böngészhetők, ehhez Entert kell nyomni az adott fájlon.
Tipp: Könyvtárak kijelölése a "Kijelölés" ablakban: / jel hozzáfűzésével.
Tipp: Az egérrel való szövegkimásoláshoz szükség lehet a Shift lenyomására.
Tipp: A gyakran látogatott FTP-helyek betehetők a gyorslistába: C-\
Tipp: Hibabejelentéseket a következő címre lehet küldeni: mc-devel@gnome.org
Tipp: A Tab billentyűvel lehet panelt váltani.
Tipp: VFS-funkció: egy Tar-fájlon Entert nyomva megjelenik annak tartalma.
Tipp: A Midnight Commandernek van "man" (kézikönyv) lapja is.
Tipp: Szeretne Lynx-stílusú navigációt? Be lehet állítani az Alapbeállításoknál.
Tipp: A % makrók még a parancssorban is használhatók.
Tipp: Program végrehajtása a kimenetnek a fájlmegjelenítőbe való küldésével: M-!
Tipp: A fájlok listázási módja beállítható; részletek a "man mc" paranccsal.
Tipp: A %D/%T sztring a másik panel kijelölt fájljaival lesz helyettesítve.
Tipp: A sima shell-t szeretné? Használja ezt: C-o (visszatérés MC-be: ugyanígy).
Tipp: A CDPATH változó beállításával egyszerűbbé tehető a "cd" parancsok kiadása.
Tipp: Ha látni szeretné a .* rejtett fájlokat, állítsa be az Alapbeállításoknál.
Tipp: Ha látni szeretné a *~ másolatfájlokat, állítsa be az Alapbeállításoknál.
Tipp: A kiegészítés minden ablak összes beviteli mezőjében működik: M-Tab
Tipp: Lassú terminálokon a -s opció hasznos lehet.
Tipp: Fájlkeresés: műveletek végzése a megtalált fájlokkal: "Listát a panelra".
Tipp: Komplex keresések végzéséhez a "Külső panel-parancs" funkció javasolt.
Tipp: Könyvtárváltás egy parancs begépelése közben: M-c (gyors könyvtárváltás).
Megjegyzés: A shell-parancsok távoli fájlrendszereken nem használhatók.
Tipp: A pufferben levő (például "C-k"-val oda tett) szöveg visszahozása: C-y
Tipp: Ha nem működnek bizonyos billentyűk: "Beállítások/Billentyűk".
Tipp: Egy parancs kimenetének megjelenítése a fájlmegjelenítőben: M-!
Tipp: Az F13 (vagy Shift-F3) a fájlmegjelenítőt "nyers" módban indítja el.
Tipp: Az F4-re használandó szerkesztőt az EDITOR shell-változóval lehet megadni.
Tipp: A külső fájlmegjelenítőt a PAGER shell-változóval lehet megadni.
Tipp: Az összes megerősítéskérés kikapcsolható: "Beállítások/Megerősítések".
Tipp: Egyszerű módon elérhetők a gyakran használt könyvtárak: C-\
Tipp: "Anonymous" FTP-zés végezhető ezzel a paranccsal: "cd /#ftp:gépnév.edu".
Tipp: Az FTP be van építve a Midnight Commanderbe: "FTP-kapcsolat" menüpontok.
Tipp: A listázási mód gyorsan váltható a következő billentyűkombinációval: M-t
Tipp: FTP-zésnél felhasználónév is megadható: "cd /#ftp:felhasználó@gépnév.edu".
Tipp: Az RPM-csomagfájlok böngészhetők, ehhez Entert kell nyomni az adott fájlon.
Tipp: Könyvtárak kijelölése a "Kijelölés" ablakban: / jel hozzáfűzésével.
Tipp: Az egérrel való szövegkimásoláshoz szükség lehet a Shift lenyomására.
Tipp: A gyakran látogatott FTP-helyek betehetők a gyorslistába: C-\

View File

@ -6,23 +6,23 @@ Dritta: devi inserire un carattere speciale? Usa C-q e il carattere.
Dritta: stanco di questi messaggi? Disattivali dal menu Opzioni/Aspetto.
Dritta: selezione directory: inserisci uno slash alla fine della selezione.
Dritta: se al tuo terminale mancano i tasti funzione usa ESC+numero tasto.
Dritta: l'URL del Midnight Commander è: http://www.midnight-commander.org/
Dritta: l'URL del Midnight Commander è: http://www.midnight-commander.org/
Dritta: la home page del Midnight Commander: http://www.midnight-commander.org/
Dritta: prego spedire i bug report a mc-devel@gnome.org
Dritta: tab cambia il pannello corrente.
Dritta: magico VFS; premi invio su un file tar per esaminarne il contenuto.
Dritta: c'è anche un bel manuale.
Dritta: c'è anche un bel manuale.
Dritta: navigazione stile lynx? Impostala in finestra di configurazione.
Dritta: le macro % funzionano anche sulla linea di comando!
Dritta: M-! permette di eseguire programmi e vedere il risultato nel viewer.
Dritta: il formato della lista file è impostabile; "man mc" per i dettagli.
Dritta: il formato della lista file è impostabile; "man mc" per i dettagli.
Dritta: %D/%T espande i file selezionati nella directory opposta.
Dritta: vuoi la tua shell? Premi C-o e torna nuovamente a MC con C-o.
Dritta: impostare la variabile CDPATH può far risparmiare tasti nei comandi cd.
Dritta: impostare la variabile CDPATH può far risparmiare tasti nei comandi cd.
Dritta: se vuoi vedere i tuoi file .* impostalo nella Configurazione.
Dritta: vuoi vedere i tuoi *~ file di backup? Impostalo nella Configurazione.
Dritta: il completamento funziona su tutti gli input. Basta premere M-Tab.
Dritta: con terminali lenti può aiutare la flag -s.
Dritta: con terminali lenti può aiutare la flag -s.
Dritta: trova file: puoi elaborare i file trovati usando il bottone Pannellizza.
Dritta: vuoi fare ricerche complesse? Usa il comando Pannellizza.
Dritta: per cambiare directory mentre batti un comando, usa M-c (cd rapido).
@ -36,7 +36,7 @@ Dritta: puoi specificare il visualizzatore esterno con la variabile shell PAGER.
Dritta: puoi disabilitare tutte le richieste di conferma in Opzioni/Conferme.
Dritta: salta nelle directory usate frequentemente in un colpo con C-\.
Dritta: puoi fare FTP anonimo con mc battendo 'cd /#ftp:macchina.edu'
Dritta: l'FTP è integrato nel Midnight Commander, controlla il menu FTP.
Dritta: l'FTP è integrato nel Midnight Commander, controlla il menu FTP.
Dritta: M-t cambia velocemente il modo listato.
Dritta: puoi dare il nome utente facendo ftp: 'cd /#ftp:utente@macchina.edu'
Dritta: puoi navigare attraverso i file RPM battendo invio su di essi.

View File

@ -1,45 +1,45 @@
Porada: Za pomocą C-x t kopiuje się nazwy zaznaczoych plików do wiersza poleceń.
Porada: Za pomocą C-x p kopiuje się nazwę bieżącej ścieżki do wiersza poleceń.
Porada: Uzupełnianie: M-Tab (lub Esc+Tab). Podwójne wciśnięcie wywołuje listę.
Porada: M-p i M-n udostępnia historię poleceń.
Porada: Cytowanie znaku można uzyskać naciskając Contrl-q i odpowiedni znak.
Porada: Zmęczony poradami? Wyłącz je w menu Opcje|Układ...
Porada: Wybieranie katalogów: dodaj ukośnik na końcu wzorca dopasowania.
Porada: Jeśli w twoim terminalu brak klawiszy funkcyjnych, użyj Esc+numer.
Porada: Za pomocą C-x t kopiuje się nazwy zaznaczoych plików do wiersza poleceń.
Porada: Za pomocą C-x p kopiuje się nazwę bieżącej ścieżki do wiersza poleceń.
Porada: Uzupełnianie: M-Tab (lub Esc+Tab). Podwójne wciśnięcie wywołuje listę.
Porada: M-p i M-n udostępnia historię poleceń.
Porada: Cytowanie znaku można uzyskać naciskając Contrl-q i odpowiedni znak.
Porada: Zmęczony poradami? Wyłącz je w menu Opcje|Układ...
Porada: Wybieranie katalogów: dodaj ukośnik na końcu wzorca dopasowania.
Porada: Jeśli w twoim terminalu brak klawiszy funkcyjnych, użyj Esc+numer.
Porada: Witryna Midnight Commandera jest pod adresem http://www.midnight-commander.org/
Porada: Strona domowa Midnight Commandera pod adresem http://www.midnight-commander.org/
Porada: Opis błędów (w języku angielskim) wysyłaj na mc-devel@gnome.org
Porada: Za pomocą klawisza Tab zmienia się bieżący panel.
Porada: VFS: naciśnij Enter na archiwum tar, aby obejrzeć jego zawartość.
Porada: Na stronę podręcznikową też warto zajrzeć.
Porada: Chcesz się poruszać tak jak w lynksie? Ustaw to w menu Konfiguracja...
Porada: Makra % działają nawet w wierszu poleceń.
Porada: M-! pozwala na podgląd wyjścia uruchamianych programów w przeglądarce.
Porada: Tryb wyświetlania listy plików można dostosowywać: zobacz "man mc".
Porada: Opis błędów (w języku angielskim) wysyłaj na mc-devel@gnome.org
Porada: Za pomocą klawisza Tab zmienia się bieżący panel.
Porada: VFS: naciśnij Enter na archiwum tar, aby obejrzeć jego zawartość.
Porada: Na stronę podręcznikową też warto zajrzeć.
Porada: Chcesz się poruszać tak jak w lynksie? Ustaw to w menu Konfiguracja...
Porada: Makra % działają nawet w wierszu poleceń.
Porada: M-! pozwala na podgląd wyjścia uruchamianych programów w przeglądarce.
Porada: Tryb wyświetlania listy plików można dostosowywać: zobacz "man mc".
Porada: %D/%T oznacza zazanaczone pliki w drugim panelu.
Porada: Dostęp do zwykłej powłoki przez C-o. Powrót do MC przez ponowne C-o.
Porada: Ustawienie zmiennej CDPATH może ci zaoszczędzić pisania.
Porada: Jeśli chcesz zobaczyć pliki .*, zmień ustawienie w menu Konfiguracja...
Porada: Jeśli chcesz zobaczyć pliki .*~, zmień ustawienie w menu Konfiguracja...
Porada: Uzupełnianie działa wszędzie. Po prostu naciśnij M-Tab.
Porada: Jeśli masz powolny terminal, spróbuj użyć opcji -s.
Porada: Znajdź plik: na znalezionych plikach wykonujemy operacje poprzez Filtruj.
Porada: Chcesz użyć złożonego wyszukiwania? Użyj polecenia Filtr zewnętrzny.
Porada: Jeśli chcesz szybciej zmieniać ścieżkę, użyj M-c (szybka zmiana katalogu).
Porada: Polecenia powłoki działają tylko w lokalnym systemie plików.
Porada: Przywróć skasowany tekst za pomocą C-y.
Porada: Niektóre klawisze nie działają? Patrz menu Opcje|Definiuj klawisze...
Porada: Aby obejrzeć wyjście polecenia w przeglądarce użyj M-!
Porada: F13 (lub Shift-F3) wywołuje przeglądarkę w trybie surowym.
Porada: Możesz określić edytor pod F4 przez zmienną powłoki EDITOR.
Porada: Możesz określić zewnętrzną przeglądarkę przez zmienną powłoki PAGER.
Porada: Możesz wyłączyć żądania potwierdzenia przez menu Opcje|Potwierdzanie...
Porada: Przejdź do listy najczęściej używanych katalogów przez C-\.
Porada: Z anonimowego FTP korzystamy pisząc 'cd /#ftp:machine.edu'
Porada: MC ma wbudowaną obsługę FTP; patrz menu Plik, Połączenie FTP...
Porada: M-t przełącza tryby wyświetlania listy plików.
Porada: Użytkownika FTP określamy przez: 'cd /#ftp:user@machine.edu'
Porada: Pakiety RPM przeglądamy naciskając na nich Enter.
Porada: Aby zazanaczyć katalogi w oknie dialogowym zaznaczania dodaj ukośnik.
Porada: Używanie kopiowania i wklejania za pomocą myszy może wymagać Shifta.
Porada: Klawiszem C-\ dopisz do podręcznej listy często odwiedzane zasoby FTP.
Porada: Dostęp do zwykłej powłoki przez C-o. Powrót do MC przez ponowne C-o.
Porada: Ustawienie zmiennej CDPATH może ci zaoszczędzić pisania.
Porada: Jeśli chcesz zobaczyć pliki .*, zmień ustawienie w menu Konfiguracja...
Porada: Jeśli chcesz zobaczyć pliki .*~, zmień ustawienie w menu Konfiguracja...
Porada: Uzupełnianie działa wszędzie. Po prostu naciśnij M-Tab.
Porada: Jeśli masz powolny terminal, spróbuj użyć opcji -s.
Porada: Znajdź plik: na znalezionych plikach wykonujemy operacje poprzez Filtruj.
Porada: Chcesz użyć złożonego wyszukiwania? Użyj polecenia Filtr zewnętrzny.
Porada: Jeśli chcesz szybciej zmieniać ścieżkę, użyj M-c (szybka zmiana katalogu).
Porada: Polecenia powłoki działają tylko w lokalnym systemie plików.
Porada: Przywróć skasowany tekst za pomocą C-y.
Porada: Niektóre klawisze nie działają? Patrz menu Opcje|Definiuj klawisze...
Porada: Aby obejrzeć wyjście polecenia w przeglądarce użyj M-!
Porada: F13 (lub Shift-F3) wywołuje przeglądarkę w trybie surowym.
Porada: Możesz określić edytor pod F4 przez zmienną powłoki EDITOR.
Porada: Możesz określić zewnętrzną przeglądarkę przez zmienną powłoki PAGER.
Porada: Możesz wyłączyć żądania potwierdzenia przez menu Opcje|Potwierdzanie...
Porada: Przejdź do listy najczęściej używanych katalogów przez C-\.
Porada: Z anonimowego FTP korzystamy pisząc 'cd /#ftp:machine.edu'
Porada: MC ma wbudowaną obsługę FTP; patrz menu Plik, Połączenie FTP...
Porada: M-t przełącza tryby wyświetlania listy plików.
Porada: Użytkownika FTP określamy przez: 'cd /#ftp:user@machine.edu'
Porada: Pakiety RPM przeglądamy naciskając na nich Enter.
Porada: Aby zazanaczyć katalogi w oknie dialogowym zaznaczania dodaj ukośnik.
Porada: Używanie kopiowania i wklejania za pomocą myszy może wymagać Shifta.
Porada: Klawiszem C-\ dopisz do podręcznej listy często odwiedzane zasoby FTP.

View File

@ -1,44 +1,44 @@
Совет: Используйте C-x t для копирования помеченных файлов в командную строку.
Совет: Используйте C-x p для копирования текущего пути в командную строку.
Совет: Автодополнение: M-Tab (или Esc+Tab). Для получения списка нажать дважды.
Совет: Используйте M-p и M-n для доступа к истории команд.
Совет: Требуется вставить литерал? Нажмите Control-q и литерал.
Совет: Устали от этих сообщений? Отключите их в меню Настройки/Внешний вид.
Совет: Отметка каталогов: добавьте косую черту в конец соответствующего шаблона.
Совет: Если ваш терминал без функц. клавиш, вам поможет ESC + цифра.
Совет: Домашняя страница Midnight Commander: http://www.midnight-commander.org/
Совет: Пожалуйста, шлите любые сообщения об ошибках на mc-devel@gnome.org
Совет: Tab сменяет текущую панель.
Совет: Удобство ВФС: нажать Enter на файле TAR для получения его содержимого.
Совет: У нас также имеется толковая страница руководства.
Совет: Вы хотите навигацию в стиле lynx? Установите это в диалоге Конфигурация.
Совет: Макросы % работают даже в командной строке.
Совет: M-! позволит вам выполнять программы и видеть вывод в просмотрщике.
Совет: Формат списка файлов может быть изменен; наберите "man mc" для деталей.
Совет: %D/%T expands to the tagged files in the opposite directory.
Совет: Хотите простую оболочку? Нажмите C-o, и снова C-o для возврата в МС.
Совет: Установив переменную CDPATH, вы сбережете усилия при наборе команды cd.
Совет: Вы сможете видеть скрытые файлы .*, установив опцию в меню Конфигурация.
Совет: Хотите видеть резервные файлы .~ - установите опцию в меню Конфигурация.
Совет: Автодополнение работает во всех строках ввода. Просто нажмите M-Tab.
Совет: На медленных терминалах может помочь флаг -s.
Совет: Поиск файла: вы можете работать с найденными файлами при Панелизации.
Совет: Want to do complex searches? Use the External Panelize command.
Совет: Для смены каталога во время набора команды, нажмите M-c (быстрая смена).
Заметка: Команды оболочки не выполняются, если вы не в локальной файл. системе.
Совет: Удаленный текст можно вернуть с помощью C-y.
Совет: Некоторые клавиши не работают? Зайдите в Настройки/Распознавание клавиш.
Совет: Для получения вывода команды в окне просмотра, наберите M-!
Совет: F13 (или Shift-F3) вызывают просмотрщик в режиме необработанных данных.
Совет: Вы можете выбрать редактор для F4 с помощью переменной оболочки EDITOR.
Совет: Внешний просмотрщик можно выбрать с помощью переменной оболочки PAGER.
Совет: Вы можете отменить запросы на подтверждение в Настройки/Подтверждение.
Совет: Переходите к часто используемым каталогам из справочника, набрав C-\.
Совет: Вы можете использовать анонимный FTP с mc набрав 'cd /#ftp:machine.edu'
Совет: FTP встроен в Midnight Commander, меню Панель/FTP-соединение.
Совет: M-t быстро изменяет формат списка панели.
Совет: Вы можете задать имя пользователя в команде: 'cd /#ftp:user@machine.edu'.
Совет: Вы можете просматривать файлы RPM нажав Enter на файле RPM.
Совет: Для отметки каталогов в диалоге выбора, добавьте косую черту.
Совет: Вырезание и вставка с помощью мыши может требовать держать клавишу Shift.
Совет: Храните список часто посещаемых FTP в справочнике каталогов: нажмите C-\.
Совет: Используйте C-x t для копирования помеченных файлов в командную строку.
Совет: Используйте C-x p для копирования текущего пути в командную строку.
Совет: Автодополнение: M-Tab (или Esc+Tab). Для получения списка нажать дважды.
Совет: Используйте M-p и M-n для доступа к истории команд.
Совет: Требуется вставить литерал? Нажмите Control-q и литерал.
Совет: Устали от этих сообщений? Отключите их в меню Настройки/Внешний вид.
Совет: Отметка каталогов: добавьте косую черту в конец соответствующего шаблона.
Совет: Если ваш терминал без функц. клавиш, вам поможет ESC + цифра.
Совет: Домашняя страница Midnight Commander: http://www.midnight-commander.org/
Совет: Пожалуйста, шлите любые сообщения об ошибках на mc-devel@gnome.org
Совет: Tab сменяет текущую панель.
Совет: Удобство ВФС: нажать Enter на файле TAR для получения его содержимого.
Совет: У нас также имеется толковая страница руководства.
Совет: Вы хотите навигацию в стиле lynx? Установите это в диалоге Конфигурация.
Совет: Макросы % работают даже в командной строке.
Совет: M-! позволит вам выполнять программы и видеть вывод в просмотрщике.
Совет: Формат списка файлов может быть изменен; наберите "man mc" для деталей.
Совет: %D/%T expands to the tagged files in the opposite directory.
Совет: Хотите простую оболочку? Нажмите C-o, и снова C-o для возврата в МС.
Совет: Установив переменную CDPATH, вы сбережете усилия при наборе команды cd.
Совет: Вы сможете видеть скрытые файлы .*, установив опцию в меню Конфигурация.
Совет: Хотите видеть резервные файлы .~ - установите опцию в меню Конфигурация.
Совет: Автодополнение работает во всех строках ввода. Просто нажмите M-Tab.
Совет: На медленных терминалах может помочь флаг -s.
Совет: Поиск файла: вы можете работать с найденными файлами при Панелизации.
Совет: Want to do complex searches? Use the External Panelize command.
Совет: Для смены каталога во время набора команды, нажмите M-c (быстрая смена).
Заметка: Команды оболочки не выполняются, если вы не в локальной файл. системе.
Совет: Удаленный текст можно вернуть с помощью C-y.
Совет: Некоторые клавиши не работают? Зайдите в Настройки/Распознавание клавиш.
Совет: Для получения вывода команды в окне просмотра, наберите M-!
Совет: F13 (или Shift-F3) вызывают просмотрщик в режиме необработанных данных.
Совет: Вы можете выбрать редактор для F4 с помощью переменной оболочки EDITOR.
Совет: Внешний просмотрщик можно выбрать с помощью переменной оболочки PAGER.
Совет: Вы можете отменить запросы на подтверждение в Настройки/Подтверждение.
Совет: Переходите к часто используемым каталогам из справочника, набрав C-\.
Совет: Вы можете использовать анонимный FTP с mc набрав 'cd /#ftp:machine.edu'
Совет: FTP встроен в Midnight Commander, меню Панель/FTP-соединение.
Совет: M-t быстро изменяет формат списка панели.
Совет: Вы можете задать имя пользователя в команде: 'cd /#ftp:user@machine.edu'.
Совет: Вы можете просматривать файлы RPM нажав Enter на файле RPM.
Совет: Для отметки каталогов в диалоге выбора, добавьте косую черту.
Совет: Вырезание и вставка с помощью мыши может требовать держать клавишу Shift.
Совет: Храните список часто посещаемых FTP в справочнике каталогов: нажмите C-\.

View File

@ -1,44 +1,44 @@
Савет: Користите C-x t да бисте пренели изабране називе датотека у наредбени ред.
Савет: Користите C-x p да бисте пренели текућу путању у наредбени ред.
Савет: Допуна: користите M-Tab (или Esc+Tab). Притисните ово двапут да бисте добили списак.
Савет: Користите M-p и M-n да бисте добили историју наредби.
Савет: Хоћете да наведете знак? Користите Control-q и дотични знак.
Савет: Сити сте ових порука? Искључите их из менија Избори/Поглед.
Савет: Означавање директоријума: додајте косу црту на крај обрасца за претрагу.
Савет: Ако ваш терминал не поседује функцијске тастере, користите комбинацију ESC+број.
Савет: Домаћа страница ГНУ-овог Поноћног наредника: http://www.midnight-commander.org/
Савет: Молимо да пошаљете пријаве грешака на mc-devel@gnome.org
Савет: Тастер `Tab' мења текуће окно.
Савет: Фазон ВСД-а: куцните `enter' над датотеком врсте tar да бисте прегледали њен садржај.
Савет: Имамо и пристојну страницу упутства.
Савет: Желите ли lynx-олико кретање? Подесите га у дијалогу Подешавања.
Савет: Макрои `%' функционишу чак и у наредбеном реду.
Савет: M-! ће вам омогућити да извршавате програме и прегледате излаз у прегледачу.
Савет: Формат списка датотека се може подесити; извршите `man mc' за детаље.
Савет: %D/%T се замењује списком означених датотека у супротном директоријуму.
Савет: Желите ли вашу обичну љуску? Притисните C-o, а вратите се назад опет преко C-o.
Савет: Постављање променљиве CDPATH вам може уштедети куцање у наредбама `cd'.
Савет: Ако желите да видите ваше датотеке врсте `.*', реците то у дијалогу `Подешавање'.
Савет: Желите ли да видите ваше резервне датотеке (*~)? Поставите ово у дијалогу `Подешавање'.
Савет: Допуна функционише у свим редовима за унос у свим дијалозима. Само притисните M-Tab.
Савет: на спорим терминалима може вам помоћи прекидач -s.
Савет: Тражење датотека: можете радити са нађеним датотекама преко дугмета `Претвори у окно'.
Савет: Желите ли сложене претраге? Користите наредбу `Критеријум попуне окна'.
Савет: Да бисте променили директоријум у сред куцања наредбе, користите M-c (брза пром.дир.).
Пажња: Наредбе љуске неће функционисати на не-локалном систему датотека.
Савет: Васкрсните текст преко C-y.
Савет: Неки од ваших тастера не функционишу? Погледајте Избори/Научи тастере.
Савет: Да бисте погледали излаз наредбе у прегледачу, користите M-!
Савет: F13 (или Shift-F3) покреће прегледач у сировом режиму.
Савет: Можете задати уређивач за F4 преко променљиве љуске EDITOR.
Савет: Можете задати спољашњи уређивач преко променљиве љуске PAGER.
Савет: Можете искључити све захтеве за потврду преко ставке Избори/Потврда.
Савет: Скочите на често коришћене директоријуме једним кораком преко C-\.
Савет: Можете се анонимно пријавити на FTP куцајући `cd /#ftp:machine.edu'
Савет: FTP је уграђен у Поноћног наредника, погледајте мени Лево/Повезивање FTP-а.
Савет: M-t брзо мења режим списка.
Савет: Можете задати корисничко име за ftps: `cd /#ftp:user@machine.edu'
Савет: Можете прегледати датотеке врсте RPM куцнувши `enter' над датотеком врсте `rpm'.
Савет: Да бисте означили директоријуме у дијалогу за избор, додајте косу црту.
Савет: Да бисте исецали и лепили помоћу миша, можда ће бити потребно да држите тастер `shift'
Савет: Укуцајте често посећивана места ftp-а у брзи списак: притисните C-\.
Савет: Користите C-x t да бисте пренели изабране називе датотека у наредбени ред.
Савет: Користите C-x p да бисте пренели текућу путању у наредбени ред.
Савет: Допуна: користите M-Tab (или Esc+Tab). Притисните ово двапут да бисте добили списак.
Савет: Користите M-p и M-n да бисте добили историју наредби.
Савет: Хоћете да наведете знак? Користите Control-q и дотични знак.
Савет: Сити сте ових порука? Искључите их из менија Избори/Поглед.
Савет: Означавање директоријума: додајте косу црту на крај обрасца за претрагу.
Савет: Ако ваш терминал не поседује функцијске тастере, користите комбинацију ESC+број.
Савет: Домаћа страница ГНУ-овог Поноћног наредника: http://www.midnight-commander.org/
Савет: Молимо да пошаљете пријаве грешака на mc-devel@gnome.org
Савет: Тастер `Tab' мења текуће окно.
Савет: Фазон ВСД-а: куцните `enter' над датотеком врсте tar да бисте прегледали њен садржај.
Савет: Имамо и пристојну страницу упутства.
Савет: Желите ли lynx-олико кретање? Подесите га у дијалогу Подешавања.
Савет: Макрои `%' функционишу чак и у наредбеном реду.
Савет: M-! ће вам омогућити да извршавате програме и прегледате излаз у прегледачу.
Савет: Формат списка датотека се може подесити; извршите `man mc' за детаље.
Савет: %D/%T се замењује списком означених датотека у супротном директоријуму.
Савет: Желите ли вашу обичну љуску? Притисните C-o, а вратите се назад опет преко C-o.
Савет: Постављање променљиве CDPATH вам може уштедети куцање у наредбама `cd'.
Савет: Ако желите да видите ваше датотеке врсте `.*', реците то у дијалогу `Подешавање'.
Савет: Желите ли да видите ваше резервне датотеке (*~)? Поставите ово у дијалогу `Подешавање'.
Савет: Допуна функционише у свим редовима за унос у свим дијалозима. Само притисните M-Tab.
Савет: на спорим терминалима може вам помоћи прекидач -s.
Савет: Тражење датотека: можете радити са нађеним датотекама преко дугмета `Претвори у окно'.
Савет: Желите ли сложене претраге? Користите наредбу `Критеријум попуне окна'.
Савет: Да бисте променили директоријум у сред куцања наредбе, користите M-c (брза пром.дир.).
Пажња: Наредбе љуске неће функционисати на не-локалном систему датотека.
Савет: Васкрсните текст преко C-y.
Савет: Неки од ваших тастера не функционишу? Погледајте Избори/Научи тастере.
Савет: Да бисте погледали излаз наредбе у прегледачу, користите M-!
Савет: F13 (или Shift-F3) покреће прегледач у сировом режиму.
Савет: Можете задати уређивач за F4 преко променљиве љуске EDITOR.
Савет: Можете задати спољашњи уређивач преко променљиве љуске PAGER.
Савет: Можете искључити све захтеве за потврду преко ставке Избори/Потврда.
Савет: Скочите на често коришћене директоријуме једним кораком преко C-\.
Савет: Можете се анонимно пријавити на FTP куцајући `cd /#ftp:machine.edu'
Савет: FTP је уграђен у Поноћног наредника, погледајте мени Лево/Повезивање FTP-а.
Савет: M-t брзо мења режим списка.
Савет: Можете задати корисничко име за ftps: `cd /#ftp:user@machine.edu'
Савет: Можете прегледати датотеке врсте RPM куцнувши `enter' над датотеком врсте `rpm'.
Савет: Да бисте означили директоријуме у дијалогу за избор, додајте косу црту.
Савет: Да бисте исецали и лепили помоћу миша, можда ће бити потребно да држите тастер `shift'
Савет: Укуцајте често посећивана места ftp-а у брзи списак: притисните C-\.

View File

@ -1,45 +1,45 @@
Порада: Користуйтесь C-x t для коп╕ювання позначених файл╕в у командний рядок.
Порада: Користуйтесь C-x p для копювання поточного шляху в командний рядок.
Порада: Автодоповнення: M-Tab (Esc+Tab). Для одержання списку натисн╕ть дв╕ч╕.
Порада: Користуйтесь M-p ╕ M-n для доступу до ╕стор╕╖ команд.
Порада: Потр╕бно вставити л╕терал? Натисн╕ть Control-q та л╕терал.
Порада: Набридли ц╕ поради? В╕дключ╕ть ╖х у меню Options|Layout.
Порада: В╕дм╕тка каталог╕в: додайте похилу риску в к╕нець в╕дпов╕дного шаблону.
Порада: Якщо вашому терм╕налу браку╓ функц. клав╕ш, використовуйте ESC+цифра.
Порада: Сайт Midnight Commander в ╤нтернет╕: http://www.midnight-commander.org/
Порада: Домашня сторнка Midnight Commander: http://www.midnight-commander.org/
Порада: Будь ласка, шл╕ть пов╕домлення про помилки на mc-devel@gnome.org
Порада: Tab зм╕ню╓ поточну панель.
Порада: Зручн╕сть ВФС: натисн╕ть Enter на файл╕ TAR для одержання його зм╕сту.
Порада: У нас також ╓ непогана стор╕нка п╕дручника.
Порада: Ви хочете нав╕гац╕ю в стил╕ lynx? Встанов╕ть це в Options|Configuration.
Порада: Макроси % працюють навть у командному рядку.
Порада: M-! дозволить виконати програму ╕ бачити результат у в╕кн╕ перегляду.
Порада: Формат списку файл╕в може бути зм╕нений; набер╕ть "man mc" для деталей.
Порада: %D/%T означа╓ позначен╕ файли на протилежн╕й панел╕.
Порада: Бажа╓те звичайний shell? Натисн╕ть C-o, ╕ знову C-o для повернення в МС.
Порада: Встановивши зм╕нну CDPATH, ви збережете зусилля при набор╕ команди cd.
Порада: Щоб бачити прихован╕ файли .*, встанов╕ть опц╕ю в Options|Configuration.
Порада: Щоб бачити резервн╕ файли .*~, встанов╕ть опц╕ю в Options|Configuration.
Порада: Автодоповнення працюу вс╕х рядках уведення. Просто натисн╕ть M-Tab.
Порада: На пов╕льних терм╕налах може допомогти опц╕я -s.
Порада: Пошук файлу: щоб працювати ╕з знайденими файлами, натисн╕ть Panelize.
Порада: Бажате виконати складний пошук? Скористайтеся Extermal Panelize.
Порада: Для зм╕ни каталогу п╕д час набору команди, натисн╕ть M-c (швидка зм╕на).
Порада: Команди shell не виконуються, якщо ви не в локальн╕й файлов╕й систем╕.
Порада: Вилучений текст можна повернути за допомогою C-u.
Порада: Деяк╕ клав╕ш╕ не працюють? Скористайтесь меню Options|Learn keys.
Порада: Для одержання результату команди у в╕кн╕ перегляду, набер╕ть M-!
Порада: F13 (або Shift-F3) викликають переглядач у режим необроблених даних.
Порада: Ви можете вибрати редактор для F4 за допомогою зм╕нно╖ оболонки EDITOR.
Порада: Зовн╕шн╕й переглядач можна вибрати за допомогою зм╕нно╖ оболонки PAGER.
Порада: Ви можете скасувати запити на пдтвердження в Options|Confirmation.
Порада: Переходьте до часто використовуваних каталогв набравши C-\.
Порада: Анонмний FTP можна виконати з mc набравши 'cd /#ftp:machine.edu'
Порада: FTP вбудований у Midnight Commander, меню Панель/FTP-з'днання.
Порада: M-t швидко зм╕ню╓ формат списку панел╕.
Порада: Ви можете задати м'я користувача ftpfs: 'cd /#ftp:user@machine.edu'.
Порада: Файли RPM можна переглядати натиснувши Enter на файл RPM.
Порада: Для в╕дм╕тки каталог╕в у д╕алоговому в╕кн╕ вибору, додайте похилу риску.
Порада: Для вир╕зання ╕ вставки за допомогою миш╕ тримайте клав╕шу Shift.
Порада: Збер╕гайте часто в╕дв╕дуван╕ FTP у списку каталог╕в: натисн╕ть C-\.
Порада: Користуйтесь C-x t для копіювання позначених файлів у командний рядок.
Порада: Користуйтесь C-x p для копіювання поточного шляху в командний рядок.
Порада: Автодоповнення: M-Tab (Esc+Tab). Для одержання списку натисніть двічі.
Порада: Користуйтесь M-p і M-n для доступу до історії команд.
Порада: Потрібно вставити літерал? Натисніть Control-q та літерал.
Порада: Набридли ці поради? Відключіть їх у меню Options|Layout.
Порада: Відмітка каталогів: додайте похилу риску в кінець відповідного шаблону.
Порада: Якщо вашому терміналу бракує функц. клавіш, використовуйте ESC+цифра.
Порада: Сайт Midnight Commander в Інтернеті: http://www.midnight-commander.org/
Порада: Домашня сторінка Midnight Commander: http://www.midnight-commander.org/
Порада: Будь ласка, шліть повідомлення про помилки на mc-devel@gnome.org
Порада: Tab змінює поточну панель.
Порада: Зручність ВФС: натисніть Enter на файлі TAR для одержання його змісту.
Порада: У нас також є непогана сторінка підручника.
Порада: Ви хочете навігацію в стилі lynx? Встановіть це в Options|Configuration.
Порада: Макроси % працюють навіть у командному рядку.
Порада: M-! дозволить виконати програму і бачити результат у вікні перегляду.
Порада: Формат списку файлів може бути змінений; наберіть "man mc" для деталей.
Порада: %D/%T означає позначені файли на протилежній панелі.
Порада: Бажаєте звичайний shell? Натисніть C-o, і знову C-o для повернення в МС.
Порада: Встановивши змінну CDPATH, ви збережете зусилля при наборі команди cd.
Порада: Щоб бачити приховані файли .*, встановіть опцію в Options|Configuration.
Порада: Щоб бачити резервні файли .*~, встановіть опцію в Options|Configuration.
Порада: Автодоповнення працює у всіх рядках уведення. Просто натисніть M-Tab.
Порада: На повільних терміналах може допомогти опція -s.
Порада: Пошук файлу: щоб працювати із знайденими файлами, натисніть Panelize.
Порада: Бажаєте виконати складний пошук? Скористайтеся Extermal Panelize.
Порада: Для зміни каталогу під час набору команди, натисніть M-c (швидка зміна).
Порада: Команди shell не виконуються, якщо ви не в локальній файловій системі.
Порада: Вилучений текст можна повернути за допомогою C-u.
Порада: Деякі клавіші не працюють? Скористайтесь меню Options|Learn keys.
Порада: Для одержання результату команди у вікні перегляду, наберіть M-!
Порада: F13 (або Shift-F3) викликають переглядач у режимі необроблених даних.
Порада: Ви можете вибрати редактор для F4 за допомогою змінної оболонки EDITOR.
Порада: Зовнішній переглядач можна вибрати за допомогою змінної оболонки PAGER.
Порада: Ви можете скасувати запити на підтвердження в Options|Confirmation.
Порада: Переходьте до часто використовуваних каталогів набравши C-\.
Порада: Анонімний FTP можна виконати з mc набравши 'cd /#ftp:machine.edu'
Порада: FTP вбудований у Midnight Commander, меню Панель/FTP-з'єднання.
Порада: M-t швидко змінює формат списку панелі.
Порада: Ви можете задати ім'я користувача ftpfs: 'cd /#ftp:user@machine.edu'.
Порада: Файли RPM можна переглядати натиснувши Enter на файлі RPM.
Порада: Для відмітки каталогів у діалоговому вікні вибору, додайте похилу риску.
Порада: Для вирізання і вставки за допомогою миші тримайте клавішу Shift.
Порада: Зберігайте часто відвідувані FTP у списку каталогів: натисніть C-\.

View File

@ -1,45 +1,45 @@
提示:使用 C-x t 來複製已選擇的檔案名稱到指令列。
提示:使用 C-x p 來將目前的路徑名稱複製到指令列。
提示:補齊:使用 M-Tab或 Esc+Tab。按兩次看整個列表。
提示:使用 M-p 和 M-n 來存取指令使用紀錄。
提示要使用跳出字元escape cahracter可使用 Control-q 再加上要輸入的字元。
提示:是否對這些訊息厭倦了?可在「選項/配置」選單中關閉它。
提示:選擇目錄:在要找尋的樣式後加入 "/"。
提示:如果你的終端機沒有功能鍵,可以使用 ESC + 數字按鍵。
提示Midnight Commander URLhttp://www.midnight-commander.org/
提示Midnight Commander 網頁http://www.midnight-commander.org/
提示:請送出錯誤報告到 mc-devel@gnome.org
提示Tab 會切換使用中的面板。
提示VFS 的好處:在 tar 檔案上按 enter 可查看它的內容。
提示:我們有一個不錯的手冊頁。
提示:你是否想使用 lynx 的瀏覽方式?請到設定對話窗中設定。
提示:% 巨集在指令列也可使用。
提示M-! 可讓你執行指令並在檢視器看到它的輸出。
提示:你可自訂檔案列表的格式;輸入 "man mc" 可獲得更多細節。
提示:%D/%T 會擴展成另一邊面板中已標記的檔案。
提示:想使用平常的命令殼?可按 C-o再按一次就會返回 MC。
提示:設定 CDPATH 環境變數可以令使用 cd 指令時省卻一點按鍵。
提示:若想看你的 .* 檔案,請到設定對話窗中設定。
提示:想看你的 *~ 備份檔?請到設定對話窗中設定。
提示:補齊可在任何對話窗中的任何輸入欄位中使用。只要按下 M-Tab 就可以了。
提示:在緩慢的終端機裡使用 -s 選項或會有幫助。
提示:搜尋檔案:你可以使用「面板化」選項來處理搜尋到的檔案。
提示:想處理較複雜的檔案搜尋?可使用「外部面板化」指令。
提示:要在輸入指令途早改變目錄,可使用 M-c快速切換目錄
注意:在非本機的檔案系統裡無法使用命令殼指令。
提示:可用 C-y 將已刪除的文字重新顯示出來。
提示:是否有些按鍵無法使用?可看看「選項/認識按鍵」中的按鍵。
提示:要在檢視器裡看到指令的輸出,使用 M-!
提示F13或 Shift-F3會使用原始模式開啟檢視器。
提示:你可以使用環境變數 EDITOR 來指定按下 F4 後開啟的編輯器。
提示:你可以使用環境變數 PAGER 來指定外部的檢視器。
提示:你可以在「選項/確認」裡關閉所有確認的要求。
提示:使用 C-\ 可以即時跳到經常使用的目錄。
提示:你可以在 mc 使用無名氏模式 FTP方法是輸入 'cd /#ftp:machine.edu'
提示FTP 是 Midnight Commander 的內建功能,請檢查「檔案/FTP 連線」選單。
提示M-t 可快速地切換列表模式。
提示:你可以在使用 ftp 時指定使用者名稱,例如:'cd /#ftp:user@machine.edu'
提示:你可以在 rpm 檔上按 enter 來瀏覽 rpm 裡的檔案。
提示:在選擇對話盒中選取目錄時,要在後面加一 "/"。
提示:要使用滑鼠剪貼功能需要你按下 shift 鍵
提示:要將常到的網站輸入常用列表裡:鍵入 C-\。
提示:使用 C-x t 來複製已選擇的檔案名稱到指令列。
提示:使用 C-x p 來將目前的路徑名稱複製到指令列。
提示:補齊:使用 M-Tab或 Esc+Tab。按兩次看整個列表。
提示:使用 M-p 和 M-n 來存取指令使用紀錄。
提示要使用跳出字元escape cahracter可使用 Control-q 再加上要輸入的字元。
提示:是否對這些訊息厭倦了?可在「選項/配置」選單中關閉它。
提示:選擇目錄:在要找尋的樣式後加入 "/"。
提示:如果你的終端機沒有功能鍵,可以使用 ESC + 數字按鍵。
提示Midnight Commander URLhttp://www.midnight-commander.org/
提示Midnight Commander 網頁http://www.midnight-commander.org/
提示:請送出錯誤報告到 mc-devel@gnome.org
提示Tab 會切換使用中的面板。
提示VFS 的好處:在 tar 檔案上按 enter 可查看它的內容。
提示:我們有一個不錯的手冊頁。
提示:你是否想使用 lynx 的瀏覽方式?請到設定對話窗中設定。
提示:% 巨集在指令列也可使用。
提示M-! 可讓你執行指令並在檢視器看到它的輸出。
提示:你可自訂檔案列表的格式;輸入 "man mc" 可獲得更多細節。
提示:%D/%T 會擴展成另一邊面板中已標記的檔案。
提示:想使用平常的命令殼?可按 C-o再按一次就會返回 MC。
提示:設定 CDPATH 環境變數可以令使用 cd 指令時省卻一點按鍵。
提示:若想看你的 .* 檔案,請到設定對話窗中設定。
提示:想看你的 *~ 備份檔?請到設定對話窗中設定。
提示:補齊可在任何對話窗中的任何輸入欄位中使用。只要按下 M-Tab 就可以了。
提示:在緩慢的終端機裡使用 -s 選項或會有幫助。
提示:搜尋檔案:你可以使用「面板化」選項來處理搜尋到的檔案。
提示:想處理較複雜的檔案搜尋?可使用「外部面板化」指令。
提示:要在輸入指令途早改變目錄,可使用 M-c快速切換目錄
注意:在非本機的檔案系統裡無法使用命令殼指令。
提示:可用 C-y 將已刪除的文字重新顯示出來。
提示:是否有些按鍵無法使用?可看看「選項/認識按鍵」中的按鍵。
提示:要在檢視器裡看到指令的輸出,使用 M-!
提示F13或 Shift-F3會使用原始模式開啟檢視器。
提示:你可以使用環境變數 EDITOR 來指定按下 F4 後開啟的編輯器。
提示:你可以使用環境變數 PAGER 來指定外部的檢視器。
提示:你可以在「選項/確認」裡關閉所有確認的要求。
提示:使用 C-\ 可以即時跳到經常使用的目錄。
提示:你可以在 mc 使用無名氏模式 FTP方法是輸入 'cd /#ftp:machine.edu'
提示FTP 是 Midnight Commander 的內建功能,請檢查「檔案/FTP 連線」選單。
提示M-t 可快速地切換列表模式。
提示:你可以在使用 ftp 時指定使用者名稱,例如:'cd /#ftp:user@machine.edu'
提示:你可以在 rpm 檔上按 enter 來瀏覽 rpm 裡的檔案。
提示:在選擇對話盒中選取目錄時,要在後面加一 "/"。
提示:要使用滑鼠剪貼功能需要你按下 shift 鍵
提示:要將常到的網站輸入常用列表裡:鍵入 C-\。

View File

@ -59,7 +59,8 @@ SRCS = achown.c achown.h background.c background.h boxes.c boxes.h \
tree.c tree.h treestore.c treestore.h timefmt.h tty.c tty.h user.c \
user.h util.c util.h utilunix.c view.c view.h vfsdummy.h widget.c \
widget.h win.c win.h wtools.c wtools.h unixcompat.h \
x11conn.h x11conn.c ecs.h ecs.c
x11conn.h x11conn.c ecs.h ecs.c \
strutil.h strutil.c strutilascii.c strutil8bit.c strutilutf8.c
if CHARSET
mc_SOURCES = $(SRCS) $(CHARSET_SRC)

View File

@ -35,6 +35,7 @@
#include "widget.h"
#include "wtools.h" /* For init_box_colors() */
#include "key.h" /* XCTRL and ALT macros */
#include "strutil.h"
#include "dir.h"
#include "panel.h" /* Needed for the externs */
@ -139,9 +140,9 @@ static void set_perm_by_flags (char *s, int f_p)
static void update_permissions (void)
{
set_perm_by_flags (b_att[0]->text, 0);
set_perm_by_flags (b_att[1]->text, 3);
set_perm_by_flags (b_att[2]->text, 6);
set_perm_by_flags (b_att[0]->text.start, 0);
set_perm_by_flags (b_att[1]->text.start, 3);
set_perm_by_flags (b_att[2]->text.start, 6);
}
static mode_t get_perm (char *s, int base)
@ -373,7 +374,7 @@ static void chown_info_update (void)
/* name && mode */
dlg_move (ch_dlg, 3, 8);
tty_printf ("%s", name_trunc (fname, 45));
addstr (str_fit_to_term (fname, 45, J_LEFT_FIT));
dlg_move (ch_dlg, BY + 2, 9);
tty_printf ("%12o", get_mode ());
@ -484,7 +485,7 @@ advanced_chown_callback (Dlg_head *h, dlg_msg_t msg, int parm)
if (f_pos > 2)
break;
flag_pos = f_pos * 3 + i; /* (strchr(ch_perm,parm)-ch_perm); */
if (((WButton *) h->current)->text[(flag_pos % 3)] ==
if (((WButton *) h->current)->text.start[(flag_pos % 3)] ==
'-')
ch_flags[flag_pos] = '+';
else
@ -545,7 +546,7 @@ init_chown_advanced (void)
int dx, cx;
for (i = 0 ; i < n_elem ; i++) {
chown_advanced_but[i].text = _(chown_advanced_but[i].text);
i18n_len += strlen (chown_advanced_but[i].text) + 3;
i18n_len += str_term_width1 (chown_advanced_but[i].text) + 3;
if (DEFPUSH_BUTTON == chown_advanced_but[i].flags)
i18n_len += 2; /* "<>" */
}
@ -554,7 +555,7 @@ init_chown_advanced (void)
/* Reversed order */
for (i = n_elem - 1; i >= 0; i--) {
chown_advanced_but[i].x = cx;
cx += strlen (chown_advanced_but[i].text) + 3 + dx;
cx += str_term_width1 (chown_advanced_but[i].text) + 3 + dx;
}
}
#endif /* ENABLE_NLS */

View File

@ -48,6 +48,7 @@
#include "tree.h"
#include "layout.h" /* for get_nth_panel_name proto */
#include "background.h" /* task_list */
#include "strutil.h"
#ifdef HAVE_CHARSET
#include "charsets.h"
@ -118,7 +119,7 @@ display_callback (struct Dlg_head *h, dlg_msg_t msg, int parm)
}
}
if (tolower (parm) == user_hotkey && dlg_widget_active (user)
if (g_ascii_tolower (parm) == user_hotkey && dlg_widget_active (user)
&& dlg_widget_active (status)) {
my_radio->sel = 3;
dlg_select_widget (my_radio); /* force redraw */
@ -153,23 +154,23 @@ display_init (int radio_sel, char *init_text, int _check_status,
display_title = _(display_title);
for (i = 0; i < LIST_TYPES; i++) {
displays[i] = _(displays[i]);
if ((l = strlen (displays[i])) > maxlen)
if ((l = str_term_width1 (displays[i])) > maxlen)
maxlen = l;
}
i = strlen (ok_button) + 5;
l = strlen (cancel_button) + 3;
i = str_term_width1 (ok_button) + 5;
l = str_term_width1 (cancel_button) + 3;
l = max (i, l);
i = maxlen + l + 16;
if (i > DISPLAY_X)
DISPLAY_X = i;
i = strlen (user_mini_status) + 13;
i = str_term_width1 (user_mini_status) + 13;
if (i > DISPLAY_X)
DISPLAY_X = i;
i = strlen (display_title) + 10;
i = str_term_width1 (display_title) + 10;
if (i > DISPLAY_X)
DISPLAY_X = i;
@ -178,7 +179,7 @@ display_init (int radio_sel, char *init_text, int _check_status,
/* get hotkey of user-defined format string */
cp = strchr (displays[USER_TYPE], '&');
if (cp != NULL && *++cp != '\0')
user_hotkey = tolower ((unsigned char) *cp);
user_hotkey = g_ascii_tolower ((gchar) cp[0]);
i18n_displays_flag = 1;
}
@ -289,20 +290,20 @@ sort_box (sortfn *sort_fn, int *reverse, int *case_sensitive, int *exec_first)
int maxlen = 0;
for (i = SORT_TYPES - 1; i >= 0; i--) {
sort_orders_names[i] = _(sort_orders[i].sort_name);
r = strlen (sort_orders_names[i]);
r = str_term_width1 (sort_orders_names[i]);
if (r > maxlen)
maxlen = r;
}
check_pos = maxlen + 9;
r = strlen (reverse_label) + 4;
i = strlen (case_label) + 4;
r = str_term_width1 (reverse_label) + 4;
i = str_term_width1 (case_label) + 4;
if (i > r)
r = i;
l = strlen (ok_button) + 6;
i = strlen (cancel_button) + 4;
l = str_term_width1 (ok_button) + 6;
i = str_term_width1 (cancel_button) + 4;
if (i > l)
l = i;
@ -311,7 +312,7 @@ sort_box (sortfn *sort_fn, int *reverse, int *case_sensitive, int *exec_first)
if (i > SORT_X)
SORT_X = i;
i = strlen (sort_title) + 6;
i = str_term_width1 (sort_title) + 6;
if (i > SORT_X)
SORT_X = i;
@ -412,7 +413,7 @@ confirm_box (void)
while (i--)
{
conf_widgets [i].text = _(conf_widgets [i].text);
l1 = strlen (conf_widgets [i].text) + 3;
l1 = str_term_width1 (conf_widgets [i].text) + 3;
if (l1 > maxlen)
maxlen = l1;
}
@ -427,8 +428,8 @@ confirm_box (void)
* And this for the case when buttons with some space to the right
* do not fit within 2/6
*/
l1 = strlen (conf_widgets [0].text) + 3;
i = strlen (conf_widgets [1].text) + 5;
l1 = str_term_width1 (conf_widgets [0].text) + 3;
i = str_term_width1 (conf_widgets [1].text) + 5;
if (i > l1)
l1 = i;
@ -501,11 +502,11 @@ display_bits_box (void)
{
display_widgets [i].text = _(display_widgets[i].text);
display_bits_str [i] = _(display_bits_str [i]);
l1 = strlen (display_bits_str [i]);
l1 = str_term_width1 (display_bits_str [i]);
if (l1 > maxlen)
maxlen = l1;
}
l1 = strlen (display_widgets [2].text);
l1 = str_term_width1 (display_widgets [2].text);
if (l1 > maxlen)
maxlen = l1;
@ -513,8 +514,8 @@ display_bits_box (void)
display_bits.xlen = (maxlen + 5) * 6 / 4;
/* See above confirm_box */
l1 = strlen (display_widgets [0].text) + 3;
i = strlen (display_widgets [1].text) + 5;
l1 = str_term_width1 (display_widgets [0].text) + 3;
i = str_term_width1 (display_widgets [1].text) + 5;
if (i > l1)
l1 = i;
@ -609,7 +610,7 @@ init_disp_bits_box (void)
cpname = _("&Select");
add_widget (dbits_dlg,
button_new (4, DISPX - 8 - strlen (cpname), B_USER,
button_new (4, DISPX - 8 - str_term_width1 (cpname), B_USER,
NORMAL_BUTTON, cpname, sel_charset_button));
return dbits_dlg;
@ -820,7 +821,7 @@ cd_dialog (void)
quick_widgets [1].y_divisions =
quick_widgets [0].y_divisions = Quick_input.ylen = 5;
len = strlen (quick_widgets [1].text);
len = str_term_width1 (quick_widgets [1].text);
quick_widgets [0].relative_x =
quick_widgets [1].relative_x + len + 1;
@ -979,7 +980,7 @@ jobs_cmd (void)
{
job_buttons [i].name = _(job_buttons [i].name);
len = strlen (job_buttons [i].name) + 4;
len = str_term_width1 (job_buttons [i].name) + 4;
JOBS_X = max (JOBS_X, startx + len + 3);
job_buttons [i].xpos = startx;
@ -988,7 +989,7 @@ jobs_cmd (void)
/* Last button - Ok a.k.a. Cancel :) */
job_buttons [n_buttons - 1].xpos =
JOBS_X - strlen (job_buttons [n_buttons - 1].name) - 7;
JOBS_X - str_term_width1 (job_buttons [n_buttons - 1].name) - 7;
i18n_flag = 1;
}
@ -1046,7 +1047,7 @@ vfs_smb_get_authinfo (const char *host, const char *share, const char *domain,
while (i--)
{
l1 = strlen (labs [i] = _(labs [i]));
l1 = str_term_width1 (labs [i] = _(labs [i]));
if (l1 > maxlen)
maxlen = l1;
}
@ -1056,7 +1057,7 @@ vfs_smb_get_authinfo (const char *host, const char *share, const char *domain,
for (i = sizeof(buts)/sizeof(buts[0]), l1 = 0; i--; )
{
l1 += strlen (buts [i] = _(buts [i]));
l1 += str_term_width1 (buts [i] = _(buts [i]));
}
l1 += 15;
if (l1 > dialog_x)
@ -1065,7 +1066,7 @@ vfs_smb_get_authinfo (const char *host, const char *share, const char *domain,
ilen = dialog_x - 7 - maxlen; /* for the case of very long buttons :) */
istart = dialog_x - 3 - ilen;
b2 = dialog_x - (strlen(buts[1]) + 6);
b2 = dialog_x - (str_term_width1 (buts[1]) + 6);
i18n_flag = 1;
}

View File

@ -36,6 +36,7 @@
#include "panel.h" /* do_file_mark() */
#include "main.h" /* update_panels() */
#include "chmod.h"
#include "strutil.h"
static int single_set;
@ -296,11 +297,11 @@ void chmod_cmd (void)
}
/* Set the labels */
c_fname = name_trunc (fname, 21);
c_fname = str_trunc (fname, 21);
add_widget (ch_dlg, label_new (FY+2, FX+2, c_fname));
c_fown = name_trunc (get_owner (sf_stat.st_uid), 21);
c_fown = str_trunc (get_owner (sf_stat.st_uid), 21);
add_widget (ch_dlg, label_new (FY+6, FX+2, c_fown));
c_fgrp = name_trunc (get_group (sf_stat.st_gid), 21);
c_fgrp = str_trunc (get_group (sf_stat.st_gid), 21);
add_widget (ch_dlg, label_new (FY+8, FX+2, c_fgrp));
g_snprintf (buffer, sizeof (buffer), "%o", c_stat);
statl = label_new (FY+4, FX+2, buffer);

View File

@ -33,6 +33,7 @@
#include "color.h"
#include "dialog.h"
#include "widget.h"
#include "strutil.h"
/* Needed for the extern declarations of integer parameters */
#include "dir.h"
@ -268,9 +269,9 @@ chown_cmd (void)
if (fe)
listbox_select_entry (l_group, fe);
chown_label (0, name_trunc (fname, 15));
chown_label (1, name_trunc (get_owner (sf_stat.st_uid), 15));
chown_label (2, name_trunc (get_group (sf_stat.st_gid), 15));
chown_label (0, str_trunc (fname, 15));
chown_label (1, str_trunc (get_owner (sf_stat.st_uid), 15));
chown_label (2, str_trunc (get_group (sf_stat.st_gid), 15));
size_trunc_len (buffer, 15, sf_stat.st_size, 0);
chown_label (3, buffer);
chown_label (4, string_perm (sf_stat.st_mode));

View File

@ -62,6 +62,7 @@
#include "profile.h" /* PROFILE_NAME */
#include "execute.h" /* toggle_panels() */
#include "history.h"
#include "strutil.h"
#ifndef MAP_FILE
# define MAP_FILE 0
@ -431,7 +432,7 @@ set_panel_filter (WPanel *p)
{
char *reg_exp;
const char *x;
x = p->filter ? p->filter : easy_patterns ? "*" : ".";
reg_exp = input_dialog_help (_(" Filter "),
@ -916,7 +917,7 @@ do_link (int symbolic_link, const char *fname)
char *dest = NULL, *src = NULL;
if (!symbolic_link) {
src = g_strdup_printf (_("Link %s to:"), name_trunc (fname, 46));
src = g_strdup_printf (_("Link %s to:"), str_trunc (fname, 46));
dest = input_expand_dialog (_(" Link "), src, MC_HISTORY_FM_LINK, "");
if (!dest || !*dest)
goto cleanup;
@ -981,7 +982,7 @@ void edit_symlink_cmd (void)
p = selection (current_panel)->fname;
q = g_strdup_printf (_(" Symlink `%s\' points to: "), name_trunc (p, 32));
q = g_strdup_printf (_(" Symlink `%s\' points to: "), str_trunc (p, 32));
i = readlink (p, buffer, MC_MAXPATHLEN - 1);
if (i > 0) {
@ -1062,11 +1063,13 @@ char *guess_message_value (void)
char *
get_random_hint (int force)
{
char *data, *result, *eol;
char *data, *result = NULL, *eol;
int len;
int start;
static int last_sec;
static struct timeval tv;
str_conv_t conv;
struct str_buffer *buffer;
/* Do not change hints more often than one minute */
gettimeofday (&tv, NULL);
@ -1092,7 +1095,20 @@ get_random_hint (int force)
eol = strchr (&data[start], '\n');
if (eol)
*eol = 0;
result = g_strdup (&data[start]);
/* hint files are stored in utf-8 */
/* try convert hint file from utf-8 to terminal encoding */
conv = str_crt_conv_from ("UTF-8");
if (conv != INVALID_CONV) {
buffer = str_get_buffer ();
if (str_convert (conv, &data[start], buffer) != ESTR_FAILURE) {
result = g_strdup (buffer->data);
}
str_release_buffer (buffer);
str_close_conv (conv);
}
g_free (data);
return result;
}
@ -1369,3 +1385,60 @@ toggle_listing_cmd (void)
set_basic_panel_listing_to (current, (p->list_type + 1) % LIST_TYPES);
}
/* add "#enc:encodning" to end of path */
/* if path end width a previous #enc:, only encoding is changed no additional
* #enc: is appended
* retun new string
*/
static char
*add_encoding_to_path (const char *path, const char *encoding)
{
char *result;
char *semi;
char *slash;
semi = g_strrstr (path, "#enc:");
if (semi != NULL) {
slash = strchr (semi, PATH_SEP);
if (slash != NULL) {
result = g_strconcat (path, "/#enc:", encoding, NULL);
} else {
*semi = 0;
result = g_strconcat (path, "/#enc:", encoding, NULL);
*semi = '#';
}
} else {
result = g_strconcat (path, "/#enc:", encoding, NULL);
}
return result;
}
static void
set_panel_encoding (WPanel *panel)
{
char *encoding;
char *cd_path;
encoding = input_dialog ("Encoding", "Select encoding", NULL, "");
if (encoding) {
cd_path = add_encoding_to_path (panel->cwd, encoding);
if (!do_panel_cd (MENU_PANEL, cd_path, 0))
message (1, MSG_ERROR, _(" Cannot chdir to %s "), cd_path);
g_free (cd_path);
}
}
void
encoding_cmd (void)
{
WPanel *panel;
if (!SELECTED_IS_PANEL)
return;
panel = MENU_PANEL;
set_panel_encoding (panel);
}

View File

@ -57,5 +57,6 @@ void quick_cmd_no_menu (void);
void info_cmd_no_menu (void);
void quick_view_cmd (void);
void toggle_listing_cmd (void);
void encoding_cmd (void);
#endif

View File

@ -40,6 +40,7 @@
#include "main.h"
#include "util.h"
#include "key.h" /* XCTRL and ALT macros */
#include "strutil.h"
typedef char *CompletionFunction (char * text, int state, INPUT_COMPLETE_FLAGS flags);
@ -119,6 +120,8 @@ filename_completion_function (char *text, int state, INPUT_COMPLETE_FLAGS flags)
/* Now that we have some state, we can read the directory. */
while (directory && (entry = mc_readdir (directory))){
if (!str_is_valid_string (entry->d_name)) continue;
/* Special case for no filename.
All entries except "." and ".." match. */
if (!filename_len){
@ -307,20 +310,24 @@ static void fetch_hosts (const char *filename)
{
FILE *file = fopen (filename, "r");
char buffer[256], *name;
register int i, start;
char *start;
char *bi;
if (!file)
return;
while (fgets (buffer, 255, file) != NULL){
/* Skip to first character. */
for (i = 0; buffer[i] && cr_whitespace (buffer[i]); i++);
for (bi = buffer;
bi[0] != '\0' && str_isspace (bi);
str_next_char (&bi));
/* Ignore comments... */
if (buffer[i] == '#')
if (bi[0] == '#')
continue;
/* Handle $include. */
if (!strncmp (buffer + i, "$include ", 9)){
char *includefile = buffer + i + 9;
if (!strncmp (bi, "$include ", 9)){
char *includefile = bi + 9;
char *t;
/* Find start of filename. */
@ -329,8 +336,8 @@ static void fetch_hosts (const char *filename)
t = includefile;
/* Find end of filename. */
while (*t && !cr_whitespace (*t))
t++;
while (t[0] != '\0' && !str_isspace (t))
str_next_char (&t);
*t = '\0';
fetch_hosts (includefile);
@ -338,19 +345,22 @@ static void fetch_hosts (const char *filename)
}
/* Skip IP #s. */
while (buffer[i] && !cr_whitespace (buffer[i]))
i++;
while (bi[0] != '\0' && !str_isspace (bi))
str_next_char (&bi);
/* Get the host names separated by white space. */
while (buffer[i] && buffer[i] != '#'){
while (buffer[i] && cr_whitespace (buffer[i]))
i++;
if (buffer[i] == '#')
while (bi[0] != '\0' && bi[0] != '#'){
while (bi[0] != '\0' && str_isspace (bi))
str_next_char (&bi);
if (bi[0] == '#')
continue;
for (start = i; buffer[i] && !cr_whitespace (buffer[i]); i++);
if (i - start == 0)
continue;
name = g_strndup (buffer + start, i - start);
for (start = bi;
bi[0] != '\0' && !str_isspace (bi);
str_next_char (&bi));
if (bi - start == 0) continue;
name = g_strndup (start, bi - start);
{
char **host_p;
@ -609,19 +619,30 @@ completion_matches (char *text, CompletionFunction entry_function, INPUT_COMPLET
j = i + 1;
while (j < matches + 1)
{
register int c1, c2, si;
char *si, *sj;
char *ni, *nj;
for (si = 0;(c1 = match_list [i][si]) && (c2 = match_list [j][si]); si++)
if (c1 != c2) break;
for (si = match_list[i], sj = match_list[j];
si[0] && sj[0];) {
ni = str_get_next_char (si);
nj = str_get_next_char (sj);
if (!c1 && !match_list [j][si]){ /* Two equal strings */
if (ni - si != nj - sj) break;
if (strncmp (si, sj, ni - si) != 0) break;
si = ni;
sj = nj;
}
if (si[0] == '\0' && sj[0] == '\0'){ /* Two equal strings */
g_free (match_list [j]);
j++;
if (j > matches)
break;
continue; /* Look for a run of equal strings */
} else
if (low > si) low = si;
if (low > si - match_list[i]) low = si - match_list[i];
if (i + 1 != j) /* So there's some gap */
match_list [i + 1] = match_list [j];
i++; j++;
@ -641,21 +662,26 @@ completion_matches (char *text, CompletionFunction entry_function, INPUT_COMPLET
static int
check_is_cd (const char *text, int start, INPUT_COMPLETE_FLAGS flags)
{
const char *p, *q;
char *p, *q;
int test = 0;
SHOW_C_CTX("check_is_cd");
if (!(flags & INPUT_COMPLETE_CD))
return 0;
/* Skip initial spaces */
p = text;
q = text + start;
while (p < q && *p && isspace ((unsigned char) *p))
p++;
p = (char*)text;
q = (char*)text + start;
while (p < q && p[0] != '\0' && str_isspace (p))
str_next_char (&p);
/* Check if the command is "cd" and the cursor is after it */
if (p[0] == 'c' && p[1] == 'd' && isspace ((unsigned char) p[2])
&& (p + 2 < q))
text+= p[0] == 'c';
str_next_char (&p);
text+= p[0] == 'd';
str_next_char (&p);
text+= str_isspace (p);
if (test == 3 && (p < q))
return 1;
return 0;
@ -666,51 +692,42 @@ static char **
try_complete (char *text, int *start, int *end, INPUT_COMPLETE_FLAGS flags)
{
int in_command_position = 0;
char *word, c;
char *word;
char **matches = NULL;
const char *command_separator_chars = ";|&{(`";
char *p = NULL, *q = NULL, *r = NULL;
int is_cd = check_is_cd (text, *start, flags);
char *ti;
SHOW_C_CTX("try_complete");
c = text [*end];
text [*end] = 0;
word = g_strdup (text + *start);
text [*end] = c;
word = g_strndup (text + *start, *end - *start);
/* Determine if this could be a command word. It is if it appears at
the start of the line (ignoring preceding whitespace), or if it
appears after a character that separates commands. And we have to
be in a INPUT_COMPLETE_COMMANDS flagged Input line. */
if (!is_cd && (flags & INPUT_COMPLETE_COMMANDS)){
int i = *start - 1;
for (i = *start - 1; i > -1; i--) {
if (text[i] == ' ' || text[i] == '\t'){
if (i == 0 ) continue;
if (text[i-1] != '\\') {
i--;
break;
}
}
}
if (i < 0)
in_command_position++;
else if (strchr (command_separator_chars, text[i])){
ti = str_get_prev_char (&text[*start]);
while (ti > text && (ti[0] == ' ' || ti[0] == '\t'))
str_prev_char (&ti);
if (ti <= text&& (ti[0] == ' ' || ti[0] == '\t'))
in_command_position++;
else if (strchr (command_separator_chars, ti[0])){
register int this_char, prev_char;
in_command_position++;
if (i){
if (ti > text){
/* Handle the two character tokens `>&', `<&', and `>|'.
We are not in a command position after one of these. */
this_char = text[i];
prev_char = text[i - 1];
this_char = ti[0];
prev_char = str_get_prev_char (ti)[0];
if ((this_char == '&' && (prev_char == '<' || prev_char == '>')) ||
(this_char == '|' && prev_char == '>'))
in_command_position = 0;
else if (i > 0 && text [i-1] == '\\') /* Quoted */
else if (ti > text && str_get_prev_char (ti)[0] == '\\') /* Quoted */
in_command_position = 0;
}
}
@ -723,17 +740,19 @@ try_complete (char *text, int *start, int *end, INPUT_COMPLETE_FLAGS flags)
if (flags & INPUT_COMPLETE_HOSTNAMES)
r = strrchr (word, '@');
if (q && q [1] == '(' && INPUT_COMPLETE_COMMANDS){
if (q > p)
p = q + 1;
q = NULL;
if (q > p)
p = str_get_next_char (q);
q = NULL;
}
/* Command substitution? */
if (p > q && p > r){
SHOW_C_CTX("try_complete:cmd_backq_subst");
matches = completion_matches (p + 1, command_completion_function, flags & (~INPUT_COMPLETE_FILENAMES));
matches = completion_matches (str_get_next_char (p),
command_completion_function,
flags & (~INPUT_COMPLETE_FILENAMES));
if (matches)
*start += p + 1 - word;
*start += str_get_next_char (p) - word;
}
/* Variable name? */
@ -752,7 +771,7 @@ try_complete (char *text, int *start, int *end, INPUT_COMPLETE_FLAGS flags)
if (matches)
*start += r - word;
}
/* Starts with `~' and there is no slash in the word, then
try completing this word as a username. */
if (!matches && *word == '~' && (flags & INPUT_COMPLETE_USERNAMES) && !strchr (word, PATH_SEP))
@ -770,33 +789,18 @@ try_complete (char *text, int *start, int *end, INPUT_COMPLETE_FLAGS flags)
SHOW_C_CTX("try_complete:cmd_subst");
matches = completion_matches (word, command_completion_function, flags & (~INPUT_COMPLETE_FILENAMES));
}
else if (!matches && (flags & INPUT_COMPLETE_FILENAMES)){
if (is_cd)
flags &= ~(INPUT_COMPLETE_FILENAMES | INPUT_COMPLETE_COMMANDS);
SHOW_C_CTX("try_complete:filename_subst_1");
matches = completion_matches (word, filename_completion_function, flags);
if (!matches && is_cd && *word != PATH_SEP && *word != '~'){
char *p, *q = text + *start;
for (p = text; *p && p < q; p++){
if (*p == ' ' || *p == '\t') {
if (p == text) continue;
if (*(p-1) == '\\') {
p--;
break;
}
}
}
if (!strncmp (p, "cd", 2))
for (p += 2; *p && p < q && (*p == ' ' || *p == '\t'); p++){
if (p == text) continue;
if (*(p-1) == '\\') {
p--;
break;
}
}
if (p == q){
if (!matches && is_cd && *word != PATH_SEP && *word != '~'){
char *p, *q = text + *start;
for (p = text; *p && p < q && (*p == ' ' || *p == '\t'); str_next_char (&p));
if (!strncmp (p, "cd", 2))
for (p += 2; *p && p < q && (*p == ' ' || *p == '\t'); str_next_char (&p));
if (p == q){
char * const cdpath_ref = g_strdup (getenv ("CDPATH"));
char *cdpath = cdpath_ref;
char c, *s, *r;
@ -818,11 +822,11 @@ try_complete (char *text, int *start, int *end, INPUT_COMPLETE_FLAGS flags)
g_free (r);
}
*s = c;
cdpath = s + 1;
cdpath = str_get_next_char (s);
}
g_free (cdpath_ref);
}
}
}
}
}
g_free (word);
@ -833,7 +837,7 @@ try_complete (char *text, int *start, int *end, INPUT_COMPLETE_FLAGS flags)
void free_completions (WInput *in)
{
char **p;
if (!in->completions)
return;
for (p=in->completions; *p; p++)
@ -847,49 +851,57 @@ static WInput *input;
static int min_end;
static int start, end;
static int insert_text (WInput *in, char *text, ssize_t len)
static int insert_text (WInput *in, char *text, ssize_t size)
{
len = min (len, (ssize_t) strlen (text)) + start - end;
if (strlen (in->buffer) + len >= (size_t) in->current_max_len){
int buff_len = str_length (in->buffer);
size = min (size, (ssize_t) strlen (text)) + start - end;
if (strlen (in->buffer) + size >= (size_t) in->current_max_size){
/* Expand the buffer */
char *narea = g_realloc (in->buffer, in->current_max_len + len + in->field_len);
char *narea = g_realloc (in->buffer, in->current_max_size
+ size + in->field_width);
if (narea){
in->buffer = narea;
in->current_max_len += len + in->field_len;
in->current_max_size += size + in->field_width;
}
}
if (strlen (in->buffer)+1 < (size_t) in->current_max_len){
if (len > 0){
if (strlen (in->buffer)+1 < (size_t) in->current_max_size){
if (size > 0){
int i = strlen (&in->buffer [end]);
for (; i >= 0; i--)
in->buffer [end + len + i] = in->buffer [end + i];
} else if (len < 0){
char *p = in->buffer + end + len, *q = in->buffer + end;
in->buffer [end + size + i] = in->buffer [end + i];
} else if (size < 0){
char *p = in->buffer + end + size, *q = in->buffer + end;
while (*q)
*(p++) = *(q++);
*p = 0;
}
memcpy (in->buffer + start, text, len - start + end);
in->point += len;
memcpy (in->buffer + start, text, size - start + end);
in->point+= str_length (in->buffer) - buff_len;
update_input (in, 1);
end += len;
end+= size;
}
return len != 0;
return size != 0;
}
static cb_ret_t
query_callback (Dlg_head *h, dlg_msg_t msg, int parm)
{
static char buff[MB_LEN_MAX] = "";
static int bl = 0;
switch (msg) {
case DLG_KEY:
switch (parm) {
case KEY_LEFT:
case KEY_RIGHT:
bl = 0;
h->ret_value = 0;
dlg_stop (h);
return MSG_HANDLED;
case KEY_BACKSPACE:
bl = 0;
if (end == min_end) {
h->ret_value = 0;
dlg_stop (h);
@ -899,13 +911,13 @@ query_callback (Dlg_head *h, dlg_msg_t msg, int parm)
e1 = e = ((WListbox *) (h->current))->list;
do {
if (!strncmp
(input->buffer + start, e1->text,
end - start - 1)) {
listbox_select_entry ((WListbox *) (h->current),
e1);
if (!strncmp (input->buffer + start,
e1->text, end - start - 1)) {
listbox_select_entry ((WListbox *) (h->current), e1);
end = str_get_prev_char (&(input->buffer[end]))
- input->buffer;
handle_char (input, parm);
end--;
send_message (h->current, WIDGET_DRAW, 0);
break;
}
@ -915,7 +927,8 @@ query_callback (Dlg_head *h, dlg_msg_t msg, int parm)
return MSG_HANDLED;
default:
if (parm > 0xff || !is_printable (parm)) {
if (parm < 32 || parm > 256) {
bl = 0;
if (is_in_input_map (input, parm) == 2) {
if (end == min_end)
return MSG_HANDLED;
@ -931,21 +944,43 @@ query_callback (Dlg_head *h, dlg_msg_t msg, int parm)
int low = 4096;
char *last_text = NULL;
buff[bl] = (char) parm;
bl++;
buff[bl] = '\0';
switch (str_is_valid_char (buff, bl)) {
case -1:
bl = 0;
case -2:
return MSG_HANDLED;
}
e1 = e = ((WListbox *) (h->current))->list;
do {
if (!strncmp
(input->buffer + start, e1->text, end - start)) {
if (e1->text[end - start] == parm) {
if (!strncmp (input->buffer + start,
e1->text, end - start)) {
if (strncmp (&e1->text[end - start], buff, bl) == 0) {
if (need_redraw) {
register int c1, c2, si;
char *si, *sl;
char *ni, *nl;
si = &(e1->text[end - start]);
sl = &(last_text[end - start]);
for (; si[0] != '\0' && sl[0] != '\0';) {
ni = str_get_next_char (si);
nl = str_get_next_char (sl);
if (ni - si != nl - sl) break;
if (strncmp (si, sl, ni - si) != 0) break;
si = ni;
sl = nl;
}
if (low > si - &e1->text[start])
low = si - &e1->text[start];
for (si = end - start + 1;
(c1 = last_text[si])
&& (c2 = e1->text[si]); si++)
if (c1 != c2)
break;
if (low > si)
low = si;
last_text = e1->text;
need_redraw = 2;
} else {
@ -966,6 +1001,7 @@ query_callback (Dlg_head *h, dlg_msg_t msg, int parm)
h->ret_value = B_ENTER;
dlg_stop (h);
}
bl = 0;
}
return MSG_HANDLED;
}
@ -982,94 +1018,96 @@ query_callback (Dlg_head *h, dlg_msg_t msg, int parm)
static int
complete_engine (WInput *in, int what_to_do)
{
if (in->completions && in->point != end)
int s;
if (in->completions && (str_offset_to_pos (in->buffer, in->point)) != end)
free_completions (in);
if (!in->completions){
end = in->point;
for (start = end ? end - 1 : 0; start > -1; start--)
if (strchr (" \t;|<>", in->buffer [start])){
if (start > 0 && in->buffer [start-1] == '\\')
continue;
else
break;
}
if (start < end)
start++;
in->completions = try_complete (in->buffer, &start, &end, in->completion_flags);
end = str_offset_to_pos (in->buffer, in->point);
for (s = in->point ? in->point - 1 : 0; s >= 0; s--) {
start = str_offset_to_pos (in->buffer, s);
if (strchr (" \t;|<>", in->buffer [start])) {
if (start < end) start = str_offset_to_pos (in->buffer, s + 1);
/* FIXME: maybe need check '\\' prev char
if (start > 0 && in->buffer [start-1] == '\\')
*/
break;
}
}
in->completions = try_complete (in->buffer, &start, &end, in->completion_flags);
}
if (in->completions){
if (what_to_do & DO_INSERTION || ((what_to_do & DO_QUERY) && !in->completions[1])) {
if (what_to_do & DO_INSERTION || ((what_to_do & DO_QUERY) && !in->completions[1])) {
char * complete = in->completions [0];
if (insert_text (in, complete, strlen (complete))){
if (in->completions [1])
beep ();
if (in->completions [1])
beep ();
else
free_completions (in);
} else
beep ();
}
if ((what_to_do & DO_QUERY) && in->completions && in->completions [1]) {
int maxlen = 0, i, count = 0;
int x, y, w, h;
int start_x, start_y;
char **p, *q;
Dlg_head *query_dlg;
WListbox *query_list;
if ((what_to_do & DO_QUERY) && in->completions && in->completions [1]) {
int maxlen = 0, i, count = 0;
int x, y, w, h;
int start_x, start_y;
char **p, *q;
Dlg_head *query_dlg;
WListbox *query_list;
for (p=in->completions + 1; *p; count++, p++) {
if ((i = strlen (*p)) > maxlen)
maxlen = i;
for (p=in->completions + 1; *p; count++, p++)
if ((i = str_term_width1 (*p)) > maxlen)
maxlen = i;
start_x = in->widget.x;
start_y = in->widget.y;
if (start_y - 2 >= count) {
y = start_y - 2 - count;
h = 2 + count;
} else {
if (start_y >= LINES - start_y - 1) {
y = 0;
h = start_y;
} else {
y = start_y + 1;
h = LINES - start_y - 1;
}
}
start_x = in->widget.x;
start_y = in->widget.y;
if (start_y - 2 >= count) {
y = start_y - 2 - count;
h = 2 + count;
} else {
if (start_y >= LINES - start_y - 1) {
y = 0;
h = start_y;
} else {
y = start_y + 1;
h = LINES - start_y - 1;
}
}
x = start - in->first_shown - 2 + start_x;
w = maxlen + 4;
if (x + w > COLS)
x = COLS - w;
if (x < 0)
x = 0;
if (x + w > COLS)
w = COLS;
input = in;
min_end = end;
x = start - in->term_first_shown - 2 + start_x;
w = maxlen + 4;
if (x + w > COLS)
x = COLS - w;
if (x < 0)
x = 0;
if (x + w > COLS)
w = COLS;
input = in;
min_end = end;
query_height = h;
query_width = w;
query_dlg = create_dlg (y, x, query_height, query_width,
query_dlg = create_dlg (y, x, query_height, query_width,
dialog_colors, query_callback,
"[Completion]", NULL, DLG_COMPACT);
query_list = listbox_new (1, 1, w - 2, h - 2, NULL);
add_widget (query_dlg, query_list);
for (p = in->completions + 1; *p; p++)
listbox_add_item (query_list, 0, 0, *p, NULL);
run_dlg (query_dlg);
q = NULL;
if (query_dlg->ret_value == B_ENTER){
listbox_get_current (query_list, &q, NULL);
if (q)
insert_text (in, q, strlen (q));
}
if (q || end != min_end)
free_completions (in);
i = query_dlg->ret_value; /* B_USER if user wants to start over again */
destroy_dlg (query_dlg);
if (i == B_USER)
return 1;
}
query_list = listbox_new (1, 1, w - 2, h - 2, NULL);
add_widget (query_dlg, query_list);
for (p = in->completions + 1; *p; p++)
listbox_add_item (query_list, 0, 0, *p, NULL);
run_dlg (query_dlg);
q = NULL;
if (query_dlg->ret_value == B_ENTER){
listbox_get_current (query_list, &q, NULL);
if (q)
insert_text (in, q, strlen (q));
}
if (q || end != min_end)
free_completions (in);
i = query_dlg->ret_value; /* B_USER if user wants to start over again */
destroy_dlg (query_dlg);
if (i == B_USER)
return 1;
}
} else
beep ();
beep ();
return 0;
}
@ -1077,6 +1115,8 @@ void complete (WInput *in)
{
int engine_flags;
if (!str_is_valid_string (in->buffer)) return;
if (in->completions)
engine_flags = DO_QUERY;
else

View File

@ -33,6 +33,7 @@
#include "layout.h" /* winch_flag */
#include "execute.h" /* suspend_cmd() */
#include "main.h" /* slow_terminal */
#include "strutil.h"
#define waddc(w,y1,x1,c) move (w->y+y1, w->x+x1); addch (c)
@ -167,8 +168,8 @@ common_dialog_repaint (struct Dlg_head *h)
if (h->title) {
attrset (DLG_HOT_NORMALC (h));
dlg_move (h, space, (h->cols - strlen (h->title)) / 2);
addstr (h->title);
dlg_move (h, space, (h->cols - str_term_width1 (h->title)) / 2);
addstr (str_term_form (h->title));
}
}
@ -590,14 +591,16 @@ dlg_try_hotkey (Dlg_head *h, int d_key)
*/
if (h->current->options & W_IS_INPUT) {
if (d_key < 255 && isalpha (d_key))
/* skip ascii control characters, anything else can valid character in
* some encoding */
if (d_key >= 32 && d_key < 256)
return 0;
}
/* If it's an alt key, send the message */
c = d_key & ~ALT (0);
if (d_key & ALT (0) && c < 255 && isalpha (c))
d_key = tolower (c);
if (d_key & ALT (0) && g_ascii_isalpha (c))
d_key = g_ascii_tolower (c);
handled = 0;
if (h->current->options & W_WANT_HOTKEY)

113
src/dir.c
View File

@ -29,6 +29,7 @@
#include "dir.h"
#include "wtools.h"
#include "treestore.h"
#include "strutil.h"
/* If true show files starting with a dot */
int show_dot_files = 1;
@ -61,50 +62,9 @@ sort_orders_t sort_orders [SORT_TYPES_TOTAL] = {
{ N_("&Inode"), sort_inode },
};
#ifdef HAVE_STRCOLL
/*
* g_strcasecmp() doesn't work well in some locales because it relies on
* the locale-specific toupper(). On the other hand, strcoll() is case
* sensitive in the "C" and "POSIX" locales, unlike other locales.
* Solution: always use strcmp() for case sensitive sort. For case
* insensitive sort use strcoll() if it's case insensitive for ASCII and
* g_strcasecmp() otherwise.
*/
typedef enum {
STRCOLL_NO,
STRCOLL_YES,
STRCOLL_TEST
} strcoll_status;
static int string_sortcomp (const char *str1, const char *str2)
{
static strcoll_status use_strcoll = STRCOLL_TEST;
if (case_sensitive) {
return strcmp (str1, str2);
}
/* Initialize use_strcoll once. */
if (use_strcoll == STRCOLL_TEST) {
/* Only use strcoll() if it considers "B" between "a" and "c". */
if (strcoll ("a", "B") * strcoll ("B", "c") > 0) {
use_strcoll = STRCOLL_YES;
} else {
use_strcoll = STRCOLL_NO;
}
}
if (use_strcoll == STRCOLL_NO)
return g_strcasecmp (str1, str2);
else
return strcoll (str1, str2);
}
#else
#define string_sortcomp(a,b) (case_sensitive ? strcmp (a,b) : g_strcasecmp (a,b))
#endif
int
unsorted (const file_entry *a, const file_entry *b)
unsorted (file_entry *a, file_entry *b)
{
(void) a;
(void) b;
@ -112,28 +72,38 @@ unsorted (const file_entry *a, const file_entry *b)
}
int
sort_name (const file_entry *a, const file_entry *b)
sort_name (file_entry *a, file_entry *b)
{
int ad = MY_ISDIR (a);
int bd = MY_ISDIR (b);
if (ad == bd || mix_all_files)
return string_sortcomp (a->fname, b->fname) * reverse;
return bd-ad;
if (ad == bd || mix_all_files) {
/* create key if does not exist, key will be freed after sorting */
if (a->sort_key == NULL)
a->sort_key = str_create_key_for_filename (a->fname, case_sensitive);
if (b->sort_key == NULL)
b->sort_key = str_create_key_for_filename (b->fname, case_sensitive);
return str_key_collate (a->sort_key, b->sort_key, case_sensitive)
* reverse;
}
return bd - ad;
}
int
sort_ext (const file_entry *a, const file_entry *b)
sort_ext (file_entry *a, file_entry *b)
{
const char *exta, *extb;
int r;
int ad = MY_ISDIR (a);
int bd = MY_ISDIR (b);
if (ad == bd || mix_all_files){
exta = extension (a->fname);
extb = extension (b->fname);
r = string_sortcomp (exta, extb);
if (a->second_sort_key == NULL)
a->second_sort_key = str_create_key (extension (a->fname), case_sensitive);
if (b->second_sort_key == NULL)
b->second_sort_key = str_create_key (extension (b->fname), case_sensitive);
r = str_key_collate (a->second_sort_key, b->second_sort_key, case_sensitive);
if (r)
return r * reverse;
else
@ -143,7 +113,7 @@ sort_ext (const file_entry *a, const file_entry *b)
}
int
sort_time (const file_entry *a, const file_entry *b)
sort_time (file_entry *a, file_entry *b)
{
int ad = MY_ISDIR (a);
int bd = MY_ISDIR (b);
@ -161,7 +131,7 @@ sort_time (const file_entry *a, const file_entry *b)
}
int
sort_ctime (const file_entry *a, const file_entry *b)
sort_ctime (file_entry *a, file_entry *b)
{
int ad = MY_ISDIR (a);
int bd = MY_ISDIR (b);
@ -179,7 +149,7 @@ sort_ctime (const file_entry *a, const file_entry *b)
}
int
sort_atime (const file_entry *a, const file_entry *b)
sort_atime (file_entry *a, file_entry *b)
{
int ad = MY_ISDIR (a);
int bd = MY_ISDIR (b);
@ -197,7 +167,7 @@ sort_atime (const file_entry *a, const file_entry *b)
}
int
sort_inode (const file_entry *a, const file_entry *b)
sort_inode (file_entry *a, file_entry *b)
{
int ad = MY_ISDIR (a);
int bd = MY_ISDIR (b);
@ -209,7 +179,7 @@ sort_inode (const file_entry *a, const file_entry *b)
}
int
sort_size (const file_entry *a, const file_entry *b)
sort_size (file_entry *a, file_entry *b)
{
int ad = MY_ISDIR (a);
int bd = MY_ISDIR (b);
@ -226,6 +196,20 @@ sort_size (const file_entry *a, const file_entry *b)
return sort_name (a, b);
}
/* clear keys, should be call after sorting is finished */
static void
clean_sort_keys (dir_list *list, int start, int count)
{
int i;
for (i = 0; i < count; i++){
str_release_key (list->list [i + start].sort_key, case_sensitive);
list->list [i + start].sort_key = NULL;
str_release_key (list->list [i + start].second_sort_key, case_sensitive);
list->list [i + start].second_sort_key = NULL;
}
}
void
do_sort (dir_list *list, sortfn *sort, int top, int reverse_f, int case_sensitive_f, int exec_first_f)
@ -245,6 +229,8 @@ do_sort (dir_list *list, sortfn *sort, int top, int reverse_f, int case_sensitiv
exec_first = exec_first_f;
qsort (&(list->list) [dot_dot_found],
top + 1 - dot_dot_found, sizeof (file_entry), sort);
clean_sort_keys (list, dot_dot_found, top + 1 - dot_dot_found);
}
void
@ -254,7 +240,7 @@ clean_dir (dir_list *list, int count)
for (i = 0; i < count; i++){
g_free (list->list [i].fname);
list->list [i].fname = 0;
list->list [i].fname = NULL;
}
}
@ -425,6 +411,8 @@ do_load_dir (const char *path, dir_list *list, sortfn *sort, int reverse,
list->list[next_free].f.stale_link = stale_link;
list->list[next_free].f.dir_size_computed = 0;
list->list[next_free].st = st;
list->list[next_free].sort_key = NULL;
list->list[next_free].second_sort_key = NULL;
next_free++;
if (!(next_free % 32))
rotate_dash ();
@ -477,8 +465,11 @@ alloc_dir_copy (int size)
}
dir_copy.list = g_new (file_entry, size);
for (i = 0; i < size; i++)
dir_copy.list [i].fname = 0;
for (i = 0; i < size; i++) {
dir_copy.list [i].fname = NULL;
dir_copy.list [i].sort_key = NULL;
dir_copy.list [i].second_sort_key = NULL;
}
dir_copy.size = size;
}
@ -515,6 +506,8 @@ do_reload_dir (const char *path, dir_list *list, sortfn *sort, int count,
list->list[i].f.dir_size_computed;
dir_copy.list[i].f.link_to_dir = list->list[i].f.link_to_dir;
dir_copy.list[i].f.stale_link = list->list[i].f.stale_link;
dir_copy.list[i].sort_key = NULL;
dir_copy.list[i].second_sort_key = NULL;
if (list->list[i].f.marked) {
g_hash_table_insert (marked_files, dir_copy.list[i].fname,
&dir_copy.list[i]);
@ -576,6 +569,8 @@ do_reload_dir (const char *path, dir_list *list, sortfn *sort, int count,
list->list[next_free].f.stale_link = stale_link;
list->list[next_free].f.dir_size_computed = 0;
list->list[next_free].st = st;
list->list[next_free].sort_key = NULL;
list->list[next_free].second_sort_key = NULL;
next_free++;
if (!(next_free % 16))
rotate_dash ();

View File

@ -6,6 +6,7 @@
#include <sys/stat.h>
/* keys are set only during sorting */
typedef struct {
/* File attributes */
@ -13,6 +14,10 @@ typedef struct {
int fnamelen;
char *fname;
struct stat st;
/* key used for comparing names */
char *sort_key;
/* key used for comparing extensions */
char *second_sort_key;
/* Flags */
struct {
@ -42,14 +47,14 @@ int handle_path (dir_list *list, const char *path, struct stat *buf1,
int next_free, int *link_to_dir, int *stale_link);
/* Sorting functions */
int unsorted (const file_entry *a, const file_entry *b);
int sort_name (const file_entry *a, const file_entry *b);
int sort_ext (const file_entry *a, const file_entry *b);
int sort_time (const file_entry *a, const file_entry *b);
int sort_atime (const file_entry *a, const file_entry *b);
int sort_ctime (const file_entry *a, const file_entry *b);
int sort_size (const file_entry *a, const file_entry *b);
int sort_inode (const file_entry *a, const file_entry *b);
int unsorted (file_entry *a, file_entry *b);
int sort_name (file_entry *a, file_entry *b);
int sort_ext (file_entry *a, file_entry *b);
int sort_time (file_entry *a, file_entry *b);
int sort_atime (file_entry *a, file_entry *b);
int sort_ctime (file_entry *a, file_entry *b);
int sort_size (file_entry *a, file_entry *b);
int sort_inode (file_entry *a, file_entry *b);
/* SORT_TYPES is used to build the nice dialog box entries */
#define SORT_TYPES 8
@ -62,7 +67,7 @@ int sort_inode (const file_entry *a, const file_entry *b);
typedef struct {
const char *sort_name;
int (*sort_fn)(const file_entry *, const file_entry *);
int (*sort_fn)(file_entry *, file_entry *);
} sort_orders_t;
extern sort_orders_t sort_orders [SORT_TYPES_TOTAL];

View File

@ -30,6 +30,7 @@
#include "dialog.h"
#include "wtools.h"
#include "execute.h"
#include "../vfs/vfs.h"
static void
@ -342,7 +343,9 @@ execute_with_vfs_arg (const char *command, const char *filename)
/* Simplest case, this file is local */
if (!filename || vfs_file_is_local (filename)) {
do_execute (command, filename, EXECUTE_INTERNAL);
fn = vfs_canon_and_translate (filename);
do_execute (command, fn, EXECUTE_INTERNAL);
g_free (fn);
return;
}

View File

@ -61,6 +61,7 @@ static void
exec_extension (const char *filename, const char *data, int *move_dir,
int start_line)
{
char *fn;
char *file_name;
int cmd_file_fd;
FILE *cmd_file;
@ -173,10 +174,13 @@ exec_extension (const char *filename, const char *data, int *move_dir,
localmtime = mystat.st_mtime;
text = (*quote_func) (localcopy, 0);
} else {
text = (*quote_func) (filename, 0);
fn = vfs_canon_and_translate (filename);
text = (*quote_func) (fn, 0);
g_free (fn);
}
} else
} else {
text = expand_format (NULL, *data, !is_cd);
}
if (!is_cd)
fputs (text, cmd_file);
else {

View File

@ -63,7 +63,8 @@
#include "widget.h"
#include "wtools.h"
#include "background.h" /* we_are_background */
#include "util.h"
//#include "util.h"
#include "strutil.h"
/* Needed for current_panel, other_panel and WTree */
#include "dir.h"
@ -140,21 +141,30 @@ static FileProgressStatus files_error (const char *format, const char *file1,
enum CaseConvs { NO_CONV = 0, UP_CHAR = 1, LOW_CHAR = 2, UP_SECT =
4, LOW_SECT = 8 };
static char
convert_case (char c, enum CaseConvs *conversion)
static int
convert_case (const char *text, enum CaseConvs *conversion,
char **out, size_t *remain)
{
size_t left;
if (*conversion & UP_CHAR) {
*conversion &= ~UP_CHAR;
return toupper ((unsigned char) c);
return str_toupper (text, out, remain);
} else if (*conversion & LOW_CHAR) {
*conversion &= ~LOW_CHAR;
return tolower ((unsigned char) c);
return str_tolower (text, out, remain);
} else if (*conversion & UP_SECT) {
return toupper ((unsigned char) c);
return str_toupper (text, out, remain);
} else if (*conversion & LOW_SECT) {
return tolower ((unsigned char) c);
} else
return c;
return str_tolower (text, out, remain);
} else {
left = str_cget_next_char (text) - text;
if (left >= *remain) return 0;
memcpy (*out, text, left);
(*out)+= left;
(*remain)-= left;
return 1;
}
}
static FileProgressStatus transform_error = FILE_CONT;
@ -162,58 +172,64 @@ static FileProgressStatus transform_error = FILE_CONT;
static const char *
do_transform_source (FileOpContext *ctx, const char *source)
{
size_t j, k, l, len;
size_t j, len;
const char *fnsource = x_basename (source);
char *fnsource_fixed = g_strdup (fnsource);
int next_reg;
enum CaseConvs case_conv = NO_CONV;
static char fntarget[MC_MAXPATHLEN];
const char *dm;
const char *fn;
char *actual;
size_t remain;
len = strlen (fnsource);
j = re_match (&ctx->rx, fnsource, len, 0, &ctx->regs);
str_fix_string (fnsource_fixed);
len = strlen (fnsource_fixed);
j = re_match (&ctx->rx, fnsource_fixed, len, 0, &ctx->regs);
if (j != len) {
transform_error = FILE_SKIP;
return NULL;
}
for (next_reg = 1, j = 0, k = 0; j < strlen (ctx->dest_mask); j++) {
switch (ctx->dest_mask[j]) {
g_free (fnsource_fixed);
actual = fntarget;
remain = sizeof (fntarget);
dm = ctx->dest_mask;
for (next_reg = 1; dm[0] != '\0' && remain > 1 ; str_cnext_char (&dm)) {
switch (dm[0]) {
case '\\':
if (shell_is_char_escaped (&ctx->dest_mask[j])){
fntarget[k++] = ctx->dest_mask[j++];
fntarget[k++] = ctx->dest_mask[j];
str_cnext_char (&dm);
if (!str_isdigit (dm)) {
/* Backslash followed by non-digit */
switch (dm[0]) {
case 'U':
case_conv |= UP_SECT;
case_conv &= ~LOW_SECT;
break;
case 'u':
case_conv |= UP_CHAR;
break;
case 'L':
case_conv |= LOW_SECT;
case_conv &= ~UP_SECT;
break;
case 'l':
case_conv |= LOW_CHAR;
break;
case 'E':
case_conv = NO_CONV;
break;
default:
/* Backslash as quote mark */
convert_case (dm, &case_conv, &actual, &remain);
}
break;
} else {
j++;
if (!isdigit ((unsigned char) ctx->dest_mask[j])) {
/* Backslash followed by non-digit */
switch (ctx->dest_mask[j]) {
case 'U':
case_conv |= UP_SECT;
case_conv &= ~LOW_SECT;
break;
case 'u':
case_conv |= UP_CHAR;
break;
case 'L':
case_conv |= LOW_SECT;
case_conv &= ~UP_SECT;
break;
case 'l':
case_conv |= LOW_CHAR;
break;
case 'E':
case_conv = NO_CONV;
break;
default:
/* Backslash as quote mark */
fntarget[k++] =
convert_case (ctx->dest_mask[j], &case_conv);
}
break;
} else {
/* Backslash followed by digit */
next_reg = ctx->dest_mask[j] - '0';
/* Fall through */
}
/* Backslash followed by digit */
next_reg = dm[0] - '0';
/* Fall through */
}
case '*':
@ -223,18 +239,28 @@ do_transform_source (FileOpContext *ctx, const char *source)
transform_error = FILE_ABORT;
return NULL;
}
for (l = (size_t) ctx->regs.start[next_reg];
l < (size_t) ctx->regs.end[next_reg]; l++)
fntarget[k++] = convert_case (fnsource[l], &case_conv);
for (fn = fnsource + ctx->regs.start[next_reg];
fn < fnsource + ctx->regs.end[next_reg] && remain > 1; ) {
if (str_is_valid_char (fn, -1) == 1) {
convert_case (fn, &case_conv, &actual, &remain);
str_cnext_char (&fn);
} else {
actual[0] = fn[0];
actual++;
remain--;
fn++;
}
}
next_reg++;
break;
default:
fntarget[k++] = convert_case (ctx->dest_mask[j], &case_conv);
convert_case (dm, &case_conv, &actual, &remain);
break;
}
}
fntarget[k] = 0;
actual[0] = '\0';
return fntarget;
}
@ -1679,13 +1705,13 @@ panel_operate_generate_prompt (const WPanel *panel, const int operation,
*dp = '\0';
if (single_source) {
i = fmd_xlen - strlen (format_string) - 4;
i = fmd_xlen - str_term_width1 (format_string) - 4;
g_snprintf (cmd_buf, sizeof (cmd_buf), format_string,
name_trunc (single_source, i));
str_trunc (single_source, i));
} else {
g_snprintf (cmd_buf, sizeof (cmd_buf), format_string,
panel->marked);
i = strlen (cmd_buf) + 6 - fmd_xlen;
i = str_term_width1 (cmd_buf) + 6 - fmd_xlen;
if (i > 0) {
fmd_xlen += i;
fmd_init_i18n (TRUE); /* to recalculate positions of child widgets */
@ -2116,15 +2142,15 @@ file_error (const char *format, const char *file)
static FileProgressStatus
files_error (const char *format, const char *file1, const char *file2)
{
char nfile1[16];
char nfile2[16];
strcpy (nfile1, path_trunc (file1, 15));
strcpy (nfile2, path_trunc (file2, 15));
char *nfile1 = g_strdup (path_trunc (file1, 15));
char *nfile2 = g_strdup (path_trunc (file2, 15));
g_snprintf (cmd_buf, sizeof (cmd_buf), format, nfile1, nfile2,
unix_error_string (errno));
g_free (nfile1);
g_free (nfile2);
return do_file_error (cmd_buf);
}

View File

@ -65,6 +65,7 @@
#include "filegui.h"
#include "key.h" /* get_event */
#include "util.h" /* strip_password() */
#include "strutil.h"
/* }}} */
@ -423,7 +424,7 @@ file_progress_show_bytes (FileOpContext *ctx, double done, double total)
/* }}} */
#define truncFileString(ui, s) name_trunc (s, ui->eta_extra + 47)
#define truncFileString(ui, s) str_trunc (s, ui->eta_extra + 47)
#define truncFileStringSecure(ui, s) path_trunc (s, ui->eta_extra + 47)
FileProgressStatus
@ -563,8 +564,8 @@ init_replace (FileOpContext *ctx, enum OperationMode mode)
* longest of "Overwrite..." labels
* (assume "Target date..." are short enough)
*/
l1 = max (strlen (rd_widgets[6].text),
strlen (rd_widgets[11].text));
l1 = max (str_term_width1 (rd_widgets[6].text),
str_term_width1 (rd_widgets[11].text));
/* longest of button rows */
i = sizeof (rd_widgets) / sizeof (rd_widgets[0]);
@ -575,7 +576,7 @@ init_replace (FileOpContext *ctx, enum OperationMode mode)
l2 = max (l2, l);
l = 0;
}
l += strlen (rd_widgets[i].text) + 4;
l+= str_term_width1 (rd_widgets[i].text) + 4;
}
}
l2 = max (l2, l); /* last row */
@ -593,12 +594,12 @@ init_replace (FileOpContext *ctx, enum OperationMode mode)
l = l1;
}
rd_widgets[i].xpos = l;
l += strlen (rd_widgets[i].text) + 4;
l+= str_term_width1 (rd_widgets[i].text) + 4;
}
}
/* Abort button is centered */
rd_widgets[1].xpos =
(rd_xlen - strlen (rd_widgets[1].text) - 3) / 2;
(rd_xlen - str_term_width1 (rd_widgets[1].text) - 3) / 2;
}
#endif /* ENABLE_NLS */
@ -616,8 +617,8 @@ init_replace (FileOpContext *ctx, enum OperationMode mode)
ADD_RD_LABEL (ui, 0,
name_trunc (ui->replace_filename,
rd_trunc - strlen (rd_widgets[0].text)), 0);
str_trunc (ui->replace_filename,
rd_trunc - str_term_width1 (rd_widgets[0].text)), 0);
ADD_RD_BUTTON (1);
ADD_RD_BUTTON (2);
@ -804,36 +805,36 @@ fmd_init_i18n (int force)
if (fmd_widgets[i].text[0] != '\0')
fmd_widgets[i].text = _(fmd_widgets[i].text);
len = strlen (fmd_widgets[FMCB11].text)
+ strlen (fmd_widgets[FMCB21].text) + 15;
len = str_term_width1 (fmd_widgets[FMCB11].text)
+ str_term_width1 (fmd_widgets[FMCB21].text) + 15;
fmd_xlen = max (fmd_xlen, len);
len = strlen (fmd_widgets[FMCB12].text)
+ strlen (fmd_widgets[FMCB22].text) + 15;
len = str_term_width1 (fmd_widgets[FMCB12].text)
+ str_term_width1 (fmd_widgets[FMCB22].text) + 15;
fmd_xlen = max (fmd_xlen, len);
len = strlen (fmd_widgets[FMBRGT].text)
+ strlen (fmd_widgets[FMBLFT].text) + 11;
len = str_term_width1 (fmd_widgets[FMBRGT].text)
+ str_term_width1 (fmd_widgets[FMBLFT].text) + 11;
#ifdef FMBMID
len += strlen (fmd_widgets[FMBMID].text) + 6;
len+= str_term_width1 (fmd_widgets[FMBMID].text) + 6;
#endif
fmd_xlen = max (fmd_xlen, len + 4);
len = (fmd_xlen - (len + 6)) / 2;
i = fmd_widgets[FMBLFT].relative_x = len + 3;
i += strlen (fmd_widgets[FMBLFT].text) + 8;
i+= str_term_width1 (fmd_widgets[FMBLFT].text) + 8;
#ifdef FMBMID
fmd_widgets[FMBMID].relative_x = i;
i += strlen (fmd_widgets[FMBMID].text) + 6;
i+= str_term_width1 (fmd_widgets[FMBMID].text) + 6;
#endif
fmd_widgets[FMBRGT].relative_x = i;
#define chkbox_xpos(i) \
fmd_widgets [i].relative_x = fmd_xlen - strlen (fmd_widgets [i].text) - 6
fmd_widgets [i].relative_x = fmd_xlen - str_term_width1 (fmd_widgets [i].text) - 6
chkbox_xpos (FMCB0);
chkbox_xpos (FMCB21);

View File

@ -33,6 +33,7 @@
#include "color.h"
#include "setup.h"
#include "find.h"
#include "strutil.h"
/* Dialog manager and widgets */
#include "dialog.h"
@ -221,7 +222,7 @@ find_parameters (char **start_dir, char **pattern, char **content)
int l1, maxlen = 0;
while (i--) {
l1 = strlen (labs[i] = _(labs[i]));
l1 = str_term_width1 (labs[i] = _(labs[i]));
if (l1 > maxlen)
maxlen = l1;
}
@ -230,7 +231,7 @@ find_parameters (char **start_dir, char **pattern, char **content)
FIND_X = i;
for (i = sizeof (buts) / sizeof (buts[0]), l1 = 0; i--;) {
l1 += strlen (buts[i] = _(buts[i]));
l1 += str_term_width1 (buts[i] = _(buts[i]));
}
l1 += 21;
if (l1 > FIND_X)
@ -239,8 +240,8 @@ find_parameters (char **start_dir, char **pattern, char **content)
ilen = FIND_X - 7 - maxlen; /* for the case of very long buttons :) */
istart = FIND_X - 3 - ilen;
b1 = b0 + strlen (buts[0]) + 7;
b2 = FIND_X - (strlen (buts[2]) + 6);
b1 = b0 + str_term_width1 (buts[0]) + 7;
b2 = FIND_X - (str_term_width1 (buts[2]) + 6);
i18n_flag = 1;
case_label = _(case_label);
@ -529,7 +530,7 @@ search_content (Dlg_head *h, const char *directory, const char *filename)
if (file_fd == -1)
return 0;
g_snprintf (buffer, sizeof (buffer), _("Grepping in %s"), name_trunc (filename, FIND2_X_USE));
g_snprintf (buffer, sizeof (buffer), _("Grepping in %s"), str_trunc (filename, FIND2_X_USE));
status_update (buffer);
mc_refresh ();
@ -544,8 +545,6 @@ search_content (Dlg_head *h, const char *directory, const char *filename)
int has_newline;
char *p;
int found = 0;
typedef const char * (*search_fn) (const char *, const char *);
search_fn search_func;
if (resuming) {
/* We've been previously suspended, start from the previous position */
@ -554,8 +553,6 @@ search_content (Dlg_head *h, const char *directory, const char *filename)
pos = last_pos;
}
search_func = (case_sensitive) ? cstrstr : cstrcasestr;
while ((p = get_line_at (file_fd, buffer, &pos, &n_read, sizeof (buffer), &has_newline)) && (ret_val == 0)){
if (found == 0){ /* Search in binary line once */
if (find_regex_flag) {
@ -566,7 +563,8 @@ search_content (Dlg_head *h, const char *directory, const char *filename)
found = 1;
}
} else {
if (search_func (p, content_pattern) != NULL) {
// str_case_search_first do not accept invalid strings
if (str_is_valid_string (p) && str_search_first (p, content_pattern, case_sensitive) != NULL) {
char *match = g_strdup_printf("%d:%s", line, filename);
find_add_match (h, directory, match);
found = TRUE;
@ -666,7 +664,7 @@ do_search (struct Dlg_head *h)
char buffer [BUF_SMALL];
g_snprintf (buffer, sizeof (buffer), _("Searching %s"),
name_trunc (directory, FIND2_X_USE));
str_trunc (directory, FIND2_X_USE));
status_update (buffer);
}
/* mc_stat should not be called after mc_opendir
@ -683,11 +681,17 @@ do_search (struct Dlg_head *h)
dirp = mc_opendir (directory);
} /* while (!dirp) */
dp = mc_readdir (dirp);
/* skip invalid filenames */
while (dp != NULL && !str_is_valid_string (dp->d_name))
dp = mc_readdir (dirp);
} /* while (!dp) */
if (strcmp (dp->d_name, ".") == 0 ||
strcmp (dp->d_name, "..") == 0){
dp = mc_readdir (dirp);
/* skip invalid filenames */
while (dp != NULL && !str_is_valid_string (dp->d_name))
dp = mc_readdir (dirp);
return 1;
}
@ -713,6 +717,9 @@ do_search (struct Dlg_head *h)
}
dp = mc_readdir (dirp);
/* skip invalid filenames */
while (dp != NULL && !str_is_valid_string (dp->d_name))
dp = mc_readdir (dirp);
/* Displays the nice dot */
count++;
@ -866,7 +873,7 @@ setup_gui (void)
if (!i18n_flag) {
register int i = sizeof (fbuts) / sizeof (fbuts[0]);
while (i--)
fbuts[i].len = strlen (fbuts[i].text = _(fbuts[i].text)) + 3;
fbuts[i].len = str_term_width1 (fbuts[i].text = _(fbuts[i].text)) + 3;
fbuts[2].len += 2; /* DEFPUSH_BUTTON */
i18n_flag = 1;
}
@ -969,7 +976,9 @@ find_file (char *start_dir, char *pattern, char *content, char **dirname,
/* FIXME: Need to cleanup this, this ought to be passed non-globaly */
find_pattern = pattern;
content_pattern = content;
content_pattern = (content != NULL && str_is_valid_string (content))
? str_create_search_needle (content, case_sensitive)
: NULL;
init_find_vars ();
push_directory (start_dir);
@ -1038,6 +1047,8 @@ find_file (char *start_dir, char *pattern, char *content, char **dirname,
list->list[next_free].f.stale_link = stale_link;
list->list[next_free].f.dir_size_computed = 0;
list->list[next_free].st = st;
list->list[next_free].sort_key = NULL;
list->list[next_free].second_sort_key = NULL;
next_free++;
if (!(next_free & 15))
rotate_dash ();
@ -1059,6 +1070,7 @@ find_file (char *start_dir, char *pattern, char *content, char **dirname,
}
}
if (content_pattern != NULL) str_release_search_needle (content_pattern, case_sensitive);
kill_gui ();
do_search (0); /* force do_search to release resources */
g_free (old_dir);

View File

@ -58,6 +58,7 @@
#include "dialog.h" /* For Dlg_head */
#include "widget.h" /* For Widget */
#include "wtools.h" /* For common_dialog_repaint() */
#include "strutil.h"
#define MAXLINKNAME 80
#define HISTORY_SIZE 20
@ -68,7 +69,13 @@
#define STRING_LINK_END "\03"
#define STRING_NODE_END "\04"
static char *data; /* Pointer to the loaded data file */
/* every help file is supposed to be in utf-8 and is translated to terminal
* encoding */
/* buffer for translation */
static struct str_buffer *translated_data = NULL;
/* point into translated_data->data or in NULL,
* if help file could not be converted */
static char *data;
static int help_lines; /* Lines in help viewer */
static int history_ptr; /* For the history queue */
static const char *main_node; /* The main node */
@ -112,7 +119,7 @@ search_string (const char *start, const char *text)
while (*d){
if (*d == '\n')
*d = ' ';
d++;
str_next_char (&d);
}
/* Do search */
for (d = local_text; *e; e++){
@ -173,7 +180,9 @@ static const char *move_forward2 (const char *c, int lines)
int line;
currentpoint = c;
for (line = 0, p = currentpoint; *p && *p != CHAR_NODE_END; p++){
for (line = 0, p = currentpoint; *p && *p != CHAR_NODE_END;
str_cnext_char (&p)){
if (line == lines)
return currentpoint = p;
if (*p == '\n')
@ -188,12 +197,14 @@ static const char *move_backward2 (const char *c, int lines)
int line;
currentpoint = c;
for (line = 0, p = currentpoint; *p && p >= data; p--){
for (line = 0, p = currentpoint; *p && p >= data;
str_cprev_char (&p)) {
if (*p == CHAR_NODE_END)
{
/* We reached the beginning of the node */
/* Skip the node headers */
while (*p != ']') p++;
while (*p != ']') str_cnext_char (&p);
return currentpoint = p + 2; /* Skip the newline following the start of the node */
}
if (*(p - 1) == '\n')
@ -333,12 +344,13 @@ static void clear_link_areas (void)
static void help_show (Dlg_head *h, const char *paint_start)
{
const char *p;
int col, line, c;
const char *p, *n;
int col, line, c, w;
int painting = 1;
int acs; /* Flag: Alternate character set active? */
int repeat_paint;
int active_col, active_line;/* Active link position */
static char buff[MB_LEN_MAX + 1];
attrset (HELP_NORMAL_COLOR);
do {
@ -349,8 +361,15 @@ static void help_show (Dlg_head *h, const char *paint_start)
if (selected_item < paint_start)
selected_item = NULL;
for (p = paint_start; *p && *p != CHAR_NODE_END && line < help_lines; p++) {
c = (unsigned char)*p;
p = paint_start;
n = paint_start;
while (n[0] != '\0' && n[0] != CHAR_NODE_END && line < help_lines) {
p = n;
n = str_cget_next_char (p);
memcpy (buff, p, n - p);
buff[n - p] = '\0';
c = (unsigned char) buff[0];
switch (c){
case CHAR_LINK_START:
if (selected_item == NULL)
@ -383,7 +402,7 @@ static void help_show (Dlg_head *h, const char *paint_start)
case CHAR_VERSION:
dlg_move (h, line+2, col+2);
addstr (VERSION);
col += strlen (VERSION);
col += str_term_width1 (VERSION);
break;
case CHAR_FONT_BOLD:
attrset (HELP_BOLD_COLOR);
@ -399,12 +418,13 @@ static void help_show (Dlg_head *h, const char *paint_start)
col = 0;
break;
case '\t':
col = (col/8 + 1) * 8;
col = (col / 8 + 1) * 8;
break;
default:
if (!painting)
continue;
if (col > HELP_WINDOW_WIDTH-1)
w = str_term_width1 (buff);
if (col + w > HELP_WINDOW_WIDTH)
continue;
dlg_move (h, line+2, col+2);
@ -417,9 +437,10 @@ static void help_show (Dlg_head *h, const char *paint_start)
#else
SLsmg_draw_object (h->y + line + 2, h->x + col + 2, c);
#endif
} else
addch (c);
col++;
} else {
addstr (buff);
}
col+= w;
break;
}
}
@ -752,7 +773,28 @@ static void
interactive_display_finish (void)
{
clear_link_areas ();
g_free (data);
}
/* translate help file into terminal encoding
* translated_data is initialized */
static void
translate_file (char *filedata)
{
str_conv_t conv;
if (translated_data == NULL) translated_data = str_get_buffer ();
str_reset_buffer (translated_data);
conv = str_crt_conv_from ("UTF-8");
if (conv != INVALID_CONV) {
if (str_convert (conv, filedata, translated_data) != ESTR_FAILURE) {
data = translated_data->data;
} else {
data = NULL;
}
str_close_conv (conv);
}
}
void
@ -761,11 +803,12 @@ interactive_display (const char *filename, const char *node)
WButtonBar *help_bar;
Widget *md;
char *hlpfile = NULL;
char *filedata;
if (filename)
data = load_file (filename);
filedata = load_file (filename);
else
data = load_mc_home_file ("mc.hlp", &hlpfile);
filedata = load_mc_home_file ("mc.hlp", &hlpfile);
if (data == NULL) {
message (D_ERROR, MSG_ERROR, _(" Cannot open file %s \n %s "), filename ? filename : hlpfile,
@ -775,6 +818,13 @@ interactive_display (const char *filename, const char *node)
if (!filename)
g_free (hlpfile);
if (filedata == NULL)
return;
translate_file (filedata);
g_free (filedata);
if (!data)
return;

View File

@ -51,6 +51,7 @@
#include "command.h" /* cmdline */
#include "glibcompat.h" /* g_strlcpy for glib < 2.0 */
#include "history.h"
#include "strutil.h"
#define UX 5
#define UY 2
@ -189,15 +190,15 @@ update_path_name (void)
}
if (!hotlist_state.moving)
label_set_text (pname,
name_trunc (text, dlg->cols - (UX * 2 + 4)));
str_trunc (text, dlg->cols - (UX * 2 + 4)));
p = g_strconcat (" ", current_group->label, " ", (char *) NULL);
if (!hotlist_state.moving)
label_set_text (pname_group,
name_trunc (p, dlg->cols - (UX * 2 + 4)));
str_trunc (p, dlg->cols - (UX * 2 + 4)));
else
label_set_text (movelist_group,
name_trunc (p, dlg->cols - (UX * 2 + 4)));
str_trunc (p, dlg->cols - (UX * 2 + 4)));
g_free (p);
dlg_redraw (dlg);
@ -217,23 +218,20 @@ do { \
static void fill_listbox (void)
{
struct hotlist *current = current_group->head;
static char *buf;
static int buflen;
struct str_buffer *buff;
if (!buf)
buf = g_malloc (buflen = 1024);
buf[0] = '\0';
buff = str_get_buffer ();
while (current){
switch (current->type) {
case HL_TYPE_GROUP:
{
CHECK_BUFFER;
strcat (strcat (buf, "->"), current->label);
str_insert_string ("->", buff);
str_insert_string (current->label, buff);
if (hotlist_state.moving)
listbox_add_item (l_movelist, 0, 0, buf, current);
listbox_add_item (l_movelist, 0, 0, buff->data, current);
else
listbox_add_item (l_hotlist, 0, 0, buf, current);
listbox_add_item (l_hotlist, 0, 0, buff->data, current);
}
break;
case HL_TYPE_DOTDOT:
@ -248,9 +246,9 @@ static void fill_listbox (void)
}
current = current->next;
}
}
#undef CHECK_BUFFER
str_release_buffer (buff);
}
static void
unlink_entry (struct hotlist *entry)
@ -564,7 +562,7 @@ init_i18n_stuff(int list_type, int cols)
row = hotlist_but [i].y;
++count [row];
len [row] += strlen (hotlist_but [i].text) + 5;
len [row] += str_term_width1 (hotlist_but [i].text) + 5;
if (hotlist_but [i].flags == DEFPUSH_BUTTON)
len [row] += 2;
}
@ -589,12 +587,12 @@ init_i18n_stuff(int list_type, int cols)
/* not first int the row */
if (!strcmp (hotlist_but [i].text, cancel_but))
hotlist_but [i].x =
cols - strlen (hotlist_but [i].text) - 13;
cols - str_term_width1 (hotlist_but [i].text) - 13;
else
hotlist_but [i].x = cur_x [row];
}
cur_x [row] += strlen (hotlist_but [i].text) + 2
cur_x [row] += str_term_width1 (hotlist_but [i].text) + 2
+ (hotlist_but [i].flags == DEFPUSH_BUTTON ? 5 : 3);
}
}
@ -835,7 +833,7 @@ static void add_widgets_i18n(QuickWidget* qw, int len)
for (i = 0; i < 3; i++)
{
qw [i].text = _(qw [i].text);
l[i] = strlen (qw [i].text) + 3;
l[i] = str_term_width1 (qw [i].text) + 3;
}
space = (len - 4 - l[0] - l[1] - l[2]) / 4;
@ -884,7 +882,7 @@ add_new_entry_input (const char *header, const char *text1, const char *text2,
msglen(text1, &lines1, &cols1);
msglen(text2, &lines2, &cols2);
len = max ((int) strlen (header), cols1);
len = max (str_term_width1 (header), cols1);
len = max (len, cols2) + 4;
len = max (len, 64);
@ -980,7 +978,7 @@ add_new_group_input (const char *header, const char *label, char **result)
#endif /* ENABLE_NLS */
msglen (label, &lines, &cols);
len = max ((int) strlen (header), cols) + 4;
len = max (str_term_width1 (header), cols) + 4;
len = max (len, 64);
#ifdef ENABLE_NLS
@ -1036,7 +1034,7 @@ void add2hotlist_cmd (void)
{
char *prompt, *label;
const char *cp = _("Label for \"%s\":");
int l = strlen (cp);
int l = str_term_width1 (cp);
char *label_string = g_strdup (current_panel->cwd);
strip_password (label_string, 1);
@ -1083,7 +1081,7 @@ static void remove_from_hotlist (struct hotlist *entry)
int result;
title = g_strconcat (_(" Remove: "),
name_trunc (entry->label, 30),
str_trunc (entry->label, 30),
" ",
NULL);
@ -1105,7 +1103,7 @@ static void remove_from_hotlist (struct hotlist *entry)
int result;
header = g_strconcat (_(" Remove: "),
name_trunc (entry->label, 30),
str_trunc (entry->label, 30),
" ",
NULL);
result = query_dialog (header, _("\n Group not empty.\n Remove it?"),
@ -1205,9 +1203,7 @@ load_group (struct hotlist *grp)
#define TKN_EOF 126
#define TKN_UNKNOWN 127
static char *tkn_buf;
static int tkn_buf_length;
static int tkn_length;
static struct str_buffer *tkn_buf = NULL;
static char *hotlist_file_name;
static FILE *hotlist_file;
@ -1217,7 +1213,7 @@ static int hot_skip_blanks (void)
{
int c;
while ((c = getc (hotlist_file)) != EOF && c != '\n' && isspace (c))
while ((c = getc (hotlist_file)) != EOF && c != '\n' && g_ascii_isspace (c))
;
return c;
@ -1226,15 +1222,10 @@ static int hot_skip_blanks (void)
static int hot_next_token (void)
{
int c;
size_t l;
#define CHECK_BUF() \
do { \
if (tkn_length == tkn_buf_length) \
tkn_buf = tkn_buf ? ( g_realloc (tkn_buf, tkn_buf_length += 1024)) \
: ( g_malloc (tkn_buf_length = 1024)); \
} while (0)
tkn_length = 0;
if (tkn_buf == NULL) tkn_buf = str_get_buffer ();
str_reset_buffer (tkn_buf);
again:
c = hot_skip_blanks ();
@ -1247,15 +1238,8 @@ again:
break;
case '#':
while ((c = getc (hotlist_file)) != EOF && c != '\n') {
if (c == EOF)
return TKN_EOF;
if (c != '\n') {
CHECK_BUF();
tkn_buf[tkn_length++] = c == '\n' ? ' ' : c;
str_insert_char (c, tkn_buf);
}
}
CHECK_BUF();
tkn_buf[tkn_length] = '\0';
return TKN_COMMENT;
break;
case '"':
@ -1263,13 +1247,10 @@ again:
if (c == '\\')
if ((c = getc (hotlist_file)) == EOF)
return TKN_EOF;
CHECK_BUF();
tkn_buf[tkn_length++] = c == '\n' ? ' ' : c;
str_insert_char (c == '\n' ? ' ' : c, tkn_buf);
}
if (c == EOF)
return TKN_EOF;
CHECK_BUF();
tkn_buf[tkn_length] = '\0';
return TKN_STRING;
break;
case '\\':
@ -1282,20 +1263,19 @@ again:
default:
do {
CHECK_BUF();
tkn_buf[tkn_length++] = toupper(c);
} while ((c = fgetc (hotlist_file)) != EOF && isalnum (c));
str_insert_char (g_ascii_toupper (c), tkn_buf);
} while ((c = fgetc (hotlist_file)) != EOF &&
(g_ascii_isalnum (c) || !isascii (c)));
if (c != EOF)
ungetc (c, hotlist_file);
CHECK_BUF();
tkn_buf[tkn_length] = '\0';
if (strncmp (tkn_buf, "GROUP", tkn_length) == 0)
l = tkn_buf->size - tkn_buf->remain;
if (strncmp (tkn_buf->data, "GROUP", l) == 0)
return TKN_GROUP;
else if (strncmp (tkn_buf, "ENTRY", tkn_length) == 0)
else if (strncmp (tkn_buf->data, "ENTRY", l) == 0)
return TKN_ENTRY;
else if (strncmp (tkn_buf, "ENDGROUP", tkn_length) == 0)
else if (strncmp (tkn_buf->data, "ENDGROUP", l) == 0)
return TKN_ENDGROUP;
else if (strncmp (tkn_buf, "URL", tkn_length) == 0)
else if (strncmp (tkn_buf->data, "URL", l) == 0)
return TKN_URL;
else
return TKN_UNKNOWN;
@ -1330,22 +1310,22 @@ hot_load_group (struct hotlist * grp)
switch (tkn) {
case TKN_GROUP:
CHECK_TOKEN(TKN_STRING);
new_grp = add2hotlist (g_strdup (tkn_buf), 0, HL_TYPE_GROUP, 0);
new_grp = add2hotlist (g_strdup (tkn_buf->data), 0, HL_TYPE_GROUP, 0);
SKIP_TO_EOL;
hot_load_group (new_grp);
current_group = grp;
break;
case TKN_ENTRY:
CHECK_TOKEN(TKN_STRING);
label = g_strdup (tkn_buf);
label = g_strdup (tkn_buf->data);
CHECK_TOKEN(TKN_URL);
CHECK_TOKEN(TKN_STRING);
url = g_strdup (tkn_buf);
url = g_strdup (tkn_buf->data);
add2hotlist (label, url, HL_TYPE_ENTRY, 0);
SKIP_TO_EOL;
break;
case TKN_COMMENT:
label = g_strdup (tkn_buf);
label = g_strdup (tkn_buf->data);
add2hotlist (label, 0, HL_TYPE_COMMENT, 0);
break;
case TKN_EOF:
@ -1378,22 +1358,22 @@ hot_load_file (struct hotlist * grp)
switch (tkn) {
case TKN_GROUP:
CHECK_TOKEN(TKN_STRING);
new_grp = add2hotlist (g_strdup (tkn_buf), 0, HL_TYPE_GROUP, 0);
new_grp = add2hotlist (g_strdup (tkn_buf->data), 0, HL_TYPE_GROUP, 0);
SKIP_TO_EOL;
hot_load_group (new_grp);
current_group = grp;
break;
case TKN_ENTRY:
CHECK_TOKEN(TKN_STRING);
label = g_strdup (tkn_buf);
label = g_strdup (tkn_buf->data);
CHECK_TOKEN(TKN_URL);
CHECK_TOKEN(TKN_STRING);
url = g_strdup (tkn_buf);
url = g_strdup (tkn_buf->data);
add2hotlist (label, url, HL_TYPE_ENTRY, 0);
SKIP_TO_EOL;
break;
case TKN_COMMENT:
label = g_strdup (tkn_buf);
label = g_strdup (tkn_buf->data);
add2hotlist (label, 0, HL_TYPE_COMMENT, 0);
break;
case TKN_EOL:
@ -1597,10 +1577,9 @@ void done_hotlist (void)
hotlist_file_name = 0;
l_hotlist = 0;
current_group = 0;
if (tkn_buf){
g_free (tkn_buf);
tkn_buf_length = 0;
tkn_length = 0;
str_release_buffer (tkn_buf);
tkn_buf = NULL;
}
}

View File

@ -34,6 +34,7 @@
#include "key.h" /* is_idle() */
#include "mountlist.h"
#include "unixcompat.h"
#include "strutil.h"
#ifndef VERSION
# define VERSION "undefined"
@ -62,6 +63,7 @@ info_show_info (struct WInfo *info)
{
static int i18n_adjust=0;
static const char *file_label;
struct str_buffer *buff;
struct stat st;
@ -89,9 +91,11 @@ info_show_info (struct WInfo *info)
if(!i18n_adjust) {
/* This printf pattern string is used as a reference for size */
file_label=_("File: %s");
i18n_adjust=strlen(file_label)+2;
i18n_adjust = str_term_width1(file_label) + 2;
}
buff = str_get_buffer ();
switch (info->widget.lines-2){
/* Note: all cases are fall-throughs */
@ -129,21 +133,26 @@ info_show_info (struct WInfo *info)
case 13:
widget_move (&info->widget, 13, 3);
tty_printf (_("Device: %s"),
name_trunc (myfs_stats.device, info->widget.cols - i18n_adjust));
str_printf (buff, _("Device: %s"),
str_trunc (myfs_stats.device, info->widget.cols - i18n_adjust));
addstr (str_term_form (buff->data));
str_reset_buffer (buff);
case 12:
widget_move (&info->widget, 12, 3);
tty_printf (_("Filesystem: %s"),
name_trunc (myfs_stats.mpoint, info->widget.cols - i18n_adjust));
str_printf (buff, _("Filesystem: %s"),
str_trunc (myfs_stats.mpoint, info->widget.cols - i18n_adjust));
addstr (str_term_form (buff->data));
str_reset_buffer (buff);
case 11:
widget_move (&info->widget, 11, 3);
tty_printf (_("Accessed: %s"), file_date (st.st_atime));
str_printf (buff, _("Accessed: %s"), file_date (st.st_atime));
addstr (str_term_form (buff->data));
str_reset_buffer (buff);
case 10:
widget_move (&info->widget, 10, 3);
tty_printf (_("Modified: %s"), file_date (st.st_mtime));
str_printf (buff, _("Modified: %s"), file_date (st.st_mtime));
addstr (str_term_form (buff->data));
str_reset_buffer (buff);
case 9:
widget_move (&info->widget, 9, 3);
/* TRANSLATORS: "Status changed", like in the stat(2) man page */
@ -192,9 +201,11 @@ info_show_info (struct WInfo *info)
widget_move (&info->widget, 3, 2);
/* .ado: fname is invalid if selected == 0 && info called from current panel */
if (current_panel->selected){
tty_printf (file_label,
name_trunc (current_panel->dir.list [current_panel->selected].fname,
str_printf (buff, file_label,
str_trunc (current_panel->dir.list [current_panel->selected].fname,
info->widget.cols - i18n_adjust));
addstr (str_term_form (buff->data));
str_reset_buffer (buff);
} else
addstr (_("File: None"));
@ -203,6 +214,8 @@ info_show_info (struct WInfo *info)
case 0:
;
} /* switch */
str_release_buffer (buff);
}
static void info_hook (void *data)

View File

@ -825,7 +825,7 @@ int get_key_code (int no_delay)
nodelay (stdscr, TRUE);
}
c = getch ();
#if defined(USE_NCURSES) && defined(KEY_RESIZE)
#if (defined(USE_NCURSES) || defined(USE_NCURSESW)) && defined(KEY_RESIZE)
if (c == KEY_RESIZE)
goto nodelay_try_again;
#endif
@ -928,7 +928,7 @@ int get_key_code (int no_delay)
if (parent != NULL && parent->action == MCKEY_ESCAPE) {
/* Convert escape-digits to F-keys */
if (isdigit(c))
if (g_ascii_isdigit(c))
c = KEY_F (c - '0');
else if (c == ' ')
c = ESC_CHAR;

View File

@ -57,6 +57,7 @@
#include "subshell.h" /* For use_subshell and resize_subshell() */
#include "tree.h"
#include "menu.h"
#include "strutil.h"
/* Needed for the extern declarations of integer parameters */
#include "dir.h"
@ -284,13 +285,13 @@ layout_callback (struct Dlg_head *h, dlg_msg_t msg, int parm)
{
switch (msg) {
case DLG_DRAW:
/*When repainting the whole dialog (e.g. with C-l) we have to
update everything*/
/*When repainting the whole dialog (e.g. with C-l) we have to
update everything*/
common_dialog_repaint (h);
old_first_panel_size = -1;
old_horizontal_split = -1;
old_output_lines = -1;
old_first_panel_size = -1;
old_horizontal_split = -1;
old_output_lines = -1;
attrset (COLOR_HOT_NORMAL);
update_split ();
@ -301,7 +302,7 @@ layout_callback (struct Dlg_head *h, dlg_msg_t msg, int parm)
old_output_lines = _output_lines;
attrset (COLOR_NORMAL);
dlg_move (h, LAYOUT_OPTIONS_COUNT, 16 + first_width);
addstr (output_lines_label);
addstr (str_term_form (output_lines_label));
dlg_move (h, LAYOUT_OPTIONS_COUNT, 10 + first_width);
tty_printf ("%02d", _output_lines);
}
@ -352,7 +353,7 @@ layout_callback (struct Dlg_head *h, dlg_msg_t msg, int parm)
return MSG_HANDLED;
default:
return default_dlg_callback (h, msg, parm);
return default_dlg_callback (h, msg, parm);
}
}
@ -379,41 +380,40 @@ init_layout (void)
while (i--) {
s_split_direction[i] = _(s_split_direction[i]);
l1 = strlen (s_split_direction[i]) + 7;
l1 = str_term_width1 (s_split_direction[i]) + 7;
if (l1 > first_width)
first_width = l1;
}
for (i = 0; i < LAYOUT_OPTIONS_COUNT; i++) {
check_options[i].text = _(check_options[i].text);
l1 = strlen (check_options[i].text) + 7;
l1 = str_term_width1 (check_options[i].text) + 7;
if (l1 > first_width)
first_width = l1;
}
l1 = strlen (title1) + 1;
l1 = str_term_width1 (title1) + 1;
if (l1 > first_width)
first_width = l1;
l1 = strlen (title2) + 1;
l1 = str_term_width1 (title2) + 1;
if (l1 > first_width)
first_width = l1;
second_width = strlen (title3) + 1;
second_width = str_term_width1 (title3) + 1;
for (i = 0; i < OTHER_OPTIONS_COUNT; i++) {
check_options[i].text = _(check_options[i].text);
l1 = strlen (check_options[i].text) + 7;
l1 = str_term_width1 (check_options[i].text) + 7;
if (l1 > second_width)
second_width = l1;
}
if (console_flag) {
l1 = strlen (output_lines_label) + 13;
l1 = str_term_width1 (output_lines_label) + 13;
if (l1 > second_width)
second_width = l1;
}
/*
/*
* alex@bcs.zp.ua:
* To be completely correct, one need to check if the title
* does not exceed dialog length and total length of 3 buttons
@ -422,14 +422,14 @@ init_layout (void)
*
* Now the last thing to do - properly space buttons...
*/
l1 = 11 + strlen (ok_button) /* 14 - all brackets and inner space */
+strlen (save_button) /* notice: it is 3 char less because */
+strlen (cancel_button); /* of '&' char in button text */
l1 = 11 + str_term_width1 (ok_button) /* 14 - all brackets and inner space */
+ str_term_width1 (save_button) /* notice: it is 3 char less because */
+ str_term_width1 (cancel_button); /* of '&' char in button text */
i = (first_width + second_width - l1) / 4;
b1 = 5 + i;
b2 = b1 + strlen (ok_button) + i + 6;
b3 = b2 + strlen (save_button) + i + 4;
b2 = b1 + str_term_width1 (ok_button) + i + 6;
b3 = b2 + str_term_width1 (save_button) + i + 4;
i18n_layt_flag = 1;
}
@ -694,7 +694,7 @@ setup_panels (void)
panel_do_cols (0);
panel_do_cols (1);
promptl = strlen (prompt);
promptl = str_term_width1 (prompt);
widget_set_size (&the_menubar->widget, 0, 0, 1, COLS);
@ -736,7 +736,7 @@ setup_panels (void)
void flag_winch (int dummy)
{
(void) dummy;
#ifndef USE_NCURSES /* don't do malloc in a signal handler */
#if !(defined(USE_NCURSES) || defined(USE_NCURSESW)) /* don't do malloc in a signal handler */
low_level_change_screen_size ();
#endif
winch_flag = 1;
@ -847,7 +847,7 @@ void print_vfs_message (const char *msg, ...)
move (0, 0);
attrset (NORMAL_COLOR);
tty_printf ("%-*s", COLS-1, str);
addstr (str_fit_to_term (str, COLS - 1, J_LEFT));
/* Restore cursor position */
move(row, col);

View File

@ -42,6 +42,7 @@
#include "main.h"
#include "learn.h"
#include "wtools.h"
#include "strutil.h"
#define UX 4
#define UY 3
@ -202,7 +203,7 @@ learn_check_key (int c)
/* Prevent from disappearing if a non-defined sequence is pressed
and contains a button hotkey. Only recognize hotkeys with ALT. */
if (c < 255 && isalnum (c))
if (c < 255 && g_ascii_isalnum (c))
return 1;
return 0;
@ -238,7 +239,7 @@ init_learn (void)
learn_but[0].x = 78 / 2 + 4;
learn_but[1].text = _(learn_but[1].text);
learn_but[1].x = 78 / 2 - (strlen (learn_but[1].text) + 9);
learn_but[1].x = 78 / 2 - (str_term_width1 (learn_but[1].text) + 9);
learn_title = _(learn_title);
i18n_flag = 1;

View File

@ -60,6 +60,7 @@
#include "listmode.h"
#include "execute.h"
#include "ext.h" /* For flush_extension_file() */
#include "strutil.h"
/* Listbox for the command history feature */
#include "widget.h"
@ -709,7 +710,7 @@ load_prompt (int fd, void *unused)
int prompt_len;
tmp_prompt = strip_ctrl_codes (subshell_prompt);
prompt_len = strlen (tmp_prompt);
prompt_len = str_term_width1 (tmp_prompt);
/* Check for prompts too big */
if (COLS > 8 && prompt_len > COLS - 8) {
@ -807,76 +808,80 @@ listmode_cmd (void)
/* NOTICE: hotkeys specified here are overriden in menubar_paint_idx (alex) */
static menu_entry LeftMenu[] = {
{' ', N_("&Listing mode..."), 'L', listing_cmd},
{' ', N_("&Quick view C-x q"), 'Q', quick_view_cmd},
{' ', N_("&Info C-x i"), 'I', info_cmd},
{' ', N_("&Tree"), 'T', tree_cmd},
{' ', "", ' ', 0},
{' ', N_("&Sort order..."), 'S', sort_cmd},
{' ', "", ' ', 0},
{' ', N_("&Filter..."), 'F', filter_cmd},
{' ', N_("&Listing mode..."), NULL_HOTKEY, listing_cmd},
{' ', N_("&Quick view C-x q"), NULL_HOTKEY, quick_view_cmd},
{' ', N_("&Info C-x i"), NULL_HOTKEY, info_cmd},
{' ', N_("&Tree"), NULL_HOTKEY, tree_cmd},
{' ', "", NULL_HOTKEY, 0},
{' ', N_("&Sort order..."), NULL_HOTKEY, sort_cmd},
{' ', "", NULL_HOTKEY, 0},
{' ', N_("&Filter..."), NULL_HOTKEY, filter_cmd},
{' ', "",NULL_HOTKEY, 0},
{' ', N_("&Encoding..."), NULL_HOTKEY, encoding_cmd},
#ifdef USE_NETCODE
{' ', "", ' ', 0},
{' ', "", NULL_HOTKEY, 0},
#ifdef WITH_MCFS
{' ', N_("&Network link..."), 'N', netlink_cmd},
{' ', N_("&Network link..."), NULL_HOTKEY, netlink_cmd},
#endif
{' ', N_("FT&P link..."), 'P', ftplink_cmd},
{' ', N_("S&hell link..."), 'H', fishlink_cmd},
{' ', N_("FT&P link..."), NULL_HOTKEY, ftplink_cmd},
{' ', N_("S&hell link..."), NULL_HOTKEY, fishlink_cmd},
#ifdef WITH_SMBFS
{' ', N_("SM&B link..."), 'B', smblink_cmd},
{' ', N_("SM&B link..."), NULL_HOTKEY, smblink_cmd},
#endif
#endif
{' ', "", ' ', 0},
{' ', N_("&Rescan C-r"), 'R', reread_cmd}
{' ', "", NULL_HOTKEY, 0},
{' ', N_("&Rescan C-r"), NULL_HOTKEY, reread_cmd}
};
static menu_entry RightMenu[] = {
{' ', N_("&Listing mode..."), 'L', listing_cmd},
{' ', N_("&Quick view C-x q"), 'Q', quick_view_cmd},
{' ', N_("&Info C-x i"), 'I', info_cmd},
{' ', N_("&Tree"), 'T', tree_cmd},
{' ', "", ' ', 0},
{' ', N_("&Sort order..."), 'S', sort_cmd},
{' ', "", ' ', 0},
{' ', N_("&Filter..."), 'F', filter_cmd},
{' ', N_("&Listing mode..."), NULL_HOTKEY, listing_cmd},
{' ', N_("&Quick view C-x q"), NULL_HOTKEY, quick_view_cmd},
{' ', N_("&Info C-x i"), NULL_HOTKEY, info_cmd},
{' ', N_("&Tree"), NULL_HOTKEY, tree_cmd},
{' ', "", NULL_HOTKEY, 0},
{' ', N_("&Sort order..."), NULL_HOTKEY, sort_cmd},
{' ', "", NULL_HOTKEY, 0},
{' ', N_("&Filter..."), NULL_HOTKEY, filter_cmd},
{' ', "",NULL_HOTKEY, 0},
{' ', N_("&Encoding..."), NULL_HOTKEY, encoding_cmd},
#ifdef USE_NETCODE
{' ', "", ' ', 0},
{' ', "", NULL_HOTKEY, 0},
#ifdef WITH_MCFS
{' ', N_("&Network link..."), 'N', netlink_cmd},
{' ', N_("&Network link..."), NULL_HOTKEY, netlink_cmd},
#endif
{' ', N_("FT&P link..."), 'P', ftplink_cmd},
{' ', N_("S&hell link..."), 'H', fishlink_cmd},
{' ', N_("FT&P link..."), NULL_HOTKEY, ftplink_cmd},
{' ', N_("S&hell link..."), NULL_HOTKEY, fishlink_cmd},
#ifdef WITH_SMBFS
{' ', N_("SM&B link..."), 'B', smblink_cmd},
{' ', N_("SM&B link..."), NULL_HOTKEY, smblink_cmd},
#endif
#endif
{' ', "", ' ', 0},
{' ', N_("&Rescan C-r"), 'R', reread_cmd}
{' ', "", NULL_HOTKEY, 0},
{' ', N_("&Rescan C-r"), NULL_HOTKEY, reread_cmd}
};
static menu_entry FileMenu[] = {
{' ', N_("&User menu F2"), 'U', user_file_menu_cmd},
{' ', N_("&View F3"), 'V', view_cmd},
{' ', N_("Vie&w file... "), 'W', view_file_cmd},
{' ', N_("&Filtered view M-!"), 'F', filtered_view_cmd},
{' ', N_("&Edit F4"), 'E', edit_cmd},
{' ', N_("&Copy F5"), 'C', copy_cmd},
{' ', N_("c&Hmod C-x c"), 'H', chmod_cmd},
{' ', N_("&Link C-x l"), 'L', link_cmd},
{' ', N_("&SymLink C-x s"), 'S', symlink_cmd},
{' ', N_("edit s&Ymlink C-x C-s"), 'Y', edit_symlink_cmd},
{' ', N_("ch&Own C-x o"), 'O', chown_cmd},
{' ', N_("&Advanced chown "), 'A', chown_advanced_cmd},
{' ', N_("&Rename/Move F6"), 'R', ren_cmd},
{' ', N_("&Mkdir F7"), 'M', mkdir_cmd},
{' ', N_("&Delete F8"), 'D', delete_cmd},
{' ', N_("&Quick cd M-c"), 'Q', quick_cd_cmd},
{' ', "", ' ', 0},
{' ', N_("select &Group M-+"), 'G', select_cmd},
{' ', N_("u&Nselect group M-\\"), 'N', unselect_cmd},
{' ', N_("reverse selec&Tion M-*"), 'T', reverse_selection_cmd},
{' ', "", ' ', 0},
{' ', N_("e&Xit F10"), 'X', quit_cmd}
{' ', N_("&User menu F2"), NULL_HOTKEY, user_file_menu_cmd},
{' ', N_("&View F3"), NULL_HOTKEY, view_cmd},
{' ', N_("Vie&w file... "), NULL_HOTKEY, view_file_cmd},
{' ', N_("&Filtered view M-!"), NULL_HOTKEY, filtered_view_cmd},
{' ', N_("&Edit F4"), NULL_HOTKEY, edit_cmd},
{' ', N_("&Copy F5"), NULL_HOTKEY, copy_cmd},
{' ', N_("c&Hmod C-x c"), NULL_HOTKEY, chmod_cmd},
{' ', N_("&Link C-x l"), NULL_HOTKEY, link_cmd},
{' ', N_("&SymLink C-x s"), NULL_HOTKEY, symlink_cmd},
{' ', N_("edit s&Ymlink C-x C-s"), NULL_HOTKEY, edit_symlink_cmd},
{' ', N_("ch&Own C-x o"), NULL_HOTKEY, chown_cmd},
{' ', N_("&Advanced chown "), NULL_HOTKEY, chown_advanced_cmd},
{' ', N_("&Rename/Move F6"), NULL_HOTKEY, ren_cmd},
{' ', N_("&Mkdir F7"), NULL_HOTKEY, mkdir_cmd},
{' ', N_("&Delete F8"), NULL_HOTKEY, delete_cmd},
{' ', N_("&Quick cd M-c"), NULL_HOTKEY, quick_cd_cmd},
{' ', "", NULL_HOTKEY, 0},
{' ', N_("select &Group M-+"), NULL_HOTKEY, select_cmd},
{' ', N_("u&Nselect group M-\\"), NULL_HOTKEY, unselect_cmd},
{' ', N_("reverse selec&Tion M-*"), NULL_HOTKEY, reverse_selection_cmd},
{' ', "", NULL_HOTKEY, 0},
{' ', N_("e&Xit F10"), NULL_HOTKEY, quit_cmd}
};
static menu_entry CmdMenu[] = {
@ -884,52 +889,52 @@ static menu_entry CmdMenu[] = {
* as a panel still has some problems, I have not yet finished
* the WTree widget port, sorry.
*/
{' ', N_("&Directory tree"), 'D', treebox_cmd},
{' ', N_("&Find file M-?"), 'F', find_cmd},
{' ', N_("s&Wap panels C-u"), 'W', swap_cmd},
{' ', N_("switch &Panels on/off C-o"), 'P', view_other_cmd},
{' ', N_("&Compare directories C-x d"), 'C', compare_dirs_cmd},
{' ', N_("e&Xternal panelize C-x !"), 'X', external_panelize},
{' ', N_("show directory s&Izes"), 'I', dirsizes_cmd},
{' ', "", ' ', 0},
{' ', N_("command &History"), 'H', history_cmd},
{' ', N_("di&Rectory hotlist C-\\"), 'R', quick_chdir_cmd},
{' ', N_("&Directory tree"), NULL_HOTKEY, treebox_cmd},
{' ', N_("&Find file M-?"), NULL_HOTKEY, find_cmd},
{' ', N_("s&Wap panels C-u"), NULL_HOTKEY, swap_cmd},
{' ', N_("switch &Panels on/off C-o"), NULL_HOTKEY, view_other_cmd},
{' ', N_("&Compare directories C-x d"), NULL_HOTKEY, compare_dirs_cmd},
{' ', N_("e&Xternal panelize C-x !"), NULL_HOTKEY, external_panelize},
{' ', N_("show directory s&Izes"), NULL_HOTKEY, dirsizes_cmd},
{' ', "", NULL_HOTKEY, 0},
{' ', N_("command &History"), NULL_HOTKEY, history_cmd},
{' ', N_("di&Rectory hotlist C-\\"), NULL_HOTKEY, quick_chdir_cmd},
#ifdef USE_VFS
{' ', N_("&Active VFS list C-x a"), 'A', reselect_vfs},
{' ', N_("&Active VFS list C-x a"), NULL_HOTKEY, reselect_vfs},
#endif
#ifdef WITH_BACKGROUND
{' ', N_("&Background jobs C-x j"), 'B', jobs_cmd},
{' ', N_("&Background jobs C-x j"), NULL_HOTKEY, jobs_cmd},
#endif
{' ', "", ' ', 0},
{' ', "", NULL_HOTKEY, 0},
#ifdef USE_EXT2FSLIB
{' ', N_("&Undelete files (ext2fs only)"), 'U', undelete_cmd},
{' ', N_("&Undelete files (ext2fs only)"), NULL_HOTKEY, undelete_cmd},
#endif
#ifdef LISTMODE_EDITOR
{' ', N_("&Listing format edit"), 'L', listmode_cmd},
{' ', N_("&Listing format edit"), NULL_HOTKEY, listmode_cmd},
#endif
#if defined (USE_EXT2FSLIB) || defined (LISTMODE_EDITOR)
{' ', "", ' ', 0},
{' ', "", NULL_HOTKEY, 0},
#endif
{' ', N_("Edit &extension file"), 'E', ext_cmd},
{' ', N_("Edit &menu file"), 'M', edit_mc_menu_cmd},
{' ', N_("Edit &extension file"), NULL_HOTKEY, ext_cmd},
{' ', N_("Edit &menu file"), NULL_HOTKEY, edit_mc_menu_cmd},
#ifdef USE_INTERNAL_EDIT
{' ', N_("Edit edi&tor menu file"), 'T', edit_user_menu_cmd},
{' ', N_("Edit &syntax file"), 'S', edit_syntax_cmd}
{' ', N_("Edit edi&tor menu file"), NULL_HOTKEY, edit_user_menu_cmd},
{' ', N_("Edit &syntax file"), NULL_HOTKEY, edit_syntax_cmd}
#endif /* USE_INTERNAL_EDIT */
};
/* Must keep in sync with the constants in menu_cmd */
static menu_entry OptMenu[] = {
{' ', N_("&Configuration..."), 'C', configure_box},
{' ', N_("&Layout..."), 'L', layout_cmd},
{' ', N_("c&Onfirmation..."), 'O', confirm_box},
{' ', N_("&Display bits..."), 'D', display_bits_box},
{' ', N_("learn &Keys..."), 'K', learn_keys},
{' ', N_("&Configuration..."), NULL_HOTKEY, configure_box},
{' ', N_("&Layout..."), NULL_HOTKEY, layout_cmd},
{' ', N_("c&Onfirmation..."), NULL_HOTKEY, confirm_box},
{' ', N_("&Display bits..."), NULL_HOTKEY, display_bits_box},
{' ', N_("learn &Keys..."), NULL_HOTKEY, learn_keys},
#ifdef USE_VFS
{' ', N_("&Virtual FS..."), 'V', configure_vfs},
{' ', N_("&Virtual FS..."), NULL_HOTKEY, configure_vfs},
#endif /* !USE_VFS */
{' ', "", ' ', 0},
{' ', N_("&Save setup"), 'S', save_setup_cmd}
{' ', "", NULL_HOTKEY, 0},
{' ', N_("&Save setup"), NULL_HOTKEY, save_setup_cmd}
};
#define menu_entries(x) sizeof(x)/sizeof(menu_entry)
@ -1612,19 +1617,14 @@ midnight_callback (struct Dlg_head *h, dlg_msg_t msg, int parm)
void
update_xterm_title_path (void)
{
char *p, *s;
const char *p;
if (xterm_flag && xterm_title) {
p = s = g_strdup (strip_home_and_password (current_panel->cwd));
do {
if (!is_printable ((unsigned char) *s))
*s = '?';
} while (*++s);
p = strip_home_and_password (current_panel->cwd);
fprintf (stdout, "\33]0;mc - %s\7", str_term_form (p));
if (!alternate_plus_minus)
numeric_keypad_mode ();
fprintf (stdout, "\33]0;mc - %s\7", p);
fflush (stdout);
g_free (p);
}
}
@ -2068,7 +2068,7 @@ handle_args (int argc, char *argv[])
char *end = tmp + strlen (tmp), *p = end;
if (p > tmp && p[-1] == ':')
p--;
while (p > tmp && isdigit ((unsigned char) p[-1]))
while (p > tmp && g_ascii_isdigit ((gchar) p[-1]))
p--;
if (tmp < p && p < end && p[-1] == ':') {
struct stat st;
@ -2086,7 +2086,7 @@ handle_args (int argc, char *argv[])
}
} else {
try_plus_filename:
if (*tmp == '+' && isdigit ((unsigned char) tmp[1])) {
if (*tmp == '+' && g_ascii_isdigit ((gchar) tmp[1])) {
int start_line = atoi (tmp);
if (start_line > 0) {
char *file = poptGetArg (ctx);
@ -2138,6 +2138,8 @@ main (int argc, char *argv[])
home_dir = mc_home;
}
str_init_strings (NULL);
vfs_init ();
#ifdef USE_INTERNAL_EDIT
@ -2264,6 +2266,8 @@ main (int argc, char *argv[])
#ifdef HAVE_CHARSET
free_codepages_list ();
#endif
str_uninit_strings ();
g_free (this_dir);
g_free (other_dir);

View File

@ -33,55 +33,35 @@
#include "mouse.h"
#include "win.h"
#include "key.h" /* For mi_getch() */
#include "strutil.h"
int menubar_visible = 1; /* This is the new default */
static void
menu_scan_hotkey (Menu *menu)
{
char *cp = strchr (menu->name, '&');
if (cp != NULL && cp[1] != '\0') {
g_strlcpy (cp, cp + 1, strlen (cp));
menu->hotkey = tolower ((unsigned char) *cp);
} else
menu->hotkey = 0;
}
Menu *
create_menu (const char *name, menu_entry *entries, int count, const char *help_node)
{
Menu *menu;
const char *cp;
menu = (Menu *) g_malloc (sizeof (*menu));
menu = g_new (Menu, 1);
menu->count = count;
menu->max_entry_len = 20;
menu->entries = entries;
menu->text = parse_hotkey (name);
if (entries != (menu_entry*) NULL) {
int len;
register menu_entry* mp;
for (mp = entries; count--; mp++) {
if (mp->text[0] != '\0') {
#ifdef ENABLE_NLS
mp->text = _(mp->text);
#endif /* ENABLE_NLS */
cp = strchr (mp->text,'&');
if (mp->label[0] != '\0') {
mp->label = _(mp->label);
mp->text = parse_hotkey (mp->label);
len = hotkey_width (mp->text);
if (cp != NULL && *(cp+1) != '\0') {
mp->hot_key = tolower ((unsigned char) *(cp+1));
menu->max_entry_len = max ((int) (strlen (mp->text) - 1),
menu->max_entry_len);
} else {
menu->max_entry_len = max ((int) strlen (mp->text),
menu->max_entry_len);
}
menu->max_entry_len = max (len, menu->max_entry_len);
}
}
}
menu->name = g_strdup (name);
menu_scan_hotkey(menu);
menu->start_x = 0;
menu->help_node = g_strdup (help_node);
return menu;
@ -94,34 +74,35 @@ static void menubar_drop_compute (WMenu *menubar)
static void menubar_paint_idx (WMenu *menubar, int idx, int color)
{
const Menu *menu = menubar->menu [menubar->selected];
const Menu *menu = menubar->menu[menubar->selected];
const int y = 2 + idx;
int x = menubar-> menu[menubar->selected]->start_x;
int x = menu->start_x;
const menu_entry *entry = &menu->entries[idx];
if (x + menubar->max_entry_len + 3 > menubar->widget.cols)
x = menubar->widget.cols - menubar->max_entry_len - 3;
widget_move (&menubar->widget, y, x);
attrset (color);
hline (' ', menubar->max_entry_len+2);
if (!*menu->entries [idx].text) {
attrset (SELECTED_COLOR);
widget_move (&menubar->widget, y, x + 1);
hline (slow_terminal ? ' ' : ACS_HLINE, menubar->max_entry_len);
} else {
const unsigned char *text;
addch((unsigned char)menu->entries [idx].first_letter);
for (text = menu->entries [idx].text; *text; text++)
{
if (*text != '&')
addch(*text);
else {
attrset (color);
hline (' ', menubar->max_entry_len + 2);
if (entry->text.start == NULL) {
attrset (SELECTED_COLOR);
widget_move (&menubar->widget, y, x + 1);
hline (slow_terminal ? ' ' : ACS_HLINE, menubar->max_entry_len);
} else {
addch ((unsigned char)entry->first_letter);
addstr (str_term_form (entry->text.start));
if (entry->text.hotkey != NULL) {
attrset (color == MENU_SELECTED_COLOR ?
MENU_HOTSEL_COLOR : MENU_HOT_COLOR);
addch(*(++text));
addstr (str_term_form (entry->text.hotkey));
attrset(color);
}
if (entry->text.end != NULL) {
addstr (str_term_form (entry->text.end));
}
}
widget_move (&menubar->widget, y, x + 1);
@ -165,10 +146,22 @@ static void menubar_draw (WMenu *menubar)
attrset (SELECTED_COLOR);
/* Now each one of the entries */
for (i = 0; i < items; i++){
if (menubar->active)
attrset(i == menubar->selected?MENU_SELECTED_COLOR:SELECTED_COLOR);
attrset ((menubar->active && i == menubar->selected) ?
MENU_SELECTED_COLOR : SELECTED_COLOR);
widget_move (&menubar->widget, 0, menubar->menu [i]->start_x);
tty_printf ("%s", menubar->menu [i]->name);
addstr (str_term_form (menubar->menu[i]->text.start));
if (menubar->menu[i]->text.hotkey != NULL) {
attrset ((menubar->active && i == menubar->selected) ?
MENU_HOTSEL_COLOR : COLOR_HOT_FOCUS);
addstr (str_term_form (menubar->menu[i]->text.hotkey));
attrset ((menubar->active && i == menubar->selected) ?
MENU_SELECTED_COLOR : SELECTED_COLOR);
}
if (menubar->menu[i]->text.end != NULL) {
addstr (str_term_form (menubar->menu[i]->text.end));
}
}
if (menubar->dropped)
@ -176,6 +169,7 @@ static void menubar_draw (WMenu *menubar)
else
widget_move (&menubar->widget, 0,
menubar-> menu[menubar->selected]->start_x);
}
static inline void menubar_remove (WMenu *menubar)
@ -263,8 +257,7 @@ static int menubar_handle_key (WMenu *menubar, int key)
int i;
/* Lowercase */
if (key < 256 && isalpha (key)) /* Linux libc.so.5.x.x bug fix */
key = tolower (key);
if (isascii (key)) key = g_ascii_tolower (key);
if (is_abort_char (key)){
menubar_finish (menubar);
@ -292,16 +285,19 @@ static int menubar_handle_key (WMenu *menubar, int key)
if (!menubar->dropped){
const int items = menubar->items;
for (i = 0; i < items; i++){
for (i = 0; i < items; i++) {
const Menu *menu = menubar->menu [i];
if (menu->hotkey == key){
if (menu->text.hotkey != NULL) {
if (g_ascii_tolower(menu->text.hotkey[0]) == key) {
menubar_drop (menubar, i);
return 1;
}
}
if (key == KEY_ENTER || key == XCTRL ('n') || key == KEY_DOWN
|| key == '\n'){
}
if (key == KEY_ENTER || key == XCTRL ('n')
|| key == KEY_DOWN || key == '\n') {
menubar_drop (menubar, menubar->selected);
return 1;
}
@ -311,18 +307,20 @@ static int menubar_handle_key (WMenu *menubar, int key)
const Menu *menu = menubar->menu [selected];
const int items = menu->count;
for (i = 0; i < items; i++){
for (i = 0; i < items; i++) {
if (!menu->entries [i].call_back)
continue;
if (key != menu->entries [i].hot_key)
if (menu->entries[i].text.hotkey != NULL) {
if (key != g_ascii_tolower (menu->entries[i].text.hotkey[0]))
continue;
menubar_execute (menubar, i);
return 1;
}
}
if (key == KEY_ENTER || key == '\n'){
if (key == KEY_ENTER || key == '\n') {
menubar_execute (menubar, menubar->subsel);
return 1;
}
@ -493,7 +491,7 @@ menubar_arrange(WMenu* menubar)
for (i = 0; i < items; i++)
{
int len = strlen(menubar->menu[i]->name);
int len = hotkey_width (menubar->menu[i]->text);
menubar->menu[i]->start_x = start_x;
start_x += len + gap;
}
@ -506,7 +504,7 @@ menubar_arrange(WMenu* menubar)
for (i = 0; i < items; i++)
{
/* preserve length here, to be used below */
gap -= (menubar->menu[i]->start_x = strlen(menubar->menu[i]->name));
gap -= (menubar->menu[i]->start_x = hotkey_width (menubar->menu[i]->text));
}
gap /= (items - 1);
@ -530,7 +528,16 @@ menubar_arrange(WMenu* menubar)
void
destroy_menu (Menu *menu)
{
g_free (menu->name);
release_hotkey (menu->text);
if (menu->entries != NULL) {
int me;
for (me = 0; me < menu->count; me++) {
if (menu->entries[me].label[0] != '\0') {
release_hotkey (menu->entries[me].text);
}
}
}
g_free (menu->help_node);
g_free (menu);
}

View File

@ -7,17 +7,16 @@ typedef void (*callfn) (void);
typedef struct {
char first_letter;
const char *text;
int hot_key;
const char *label;
struct hotkey_t text;
callfn call_back;
} menu_entry;
typedef struct Menu {
char *name;
struct hotkey_t text;
int count;
int max_entry_len;
int selected;
int hotkey;
menu_entry *entries;
int start_x; /* position relative to menubar start */
char *help_node;

View File

@ -35,6 +35,7 @@
#include "setup.h" /* For save_setup() */
#include "main.h"
#include "profile.h" /* For sync_profiles */
#include "strutil.h"
#include "panel.h" /* Needed for the externs */
#include "file.h" /* safe_delete */
@ -125,12 +126,12 @@ init_configure (void)
title2 = _(" Pause after run... ");
title3 = _(" Other options ");
first_width = strlen (title1) + 1;
second_width = strlen (title3) + 1;
first_width = str_term_width1 (title1) + 1;
second_width = str_term_width1 (title3) + 1;
for (i = 0; check_options[i].text; i++) {
check_options[i].text = _(check_options[i].text);
l1 = strlen (check_options[i].text) + 7;
l1 = str_term_width1 (check_options[i].text) + 7;
if (i >= OTHER_OPTIONS) {
if (l1 > first_width)
first_width = l1;
@ -143,23 +144,23 @@ init_configure (void)
i = PAUSE_OPTIONS;
while (i--) {
pause_options[i] = _(pause_options[i]);
l1 = strlen (pause_options[i]) + 7;
l1 = str_term_width1 (pause_options[i]) + 7;
if (l1 > first_width)
first_width = l1;
}
l1 = strlen (title2) + 1;
l1 = str_term_width1 (title2) + 1;
if (l1 > first_width)
first_width = l1;
l1 = 11 + strlen (ok_button)
+ strlen (save_button)
+ strlen (cancel_button);
l1 = 11 + str_term_width1 (ok_button)
+ str_term_width1 (save_button)
+ str_term_width1 (cancel_button);
i = (first_width + second_width - l1) / 4;
b1 = 5 + i;
b2 = b1 + strlen (ok_button) + i + 6;
b3 = b2 + strlen (save_button) + i + 4;
b2 = b1 + str_term_width1 (ok_button) + i + 6;
b3 = b2 + str_term_width1 (save_button) + i + 4;
i18n_config_flag = 1;
}

View File

@ -72,6 +72,8 @@ typedef struct WPanel {
int searching;
char search_buffer [256];
char search_char [MB_LEN_MAX]; /*buffer for multibytes characters*/
int search_chpoint; /*point after last characters in search_char*/
} WPanel;
WPanel *panel_new (const char *panel_name);

View File

@ -43,6 +43,7 @@
#include "main.h" /* repaint_screen */
#include "panelize.h"
#include "history.h"
#include "strutil.h"
#define UX 5
#define UY 2
@ -128,7 +129,7 @@ init_panelize (void)
i = sizeof (panelize_but) / sizeof (panelize_but[0]);
while (i--) {
panelize_but[i].text = _(panelize_but[i].text);
maxlen += strlen (panelize_but[i].text) + 5;
maxlen += str_term_width1 (panelize_but[i].text) + 5;
}
maxlen += 10;
@ -137,11 +138,11 @@ init_panelize (void)
panelize_cols = max (panelize_cols, maxlen);
panelize_but[2].x =
panelize_but[3].x + strlen (panelize_but[3].text) + 7;
panelize_but[3].x + str_term_width1 (panelize_but[3].text) + 7;
panelize_but[1].x =
panelize_but[2].x + strlen (panelize_but[2].text) + 5;
panelize_but[2].x + str_term_width1 (panelize_but[2].text) + 5;
panelize_but[0].x =
panelize_cols - strlen (panelize_but[0].text) - 8 - BX;
panelize_cols - str_term_width1 (panelize_but[0].text) - 8 - BX;
#endif /* ENABLE_NLS */
@ -403,6 +404,8 @@ static void do_external_panelize (char *command)
list->list [next_free].f.stale_link = stale_link;
list->list [next_free].f.dir_size_computed = 0;
list->list [next_free].st = st;
list->list[next_free].sort_key = NULL;
list->list[next_free].second_sort_key = NULL;
next_free++;
if (!(next_free & 32))
rotate_dash ();

View File

@ -30,6 +30,7 @@
#include "global.h"
#include "profile.h"
#include "strutil.h"
#define STRSIZE 4096
#define overflow (next == &CharBuffer [STRSIZE-1])
@ -62,7 +63,7 @@ find_loaded (const char *FileName, TSecHeader ** section)
TProfile *p = Base;
while (p) {
if (!g_strcasecmp (FileName, p->FileName)) {
if (!str_casecmp (FileName, p->FileName)) {
*section = p->Section;
return p;
}
@ -291,10 +292,10 @@ GetSetProfileChar (int set, const char *AppName, const char *KeyName,
/* Start search */
for (; section; section = section->link){
if (section->AppName == 0 || g_strcasecmp (section->AppName, AppName))
if (section->AppName == 0 || str_casecmp (section->AppName, AppName))
continue;
for (key = section->Keys; key; key = key->link){
if ( g_strcasecmp (key->KeyName, KeyName))
if (str_casecmp (key->KeyName, KeyName))
continue;
if (set){
g_free (key->Value);
@ -360,9 +361,9 @@ int GetPrivateProfileInt (const char * AppName, const char * KeyName, int Defaul
/* Check the exact semantic with the SDK */
GetPrivateProfileString (AppName, KeyName, buf, IntBuf, BUF_TINY, File);
if (! g_strcasecmp (IntBuf, "true"))
if (!str_casecmp (IntBuf, "true"))
return 1;
if (! g_strcasecmp (IntBuf, "yes"))
if (!str_casecmp (IntBuf, "yes"))
return 1;
return (int) atol (IntBuf);
}
@ -488,7 +489,7 @@ void *profile_init_iterator (const char *appname, const char *file)
section = Current->Section;
}
for (; section; section = section->link){
if ( g_strcasecmp (section->AppName, appname))
if (str_casecmp (section->AppName, appname))
continue;
return section->Keys;
}
@ -520,7 +521,7 @@ void profile_clean_section (const char *appname, const char *file)
/* won't be find by further walks of the structure */
for (; section; section = section->link){
if ( g_strcasecmp (section->AppName, appname))
if (str_casecmp (section->AppName, appname))
continue;
section->AppName [0] = 0;
}
@ -535,7 +536,7 @@ int profile_has_section (const char *section_name, const char *profile)
return 0;
}
for (; section; section = section->link){
if ( g_strcasecmp (section->AppName, section_name))
if (str_casecmp (section->AppName, section_name))
continue;
return 1;
}
@ -547,7 +548,7 @@ void profile_forget_profile (const char *file)
TProfile *p;
for (p = Base; p; p = p->link){
if ( g_strcasecmp (file, p->FileName))
if (str_casecmp (file, p->FileName))
continue;
p->FileName [0] = 0;
}

View File

@ -50,21 +50,10 @@
#include "main.h" /* the_menubar */
#include "unixcompat.h"
#include "mountlist.h" /* my_statfs */
#include "strutil.h"
#define ELEMENTS(arr) ( sizeof(arr) / sizeof((arr)[0]) )
#define J_LEFT 1
#define J_RIGHT 2
#define J_CENTER 3
#define IS_FIT(x) ((x) & 0x0004)
#define MAKE_FIT(x) ((x) | 0x0004)
#define HIDE_FIT(x) ((x) & 0x0003)
#define J_LEFT_FIT 5
#define J_RIGHT_FIT 6
#define J_CENTER_FIT 7
#define NORMAL 0
#define SELECTED 1
#define MARKED 2
@ -172,24 +161,8 @@ add_permission_string (char *dest, int width, file_entry *fe, int attr, int colo
static const char *
string_file_name (file_entry *fe, int len)
{
static char buffer [MC_MAXPATHLEN + 1];
size_t i;
for (i = 0; i < sizeof(buffer) - 1; i++) {
char c;
c = fe->fname[i];
if (!c)
break;
if (!is_printable(c))
c = '?';
buffer[i] = c;
}
buffer[i] = 0;
static char buffer [MC_MAXPATHLEN * MB_LEN_MAX + 1];
g_strlcpy (buffer, fe->fname, sizeof(buffer));
return buffer;
}
@ -451,42 +424,6 @@ static struct {
{ "dot", 1, 0, J_RIGHT, " ", 0, string_dot, NULL },
};
static char *
to_buffer (char *dest, int just_mode, int len, const char *txt)
{
int txtlen = strlen (txt);
int still, over;
/* Fill buffer with spaces */
memset (dest, ' ', len);
still = (over=(txtlen > len)) ? (txtlen - len) : (len - txtlen);
switch (HIDE_FIT(just_mode)){
case J_LEFT:
still = 0;
break;
case J_CENTER:
still /= 2;
break;
case J_RIGHT:
default:
break;
}
if (over){
if (IS_FIT(just_mode))
strcpy (dest, name_trunc(txt, len));
else
strncpy (dest, txt+still, len);
} else
strncpy (dest+still, txt, txtlen);
dest[len] = '\0';
return (dest + len);
}
static int
file_compute_color (int attr, file_entry *fe)
{
@ -544,8 +481,6 @@ format_file (char *dest, int limit, WPanel *panel, int file_index, int width, in
{
int color, length, empty_line;
const char *txt;
char *old_pos;
char *cdest = dest;
format_e *format, *home;
file_entry *fe;
@ -565,34 +500,38 @@ format_file (char *dest, int limit, WPanel *panel, int file_index, int width, in
break;
if (format->string_fn){
int len;
int len, perm;
char *preperad_text;
if (empty_line)
txt = " ";
else
txt = (*format->string_fn)(fe, format->field_len);
old_pos = cdest;
len = format->field_len;
if (len + length > width)
len = width - length;
if (len + (cdest - dest) > limit)
len = limit - (cdest - dest);
if (len <= 0)
break;
cdest = to_buffer (cdest, format->just_mode, len, txt);
length += len;
perm = 0;
if (permission_mode) {
if (!strcmp(format->id, "perm"))
perm = 1;
else if (!strcmp(format->id, "mode"))
perm = 2;
}
attrset (color);
if (permission_mode && !strcmp(format->id, "perm"))
add_permission_string (old_pos, format->field_len, fe, attr, color, 0);
else if (permission_mode && !strcmp(format->id, "mode"))
add_permission_string (old_pos, format->field_len, fe, attr, color, 1);
preperad_text = (char*) str_fit_to_term(txt, len, format->just_mode);
if (perm)
add_permission_string (preperad_text, format->field_len, fe,
attr, color, perm - 1);
else
addstr (old_pos);
addstr (preperad_text);
length+= len;
} else {
if (attr == SELECTED || attr == MARKED_SELECTED)
attrset (SELECTED_COLOR);
@ -663,11 +602,41 @@ display_mini_info (WPanel *panel)
if (panel->searching){
attrset (INPUT_COLOR);
tty_printf ("/%-*s", panel->widget.cols-3, panel->search_buffer);
addstr ("/");
addstr (str_fit_to_term (panel->search_buffer,
panel->widget.cols - 3, J_LEFT));
attrset (NORMAL_COLOR);
return;
}
/* Status displays total marked size */
if (panel->marked){
char buffer[BUF_SMALL], b_bytes[BUF_SMALL];
int cols = panel->widget.cols - 2;
attrset (MARKED_COLOR);
widget_move (&panel->widget, llines (panel) + 3, 1);
/*
* This is a trick to use two ngettext() calls in one sentence.
* First make "N bytes", then insert it into "X in M files".
*/
g_snprintf(b_bytes, sizeof (b_bytes),
ngettext("%s byte", "%s bytes",
(unsigned long)panel->total),
size_trunc_sep(panel->total));
g_snprintf(buffer, sizeof (buffer),
ngettext("%s in %d file", "%s in %d files", panel->marked),
b_bytes, panel->marked);
if (str_term_width1 (buffer) <= cols - 2){
addstr (" ");
cols-= 2;
}
addstr (str_fit_to_term (buffer, cols, J_LEFT));
return;
}
/* Status resolves links and show them */
set_colors (panel);
@ -680,19 +649,18 @@ display_mini_info (WPanel *panel)
g_free (link);
if (len > 0){
link_target[len] = 0;
tty_printf ("-> %-*s", panel->widget.cols - 5,
name_trunc (link_target, panel->widget.cols - 5));
addstr ("-> ");
addstr (str_fit_to_term (link_target, panel->widget.cols - 5,
J_LEFT_FIT));
} else
tty_printf ("%-*s", panel->widget.cols - 2, _("<readlink failed>"));
} else if (strcmp (panel->dir.list [panel->selected].fname, "..") == 0) {
/* FIXME:
* while loading directory (do_load_dir() and do_reload_dir(),
* the actual stat info about ".." directory isn't got;
* so just don't display incorrect info about ".." directory */
tty_printf ("%-*s", panel->widget.cols - 2, _("UP--DIR"));
} else
/* Default behavior */
repaint_file (panel, panel->selected, 0, STATUS, 1);
addstr (str_fit_to_term (_("<readlink failed>"),
panel->widget.cols - 2, J_LEFT));
return;
}
/* Default behavior */
repaint_file (panel, panel->selected, 0, STATUS, 1);
return;
}
static void
@ -824,7 +792,7 @@ show_free_space (WPanel *panel)
static void
show_dir (WPanel *panel)
{
char *tmp;
int len;
set_colors (panel);
draw_double_box (panel->widget.parent,
@ -845,17 +813,12 @@ show_dir (WPanel *panel)
attrset (REVERSE_COLOR);
widget_move (&panel->widget, 0, 3);
addch (' ');
tmp = g_malloc (panel->widget.cols + 1);
tmp[panel->widget.cols] = '\0';
trim (strip_home_and_password (panel->cwd), tmp,
max (panel->widget.cols - 9, 0));
addstr (tmp);
g_free (tmp);
addch (' ');
len = min (max (panel->widget.cols - 9, 0), panel->widget.cols);
addstr (str_term_trim (strip_home_and_password (panel->cwd), len));
addch (' ');
widget_move (&panel->widget, 0, 1);
addstr ("<");
widget_move (&panel->widget, 0, panel->widget.cols - 2);
@ -1172,7 +1135,6 @@ static void
paint_frame (WPanel *panel)
{
int header_len;
int spaces, extra;
int side, width;
const char *txt;
@ -1205,11 +1167,8 @@ paint_frame (WPanel *panel)
header_len = format->field_len;
attrset (MARKED_COLOR);
spaces = (format->field_len - header_len) / 2;
extra = (format->field_len - header_len) % 2;
tty_printf ("%*s%.*s%*s", spaces, "",
header_len, txt, spaces+extra, "");
width -= 2 * spaces + extra + header_len;
addstr (str_fit_to_term (txt, format->field_len, J_CENTER_LEFT));
width -= format->field_len;
} else {
attrset (NORMAL_COLOR);
one_vline ();
@ -1962,24 +1921,49 @@ mark_file (WPanel *panel)
static void
do_search (WPanel *panel, int c_code)
{
size_t l;
int i;
size_t l, max, buf_max;
int i, sel;
int wrapped = 0;
int found;
char *act;
l = strlen (panel->search_buffer);
if (c_code == KEY_BACKSPACE) {
if (l)
panel->search_buffer[--l] = '\0';
if (l != 0) {
act = panel->search_buffer + l;
str_prev_noncomb_char (&act, panel->search_buffer);
act[0] = '\0';
}
panel->search_chpoint = 0;
} else {
if (c_code && l < sizeof (panel->search_buffer)) {
panel->search_buffer[l] = c_code;
panel->search_buffer[l + 1] = 0;
l++;
if (c_code && panel->search_chpoint < sizeof (panel->search_char)) {
panel->search_char[panel->search_chpoint] = c_code;
panel->search_chpoint++;
}
if (panel->search_chpoint > 0) {
switch (str_is_valid_char (panel->search_char, panel->search_chpoint)) {
case -2:
return;
case -1:
panel->search_chpoint = 0;
return;
default:
if (l + panel->search_chpoint < sizeof (panel->search_buffer)) {
memcpy (panel->search_buffer + l, panel->search_char,
panel->search_chpoint);
l+= panel->search_chpoint;
(panel->search_buffer + l)[0] = '\0';
panel->search_chpoint = 0;
}
}
}
}
found = 0;
buf_max = panel->case_sensitive ?
str_prefix (panel->search_buffer, panel->search_buffer) :
str_caseprefix (panel->search_buffer, panel->search_buffer);
max = 0;
sel = panel->selected;
for (i = panel->selected; !wrapped || i != panel->selected; i++) {
if (i >= panel->count) {
i = 0;
@ -1987,20 +1971,28 @@ do_search (WPanel *panel, int c_code)
break;
wrapped = 1;
}
if (panel->
case_sensitive
? (strncmp (panel->dir.list[i].fname, panel->search_buffer, l)
== 0) : (g_strncasecmp (panel->dir.list[i].fname,
panel->search_buffer, l) == 0)) {
unselect_item (panel);
panel->selected = i;
select_item (panel);
found = 1;
break;
l = panel->case_sensitive ?
str_prefix (panel->dir.list[i].fname, panel->search_buffer) :
str_caseprefix (panel->dir.list[i].fname, panel->search_buffer);
if (l > max) {
max = l;
sel = i;
if (max == buf_max) break;
}
}
if (!found)
panel->search_buffer[--l] = 0;
unselect_item (panel);
panel->selected = sel;
select_item (panel);
act = panel->search_buffer + strlen (panel->search_buffer);
while (max < buf_max) {
str_prev_char_safe (&act);
act[0] = '\0';
buf_max = panel->case_sensitive ?
str_prefix (panel->search_buffer, panel->search_buffer) :
str_caseprefix (panel->search_buffer, panel->search_buffer);
}
paint_panel (panel);
}
@ -2016,7 +2008,9 @@ start_search (WPanel *panel)
do_search (panel, 0);
} else {
panel->searching = 1;
panel->search_buffer [0] = 0;
panel->search_buffer[0] = '\0';
panel->search_char[0] = '\0';
panel->search_chpoint = 0;
display_mini_info (panel);
mc_refresh ();
}

View File

@ -135,7 +135,9 @@ void
slang_init (void)
{
SLtt_get_terminfo ();
#if SLANG_VERSION >= 20000
SLutf8_enable (-1);
#endif
/*
* If the terminal in not in terminfo but begins with a well-known
* string such as "linux" or "xterm" S-Lang will go on, but the

813
src/strutil.c Normal file
View File

@ -0,0 +1,813 @@
/* common strings utilities
Copyright (C) 2007 Free Software Foundation, Inc.
Written 2007 by:
Rostislav Benes
The file_date routine is mostly from GNU's fileutils package,
written by Richard Stallman and David MacKenzie.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include <config.h>
#include <stdlib.h>
#include <stdio.h>
#include <iconv.h>
#include <glib.h>
#include <langinfo.h>
#include <string.h>
#include <errno.h>
#include <stdarg.h>
#include "global.h"
#include "strutil.h"
//names, that are used for utf-8
static const char *str_utf8_encodings[] = {
"utf-8",
"utf8",
NULL};
// standard 8bit encodings, no wide or multibytes characters
static const char *str_8bit_encodings[] = {
"cp-1251",
"cp1251",
"cp-1250",
"cp1250",
"cp-866",
"cp866",
"cp-850",
"cp850",
"cp-852",
"cp852",
"iso-8859",
"iso8859",
"koi8",
NULL
};
// terminal encoding
static char *codeset;
// function for encoding specific operations
static struct str_class used_class;
// linked list of string buffers
static struct str_buffer *buffer_list = NULL;
iconv_t str_cnv_to_term;
iconv_t str_cnv_from_term;
iconv_t str_cnv_not_convert;
// if enc is same encoding like on terminal
static int
str_test_not_convert (const char *enc)
{
return g_ascii_strcasecmp (enc, codeset) == 0;
}
str_conv_t
str_crt_conv_to (const char *to_enc)
{
return (!str_test_not_convert (to_enc)) ? iconv_open (to_enc, codeset) :
str_cnv_not_convert;
}
str_conv_t
str_crt_conv_from (const char *from_enc)
{
return (!str_test_not_convert (from_enc)) ? iconv_open (codeset, from_enc) :
str_cnv_not_convert;
}
void
str_close_conv (str_conv_t conv)
{
if (conv != str_cnv_not_convert)
iconv_close (conv);
}
struct str_buffer *
str_get_buffer ()
{
struct str_buffer *result;
result = buffer_list;
while (result != NULL) {
if (!result->used) {
str_reset_buffer (result);
result->used = 1;
return result;
}
result = result->next;
}
result = g_new (struct str_buffer, 1);
result->size = BUF_TINY;
result->data = g_new0 (char, result->size);
result->data[0] = '\0';
result->actual = result->data;
result->remain = result->size;
result->next = buffer_list;
buffer_list = result;
result->used = 1;
return result;
}
void
str_release_buffer (struct str_buffer *buffer)
{
buffer->used = 0;
}
void
str_incrase_buffer (struct str_buffer *buffer)
{
size_t offset;
offset = buffer->actual - buffer->data;
buffer->remain+= buffer->size;
buffer->size*= 2;
buffer->data = g_renew (char, buffer->data, buffer->size);
buffer->actual = buffer->data + offset;
}
void
str_reset_buffer (struct str_buffer *buffer)
{
buffer->data[0] = '\0';
buffer->actual = buffer->data;
buffer->remain = buffer->size;
}
static int
_str_convert (str_conv_t coder, char *string, struct str_buffer *buffer)
{
int state;
size_t left;
size_t nconv;
errno = 0;
if (used_class.is_valid_string (string)) {
state = 0;
left = strlen (string);
if (coder == (iconv_t) (-1)) return ESTR_FAILURE;
iconv(coder, NULL, NULL, NULL, NULL);
while (((int)left) > 0) {
nconv = iconv(coder, &string, &left,
&(buffer->actual), &(buffer->remain));
if (nconv == (size_t) (-1)) {
switch (errno) {
case EINVAL:
return ESTR_FAILURE;
case EILSEQ:
string++;
left--;
if (buffer->remain <= 0) {
str_incrase_buffer (buffer);
}
buffer->actual[0] = '?';
buffer->actual++;
buffer->remain--;
state = ESTR_PROBLEM;
break;
case E2BIG:
str_incrase_buffer (buffer);
break;
}
}
};
return state;
} else return ESTR_FAILURE;
}
int
str_convert (str_conv_t coder, char *string, struct str_buffer *buffer)
{
int result;
result = _str_convert (coder, string, buffer);
buffer->actual[0] = '\0';
return result;
}
static int
_str_vfs_convert_from (str_conv_t coder, char *string,
struct str_buffer *buffer)
{
size_t left;
size_t nconv;
left = strlen (string);
if (coder == (iconv_t) (-1)) return ESTR_FAILURE;
iconv(coder, NULL, NULL, NULL, NULL);
do {
nconv = iconv(coder, &string, &left,
&(buffer->actual), &(buffer->remain));
if (nconv == (size_t) (-1)) {
switch (errno) {
case EINVAL:
return ESTR_FAILURE;
case EILSEQ:
return ESTR_FAILURE;
case E2BIG:
str_incrase_buffer (buffer);
break;
}
}
} while (left > 0);
return 0;
}
int
str_vfs_convert_from (str_conv_t coder, char *string, struct str_buffer *buffer)
{
int result;
if (coder == str_cnv_not_convert) {
str_insert_string (string, buffer);
result = 0;
} else result = _str_vfs_convert_from (coder, string, buffer);
buffer->actual[0] = '\0';
return result;
}
int
str_vfs_convert_to (str_conv_t coder, const char *string,
int size, struct str_buffer *buffer)
{
return used_class.vfs_convert_to (coder, string, size, buffer);
}
void
str_insert_string (const char *string, struct str_buffer *buffer)
{
size_t s;
s = strlen (string);
while (buffer->remain < s) str_incrase_buffer (buffer);
memcpy (buffer->actual, string, s);
buffer->actual+= s;
buffer->remain-= s;
buffer->actual[0] = '\0';
}
void
str_insert_string2 (const char *string, int size, struct str_buffer *buffer)
{
size_t s;
s = (size >= 0) ? size : strlen (string);
while (buffer->remain < s) str_incrase_buffer (buffer);
memcpy (buffer->actual, string, s);
buffer->actual+= s;
buffer->remain-= s;
buffer->actual[0] = '\0';
}
void
str_printf (struct str_buffer *buffer, const char *format, ...)
{
int size;
va_list ap;
va_start (ap, format);
size = vsnprintf (buffer->actual, buffer->remain, format, ap);
while (buffer->remain <= size) {
str_incrase_buffer (buffer);
size = vsnprintf (buffer->actual, buffer->remain, format, ap);
}
buffer->actual+= size;
buffer->remain-= size;
va_end (ap);
}
void
str_insert_char (char ch, struct str_buffer *buffer)
{
if (buffer->remain <= 1) str_incrase_buffer (buffer);
buffer->actual[0] = ch;
buffer->actual++;
buffer->remain--;
buffer->actual[0] = '\0';
}
void
str_insert_replace_char (struct str_buffer *buffer)
{
used_class.insert_replace_char (buffer);
}
void
str_backward_buffer (struct str_buffer *buffer, int count)
{
char *prev;
while ((count > 0) && (buffer->actual > buffer->data)) {
prev = str_get_prev_char (buffer->actual);
buffer->remain+= buffer->actual - prev;
buffer->actual = prev;
buffer->actual[0] = '\0';
count--;
}
}
int
str_translate_char (str_conv_t conv, char *keys, size_t ch_size,
char *output, size_t out_size)
{
size_t left;
size_t cnv;
iconv (conv, NULL, NULL, NULL, NULL);
left = (ch_size == (size_t)(-1)) ? strlen (keys) : ch_size;
cnv = iconv (conv, &keys, &left, &output, &out_size);
if (cnv == (size_t)(-1)) {
if (errno == EINVAL) return ESTR_PROBLEM; else return ESTR_FAILURE;
} else {
output[0] = '\0';
return 0;
}
}
static const char *
str_detect_termencoding ()
{
return (nl_langinfo(CODESET));
}
static int
str_test_encoding_class (const char *encoding, const char **table)
{
int t;
int result = 0;
for (t = 0; table[t] != NULL; t++) {
result+= (g_ascii_strncasecmp (encoding, table[t],
strlen (table[t])) == 0);
}
return result;
}
static void
str_choose_str_functions ()
{
if (str_test_encoding_class (codeset, str_utf8_encodings)) {
used_class = str_utf8_init ();
} else if (str_test_encoding_class (codeset, str_8bit_encodings)) {
used_class = str_8bit_init ();
} else {
used_class = str_ascii_init ();
}
}
void
str_init_strings (const char *termenc)
{
codeset = g_strdup ((termenc != NULL)
? termenc
: str_detect_termencoding ());
str_cnv_not_convert = iconv_open (codeset, codeset);
if (str_cnv_not_convert == INVALID_CONV) {
if (termenc != NULL) {
g_free (codeset);
codeset = g_strdup (str_detect_termencoding ());
str_cnv_not_convert = iconv_open (codeset, codeset);
}
if (str_cnv_not_convert == INVALID_CONV) {
g_free (codeset);
codeset = g_strdup ("ascii");
str_cnv_not_convert = iconv_open (codeset, codeset);
}
}
str_cnv_to_term = str_cnv_not_convert;
str_cnv_from_term = str_cnv_not_convert;
str_choose_str_functions ();
}
static void
str_release_buffer_list ()
{
struct str_buffer *buffer;
struct str_buffer *next;
buffer = buffer_list;
while (buffer != NULL) {
next = buffer->next;
g_free (buffer->data);
g_free (buffer);
buffer = next;
}
}
void
str_uninit_strings ()
{
str_release_buffer_list ();
iconv_close (str_cnv_not_convert);
}
const char *
str_term_form (const char *text)
{
return used_class.term_form (text);
}
const char *
str_fit_to_term (const char *text, int width, int just_mode)
{
return used_class.fit_to_term (text, width, just_mode);
}
const char *
str_term_trim (const char *text, int width)
{
return used_class.term_trim (text, width);
}
void
str_msg_term_size (const char *text, int *lines, int *columns)
{
return used_class.msg_term_size (text, lines, columns);
}
const char *
str_term_substring (const char *text, int start, int width)
{
return used_class.term_substring (text, start, width);
}
char *
str_get_next_char (char *text)
{
used_class.cnext_char ((const char **)&text);
return text;
}
const char *
str_cget_next_char (const char *text)
{
used_class.cnext_char (&text);
return text;
}
void
str_next_char (char **text)
{
used_class.cnext_char ((const char **) text);
}
void
str_cnext_char (const char **text)
{
used_class.cnext_char (text);
}
char *
str_get_prev_char (char *text)
{
used_class.cprev_char ((const char **) &text);
return text;
}
const char *
str_cget_prev_char (const char *text)
{
used_class.cprev_char (&text);
return text;
}
void
str_prev_char (char **text)
{
used_class.cprev_char ((const char **) text);
}
void
str_cprev_char (const char **text)
{
used_class.cprev_char (text);
}
char *
str_get_next_char_safe (char *text)
{
used_class.cnext_char_safe ((const char **) &text);
return text;
}
const char *
str_cget_next_char_safe (const char *text)
{
used_class.cnext_char_safe (&text);
return text;
}
void
str_next_char_safe (char **text)
{
used_class.cnext_char_safe ((const char **) text);
}
void
str_cnext_char_safe (const char **text)
{
used_class.cnext_char_safe (text);
}
char *
str_get_prev_char_safe (char *text)
{
used_class.cprev_char_safe ((const char **) &text);
return text;
}
const char *
str_cget_prev_char_safe (const char *text)
{
used_class.cprev_char_safe (&text);
return text;
}
void
str_prev_char_safe (char **text)
{
used_class.cprev_char_safe ((const char **) text);
}
void
str_cprev_char_safe (const char **text)
{
used_class.cprev_char_safe (text);
}
int
str_next_noncomb_char (char **text)
{
return used_class.cnext_noncomb_char ((const char **) text);
}
int
str_cnext_noncomb_char (const char **text)
{
return used_class.cnext_noncomb_char (text);
}
int
str_prev_noncomb_char (char **text, const char *begin)
{
return used_class.cprev_noncomb_char ((const char **) text, begin);
}
int
str_cprev_noncomb_char (const char **text, const char *begin)
{
return used_class.cprev_noncomb_char (text, begin);
}
int
str_is_valid_char (const char *ch, size_t size)
{
return used_class.is_valid_char (ch, size);
}
int
str_term_width1 (const char *text)
{
return used_class.term_width1 (text);
}
int
str_term_width2 (const char *text, size_t length)
{
return used_class.term_width2 (text, length);
}
int
str_term_char_width (const char *text)
{
return used_class.term_char_width (text);
}
int
str_offset_to_pos (const char* text, size_t length)
{
return used_class.offset_to_pos (text, length);
}
int
str_length (const char* text)
{
return used_class.length (text);
}
int
str_length2 (const char* text, int size)
{
return used_class.length2 (text, size);
}
int
str_length_noncomb (const char* text)
{
return used_class.length_noncomb (text);
}
int
str_column_to_pos (const char *text, size_t pos)
{
return used_class.column_to_pos (text, pos);
}
int
str_isspace (const char *ch)
{
return used_class.isspace (ch);
}
int
str_ispunct (const char *ch)
{
return used_class.ispunct (ch);
}
int
str_isalnum (const char *ch)
{
return used_class.isalnum (ch);
}
int
str_isdigit (const char *ch)
{
return used_class.isdigit (ch);
}
int
str_toupper (const char *ch, char **out, size_t *remain)
{
return used_class.toupper (ch, out, remain);
}
int
str_tolower (const char *ch, char **out, size_t *remain)
{
return used_class.tolower (ch, out, remain);
}
int
str_isprint (const char *ch)
{
return used_class.isprint (ch);
}
int
str_iscombiningmark (const char *ch)
{
return used_class.iscombiningmark (ch);
}
const char *
str_trunc (const char *text, int width)
{
return used_class.trunc (text, width);
}
char *
str_create_search_needle (const char *needle, int case_sen)
{
return used_class.create_search_needle (needle, case_sen);
}
void
str_release_search_needle (char *needle, int case_sen)
{
used_class.release_search_needle (needle, case_sen);
}
const char *
str_search_first (const char *text, const char *search, int case_sen)
{
return used_class.search_first (text, search, case_sen);
}
const char *
str_search_last (const char *text, const char *search, int case_sen)
{
return used_class.search_last (text, search, case_sen);
}
int
str_is_valid_string (const char *text)
{
return used_class.is_valid_string (text);
}
int
str_compare (const char *t1, const char *t2)
{
return used_class.compare (t1, t2);
}
int
str_ncompare (const char *t1, const char *t2)
{
return used_class.ncompare (t1, t2);
}
int
str_casecmp (const char *t1, const char *t2)
{
return used_class.casecmp (t1, t2);
}
int
str_ncasecmp (const char *t1, const char *t2)
{
return used_class.ncasecmp (t1, t2);
}
int
str_prefix (const char *text, const char *prefix)
{
return used_class.prefix (text, prefix);
}
int
str_caseprefix (const char *text, const char *prefix)
{
return used_class.caseprefix (text, prefix);
}
void
str_fix_string (char *text)
{
used_class.fix_string (text);
}
char *
str_create_key (const char *text, int case_sen)
{
return used_class.create_key (text, case_sen);
}
char *
str_create_key_for_filename (const char *text, int case_sen)
{
return used_class.create_key_for_filename (text, case_sen);
}
int
str_key_collate (const char *t1, const char *t2, int case_sen)
{
return used_class.key_collate (t1, t2, case_sen);
}
void
str_release_key (char *key, int case_sen)
{
used_class.release_key (key, case_sen);
}

537
src/strutil.h Normal file
View File

@ -0,0 +1,537 @@
#ifndef MC_STRUTIL_H
#define MC_STRUTIL_H
/* Header file for strutil.c, strutilascii.c, strutil8bit.c, strutilutf8.c.
* There are two sort of functions:
* 1. functions for working with growing strings and conversion strings between
* different encodings.
* (implemented directly in strutil.c)
* 2. functions, that hide differences between encodings derived from ASCII.
* (implemented separately in strutilascii.c, strutil8bit.c, strutilutf8.c)
* documentation is made for UTF-8 version of functions.
*/
/* invalid strings
* function, that works with invalid strings are marked with "I"
* in documentation
* invalid bytes of string are handled as one byte characters with width 1, they
* are displayed as questionmarks, I-maked comparing functions try to keep
* the original value of these bytes.
*/
/* combining characters
* displaynig: all handled as zero with characters, expect combing character
* at the begin of string, this character has with one (space add before),
* so str_term_width is not good for computing width of singles characters
* (never return zero, expect emtpy string)
* for compatibility are strings composed before displaynig
* comparing: comparing decompose all string before comparing, n-compare
* functions do not work as is usual, because same strings do not have to be
* same length in UTF-8. So they return 0 if one string is prefix of the other
* one.
* str_prefix is used to determine, how many characters from one string are
* prefix in second string. However, str_prefix return number of characters in
* decompose form. (used in do_search (screen.c))
*/
#include <iconv.h>
/* errors for conversion function:
* problem means, that not every characters was successfully converted (They are
* replaced with questionmark). So is impossible convert string back.
* failure means, that conversion is not possible (example: wrong encoding
* of input string)
*/
#define ESTR_PROBLEM 1
#define ESTR_FAILURE 2
/* constanst originally from screen.c
* used for alignment strings on terminal
*/
#define J_LEFT 0x01
#define J_RIGHT 0x02
#define J_CENTER 0x03
// if there is enough space for string on terminal, string is centered
// otherwise is aligned to left
#define J_CENTER_LEFT 0x04
#define IS_FIT(x) ((x) & 0x0010)
#define MAKE_FIT(x) ((x) | 0x0010)
#define HIDE_FIT(x) ((x) & 0x000f)
// fit alignment, if string is to long, is truncated with '~'
#define J_LEFT_FIT 0x11
#define J_RIGHT_FIT 0x12
#define J_CENTER_FIT 0x13
#define J_CENTER_LEFT_FIT 0x14
// redefinition of iconv_t, so is not needed include iconv.h in other files.
typedef iconv_t str_conv_t;
#define INVALID_CONV ((iconv_t) (-1))
// standard convertors
extern str_conv_t str_cnv_to_term;
extern str_conv_t str_cnv_from_term;
// from terminal encoding to terminal encoding
extern str_conv_t str_cnv_not_convert;
/* structure for growing strings
* try to avoid set any members manually
*/
struct str_buffer {
// all buffers are stored in linked list
struct str_buffer *next;
// if is buffer in use or not
int used;
// whole string
char *data;
// size of string
size_t size;
// end of string, actual[0] is always '\0'
char *actual;
// how many (chars)bytes remain after actual
size_t remain;
};
// all functions in str_class must be defined for every encoding
struct str_class {
int (*vfs_convert_to) (str_conv_t coder, const char *string,
int size, struct str_buffer *buffer); //I
void (*insert_replace_char) (struct str_buffer *buffer);
int (*is_valid_string) (const char *); //I
int (*is_valid_char) (const char *, size_t); //I
void (*cnext_char) (const char **);
void (*cprev_char) (const char **);
void (*cnext_char_safe) (const char **); //I
void (*cprev_char_safe) (const char **); //I
int (*cnext_noncomb_char) (const char **text); //I
int (*cprev_noncomb_char) (const char **text, const char *begin); //I
int (*isspace) (const char *); //I
int (*ispunct) (const char *); //I
int (*isalnum) (const char *); //I
int (*isdigit) (const char *); //I
int (*isprint) (const char *); //I
int (*iscombiningmark) (const char *); //I
int (*length) (const char *); //I
int (*length2) (const char *, int); //I
int (*length_noncomb) (const char *); //I
int (*toupper) (const char *, char **, size_t *);
int (*tolower) (const char *, char **, size_t *);
void (*fix_string) (char *); //I
const char *(*term_form) (const char *); //I
const char *(*fit_to_term) (const char *, int, int); //I
const char *(*term_trim) (const char *text, int width); //I
void (*msg_term_size) (const char *, int *, int *); //I
const char *(*term_substring) (const char *, int, int); //I
int (*term_width1) (const char *); //I
int (*term_width2) (const char *, size_t); //I
int (*term_char_width) (const char *); //I
const char *(*trunc) (const char *, int); //I
int (*offset_to_pos) (const char *, size_t); //I
int (*column_to_pos) (const char *, size_t); //I
char *(*create_search_needle) (const char *, int);
void (*release_search_needle) (char *, int);
const char *(*search_first) (const char *, const char *, int);
const char *(*search_last) (const char *, const char *, int);
int (*compare) (const char *, const char *); //I
int (*ncompare) (const char *, const char *); //I
int (*casecmp) (const char *, const char *); //I
int (*ncasecmp) (const char *, const char *); //I
int (*prefix) (const char *, const char *); //I
int (*caseprefix) (const char *, const char *); //I
char *(*create_key) (const char *text, int case_sen); //I
char *(*create_key_for_filename) (const char *text, int case_sen); //I
int (*key_collate) (const char *t1, const char *t2, int case_sen); //I
void (*release_key) (char *key, int case_sen); //I
};
struct str_class str_utf8_init ();
struct str_class str_8bit_init ();
struct str_class str_ascii_init ();
/* create convertor from "from_enc" to terminal encoding
* if "from_enc" is not supported return INVALID_CONV
*/
str_conv_t str_crt_conv_from (const char *from_enc);
/* create convertor from terminal encoding to "to_enc"
* if "to_enc" is not supported return INVALID_CONV
*/
str_conv_t str_crt_conv_to (const char *to_enc);
/* close convertor, do not close str_cnv_to_term, str_cnv_from_term,
* str_cnv_not_convert
*/
void str_close_conv (str_conv_t conv);
/* return on of not used buffers (.used == 0) or create new
* returned buffer has set .used to 1
*/
struct str_buffer *str_get_buffer ();
/* clear buffer, in .data is empty string, .actual = .data, .remain = .size
* do not set .used
*/
void str_reset_buffer (struct str_buffer *buffer);
/* set .used of buffer to 0, so can be returned by str_get_buffer again
* data in buffer may stay valid after function return
*/
void str_release_buffer (struct str_buffer *buffer);
/* incrase capacity of buffer
*/
void str_incrase_buffer (struct str_buffer *buffer);
/* convert string using coder, result of conversion is appended at end of buffer
* return 0 if there was no problem.
* otherwise return ESTR_PROBLEM or ESTR_FAILURE
*/
int str_convert (str_conv_t coder, char *string,
struct str_buffer *buffer);
/* return only 0 or ESTR_FAILURE, because vfs must be able to convert result to
* original string. (so no replace with questionmark)
* if coder is str_cnv_from_term or str_cnv_not_convert, string is only copied,
* so is possible to show file, that is not valid in terminal encoding
*/
int str_vfs_convert_from (str_conv_t coder, char *string,
struct str_buffer *buffer);
/* if coder is str_cnv_to_term or str_cnv_not_convert, string is only copied,
* does replace with questionmark
* I
*/
int str_vfs_convert_to (str_conv_t coder, const char *string,
int size, struct str_buffer *buffer);
/* append string at the end of buffer
*/
void str_insert_string (const char *string, struct str_buffer *buffer);
/* append string at the end of buffer, limit to size
*/
void
str_insert_string2 (const char *string, int size, struct str_buffer *buffer);
/* printf functin for str_buffer, append result of printf at the end of buffer
*/
void
str_printf (struct str_buffer *buffer, const char *format, ...);
/* append char at the end of buffer
*/
void str_insert_char (char ch, struct str_buffer *buffer);
/* add standard replacement character in terminal encoding
*/
void str_insert_replace_char (struct str_buffer *buffer);
/* rewind "count" characters buffer back
*/
void str_backward_buffer (struct str_buffer *buffer, int count);
/* init strings and set terminal encoding,
* if is termenc NULL, detect terminal encoding
* create all str_cnv_* and set functions for terminal encoding
*/
void str_init_strings (const char *termenc);
/* free all str_buffer and all str_cnv_*
*/
void str_uninit_strings ();
/* try convert characters in ch to output using conv
* ch_size is size of ch, can by (size_t)(-1) (-1 only for ASCII
* compatible encoding, for other must be set)
* return 0 if conversion was successfully, ESTR_PROBLEM if ch contains only
* part of characters, ESTR_FAILURE if conversion is not possible
*/
int str_translate_char (str_conv_t conv, char *ch, size_t ch_size,
char *output, size_t out_size);
/* test, if text is valid in terminal encoding
* I
*/
int str_is_valid_string (const char *text);
/* test, if first char of ch is valid
* size, how many bytes characters occupied, could be (size_t)(-1)
* return 1 if it is valid, -1 if it is invalid or -2 if it is only part of
* multibyte character
* I
*/
int str_is_valid_char (const char *ch, size_t size);
/* return next characters after text, do not call on the end of string
*/
char *str_get_next_char (char *text);
const char *str_cget_next_char (const char *text);
/* return previous characters before text, do not call on the start of strings
*/
char *str_get_prev_char (char *text);
const char *str_cget_prev_char (const char *text);
/* set text to next characters, do not call on the end of string
*/
void str_next_char (char **text);
void str_cnext_char (const char **text);
/* set text to previous characters, do not call on the start of strings
*/
void str_prev_char (char **text);
void str_cprev_char (const char **text);
/* return next characters after text, do not call on the end of string
* works with invalid string
* I
*/
char *str_get_next_char_safe (char *text);
const char *str_cget_next_char_safe (const char *text);
/* return previous characters before text, do not call on the start of strings
* works with invalid string
* I
*/
char *str_get_prev_char_safe (char *text);
const char *str_cget_prev_char_safe (const char *text);
/* set text to next characters, do not call on the end of string
* works with invalid string
* I
*/
void str_next_char_safe (char **text);
void str_cnext_char_safe (const char **text);
/* set text to previous characters, do not call on the start of strings
* works with invalid string
* I
*/
void str_prev_char_safe (char **text);
void str_cprev_char_safe (const char **text);
/* set text to next noncombining characters, check the end of text
* return how many characters was skipped
* works with invalid string
* I
*/
int str_next_noncomb_char (char **text);
int str_cnext_noncomb_char (const char **text);
/* set text to previous noncombining characters, search stop at begin
* return how many characters was skipped
* works with invalid string
* I
*/
int str_prev_noncomb_char (char **text, const char *begin);
int str_cprev_noncomb_char (const char **text, const char *begin);
/* if first characters in ch is space, tabulator or new lines
* I
*/
int str_isspace (const char *ch);
/* if first characters in ch is punctuation or symbol
* I
*/
int str_ispunct (const char *ch);
/* if first characters in ch is alphanum
* I
*/
int str_isalnum (const char *ch);
/* if first characters in ch is digit
* I
*/
int str_isdigit (const char *ch);
/* if first characters in ch is printable
* I
*/
int str_isprint (const char *ch);
/* if first characters in ch is a combining mark (only in utf-8)
* combining makrs are assumed to be zero width
* I
*/
int str_iscombiningmark (const char *ch);
/* write lower from of fisrt characters in ch into out
* decrase remain by size of returned characters
* if out is not big enough, do nothing
*/
int str_toupper (const char *ch, char **out, size_t *remain);
/* write upper from of fisrt characters in ch into out
* decrase remain by size of returned characters
* if out is not big enough, do nothing
*/
int str_tolower (const char *ch, char **out, size_t *remain);
/* return length of text in characters
* I
*/
int str_length (const char* text);
/* return length of text in characters, limit to size
* I
*/
int str_length2 (const char* text, int size);
/* return length of text in characters, count only noncombining characters
* I
*/
int str_length_noncomb (const char* text);
/* replace all invalid characters in text with questionmark
* after return, text is valid string in terminal encoding
* I
*/
void str_fix_string (char* text);
/* replace all invalid characters in text with questionmark
* replace all unprintable characters with '.'
* return static allocated string, "text" is not changed
* returned string do not need to be freed
* I
*/
const char *str_term_form (const char *text);
/* like str_term_form, but text can be alignment to width
* alignment is specified in just_mode (J_LEFT, J_LEFT_FIT, ...)
* result is completed with spaces to width
* I
*/
const char *str_fit_to_term (const char *text, int width, int just_mode);
/* like str_term_form, but when text is wider than width, three dots are
* inserted at begin and result is completed with suffix of text
* no additional spaces are inserted
* I
*/
const char *str_term_trim (const char *text, int width);
/* return how many lines and columns will text occupy on terminal
* I
*/
void str_msg_term_size (const char *text, int *lines, int *columns);
/* like str_term_form, but return only specified substring
* start - column (position) on terminal, where substring begin
* result is completed with spaces to width
* I
*/
const char *str_term_substring (const char *text, int start, int width);
/* return width, that will be text occupied on terminal
* I
*/
int str_term_width1 (const char *text);
/* return width, that will be text occupied on terminal
* text is limited by length in characters
* I
*/
int str_term_width2 (const char *text, size_t length);
/* return width, that will be character occupied on terminal
* combining characters are always zero width
* I
*/
int str_term_char_width (const char *text);
/* convert position in characters to position in bytes
* I
*/
int str_offset_to_pos (const char* text, size_t length);
/* convert position on terminal to position in characters
* I
*/
int str_column_to_pos (const char *text, size_t pos);
/* like str_fit_to_term width just_mode = J_LEFT_FIT,
* but do not insert additional spaces
* I
*/
const char *str_trunc (const char *text, int width);
/* create needle, that will be searched in str_search_fist/last,
* so needle can be reused
* in UTF-8 return normalized form of needle
*/
char *str_create_search_needle (const char *needle, int case_sen);
/* free needle returned by str_create_search_needle
*/
void str_release_search_needle (char *needle, int case_sen);
/* search for first occurrence of search in text
*/
const char *str_search_first (const char *text, const char *needle, int case_sen);
/* search for last occurrence of search in text
*/
const char *str_search_last (const char *text, const char *needle, int case_sen);
/* case sensitive compare two strings
* I
*/
int str_compare (const char *t1, const char *t2);
/* case sensitive compare two strings
* if one string is prefix of the other string, return 0
* I
*/
int str_ncompare (const char *t1, const char *t2);
/* case insensitive compare two strings
* I
*/
int str_casecmp (const char *t1, const char *t2);
/* case insensitive compare two strings
* if one string is prefix of the other string, return 0
* I
*/
int str_ncasecmp (const char *t1, const char *t2);
/* return, how many bytes are are same from start in text and prefix
* both strings are decomposed befor comapring and return value is counted
* in decomposed form, too. caling with prefix, prefix, you get size in bytes
* of prefix in decomposed form,
* I
*/
int str_prefix (const char *text, const char *prefix);
/* case insensitive version of str_prefix
* I
*/
int str_caseprefix (const char *text, const char *prefix);
/* create a key that is used by str_key_collate
* I
*/
char *str_create_key (const char *text, int case_sen);
/* create a key that is used by str_key_collate
* should aware dot '.' in text
* I
*/
char *str_create_key_for_filename (const char *text, int case_sen);
/* compare two string using LC_COLLATE, if is possible
* if case_sen is set, comparing is case sensitive,
* case_sen must be same for str_create_key, str_key_collate and str_release_key
* I
*/
int str_key_collate (const char *t1, const char *t2, int case_sen);
/* release_key created by str_create_key, only rigth way to release key
* I
*/
void str_release_key (char *key, int case_sen);
#endif

673
src/strutil8bit.c Normal file
View File

@ -0,0 +1,673 @@
/* 8bit strings utilities
Copyright (C) 2007 Free Software Foundation, Inc.
Written 2007 by:
Rostislav Benes
The file_date routine is mostly from GNU's fileutils package,
written by Richard Stallman and David MacKenzie.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include <config.h>
#include <stdio.h>
#include <ctype.h>
#include <errno.h>
#include <iconv.h>
#include "global.h"
#include "strutil.h"
/* functions for singlebyte encodings, all characters have width 1
* using standard system functions
* there are only small differences between functions in strutil8bit.c
* and strutilascii.c
*/
static const char replch = '?';
static void
str_8bit_insert_replace_char (struct str_buffer *buffer)
{
str_insert_char (replch, buffer);
}
static int
str_8bit_is_valid_string (const char *text)
{
return 1;
}
static int
str_8bit_is_valid_char (const char *ch, size_t size)
{
return 1;
}
static void
str_8bit_cnext_char (const char **text)
{
(*text)++;
}
static void
str_8bit_cprev_char (const char **text)
{
(*text)--;
}
static int
str_8bit_cnext_noncomb_char (const char **text)
{
if (*text[0] != '\0') {
(*text)++;
return 1;
} else return 0;
}
static int
str_8bit_cprev_noncomb_char (const char **text, const char *begin)
{
if ((*text) != begin) {
(*text)--;
return 1;
} else return 0;
}
static int
str_8bit_isspace (const char *text)
{
return isspace (text[0]);
}
static int
str_8bit_ispunct (const char *text)
{
return ispunct (text[0]);
}
static int
str_8bit_isalnum (const char *text)
{
return isalnum (text[0]);
}
static int
str_8bit_isdigit (const char *text)
{
return isdigit (text[0]);
}
static int
str_8bit_isprint (const char *text)
{
return isprint (text[0]);
}
static int
str_8bit_iscombiningmark (const char *text)
{
return 0;
}
static int
str_8bit_toupper (const char *text, char **out, size_t *remain)
{
if (*remain <= 1) return 0;
(*out)[0] = toupper ((unsigned char) text[0]);
(*out)++;
(*remain)--;
return 1;
}
static int
str_8bit_tolower (const char *text, char **out, size_t *remain)
{
if (*remain <= 1) return 0;
(*out)[0] = tolower ((unsigned char) text[0]);
(*out)++;
(*remain)--;
return 1;
}
static int
str_8bit_length (const char *text)
{
return strlen (text);
}
static int
str_8bit_length2 (const char *text, int size)
{
return (size >= 0) ? min (strlen (text), size) : strlen (text);
}
static int
_str_8bit_vfs_convert_to (str_conv_t coder, char *string,
int size, struct str_buffer *buffer)
{
int state;
size_t left;
size_t nconv;
errno = 0;
state = 0;
left = (size >= 0) ? size : strlen (string);
if (coder == (iconv_t) (-1)) return ESTR_FAILURE;
iconv(coder, NULL, NULL, NULL, NULL);
while (((int)left) > 0) {
nconv = iconv(coder, &string, &left,
&(buffer->actual), &(buffer->remain));
if (nconv == (size_t) (-1)) {
switch (errno) {
case EINVAL:
return ESTR_FAILURE;
case EILSEQ:
string++;
left--;
str_insert_char ('?', buffer);
state = ESTR_PROBLEM;
break;
case E2BIG:
str_incrase_buffer (buffer);
break;
}
}
}
return state;
}
int
str_8bit_vfs_convert_to (str_conv_t coder, const char *string,
int size, struct str_buffer *buffer)
{
int result;
if (coder == str_cnv_not_convert) {
str_insert_string2 (string, size, buffer);
result = 0;
} else result = _str_8bit_vfs_convert_to (coder, (char*)string, size, buffer);
buffer->actual[0] = '\0';
return result;
}
static const char *
str_8bit_term_form (const char *text)
{
static char result[BUF_MEDIUM];
char *actual;
size_t remain;
size_t length;
size_t pos = 0;
actual = result;
remain = sizeof (result);
length = strlen (text);
for (; pos < length && remain > 1; pos++, actual++, remain--) {
actual[0] = isprint (text[pos]) ? text[pos] : '.';
}
actual[0] = '\0';
return result;
}
static const char *
str_8bit_fit_to_term (const char *text, int width, int just_mode)
{
static char result[BUF_MEDIUM];
char *actual;
size_t remain;
int ident;
size_t length;
size_t pos = 0;
length = strlen (text);
actual = result;
remain = sizeof(result);
if (length <= width) {
ident = 0;
switch (HIDE_FIT (just_mode)) {
case J_CENTER_LEFT:
case J_CENTER:
ident = (width - length) / 2;
break;
case J_RIGHT:
ident = width - length;
break;
}
if (remain <= ident) goto finally;
memset (actual, ' ', ident);
actual+= ident;
remain-= ident;
for (; pos < length && remain > 1; pos++, actual++, remain--) {
actual[0] = isprint (text[pos]) ? text[pos] : '.';
}
if (width - length - ident > 0) {
if (remain <= width - length - ident) goto finally;
memset (actual, ' ', width - length - ident);
actual+= width - length - ident;
remain-= width - length - ident;
}
} else {
if (IS_FIT (just_mode)) {
for (; pos + 1 <= width / 2 && remain > 1;
actual++, pos++, remain--) {
actual[0] = isprint (text[pos]) ? text[pos] : '.';
}
if (remain <= 1) goto finally;
actual[0] = '~';
actual++;
remain--;
pos+= length - width + 1;
for (; pos < length && remain > 1; pos++, actual++, remain--) {
actual[0] = isprint (text[pos]) ? text[pos] : '.';
}
} else {
ident = 0;
switch (HIDE_FIT (just_mode)) {
case J_CENTER:
ident = (length - width) / 2;
break;
case J_RIGHT:
ident = length - width;
break;
}
pos+= ident;
for (; pos < ident + width && remain > 1;
pos++, actual++, remain--) {
actual[0] = isprint (text[pos]) ? text[pos] : '.';
}
}
}
finally:
actual[0] = '\0';
return result;
}
static const char *
str_8bit_term_trim (const char *text, int width)
{
static char result[BUF_MEDIUM];
size_t remain;
char *actual;
size_t pos = 0;
size_t length;
length = strlen (text);
actual = result;
remain = sizeof (result);
if (width < length) {
if (width <= 3) {
memset (actual, '.', width);
actual+= width;
remain-= width;
} else {
memset (actual, '.', 3);
actual+= 3;
remain-= 3;
pos+= length - width + 3;
for (; pos < length && remain > 1; pos++, actual++, remain--) {
actual[0] = isprint (text[pos]) ? text[pos] : '.';
}
}
} else {
for (; pos < length && remain > 1; pos++, actual++, remain--) {
actual[0] = isprint (text[pos]) ? text[pos] : '.';
}
}
actual[0] = '\0';
return result;
}
static int
str_8bit_term_width2 (const char *text, size_t length)
{
return (length != (size_t)(-1))
? min (strlen (text), length)
: strlen (text);
}
static int
str_8bit_term_width1 (const char *text)
{
return str_8bit_term_width2 (text, (size_t)(-1));
}
static int
str_8bit_term_char_width (const char *text)
{
return 1;
}
static void
str_8bit_msg_term_size (const char *text, int *lines, int *columns)
{
(*lines) = 1;
(*columns) = 0;
char *p, *tmp = g_strdup (text);
char *q;
char c = '\0';
int width;
p = tmp;
for (;;) {
q = strchr (p, '\n');
if (q != NULL) {
c = q[0];
q[0] = '\0';
}
width = str_8bit_term_width1 (p);
if (width > (*columns)) (*columns) = width;
if (q == NULL)
break;
q[0] = c;
p = q + 1;
(*lines)++;
}
g_free (tmp);
}
static const char *
str_8bit_term_substring (const char *text, int start, int width)
{
static char result[BUF_MEDIUM];
size_t remain;
char *actual;
size_t pos = 0;
size_t length;
actual = result;
remain = sizeof (result);
length = strlen (text);
if (start < length) {
pos+= start;
for (; pos < length && width > 0 && remain > 1;
pos++, width--, actual++, remain--) {
actual[0] = isprint (text[pos]) ? text[pos] : '.';
}
}
for (; width > 0 && remain > 1; actual++, remain--, width--) {
actual[0] = ' ';
}
actual[0] = '\0';
return result;
}
static const char *
str_8bit_trunc (const char *text, int width)
{
static char result[MC_MAXPATHLEN];
int remain;
char *actual;
size_t pos = 0;
size_t length;
actual = result;
remain = sizeof (result);
length = strlen (text);
if (length > width) {
for (; pos + 1 <= width / 2 && remain > 1; actual++, pos++, remain--) {
actual[0] = isprint (text[pos]) ? text[pos] : '.';
}
if (remain <= 1) goto finally;
actual[0] = '~';
actual++;
remain--;
pos+= length - width + 1;
for (; pos < length && remain > 1; pos++, actual++, remain--) {
actual[0] = isprint (text[pos]) ? text[pos] : '.';
}
} else {
for (; pos < length && remain > 1; pos++, actual++, remain--) {
actual[0] = isprint (text[pos]) ? text[pos] : '.';
}
}
finally:
actual[0] = '\0';
return result;
}
static int
str_8bit_offset_to_pos (const char *text, size_t length)
{
return (int)length;
}
static int
str_8bit_column_to_pos (const char *text, size_t pos)
{
return (int)pos;
}
static char *
str_8bit_create_search_needle (const char *needle, int case_sen)
{
return (char*) needle;
}
static void
str_8bit_release_search_needle (char *needle, int case_sen)
{
}
static const char *
str_8bit_search_first (const char *text, const char *search, int case_sen)
{
char *fold_text;
char *fold_search;
const char *match;
size_t offsset;
fold_text = (case_sen) ? (char*) text : g_strdown (g_strdup (text));
fold_search = (case_sen) ? (char*) text : g_strdown (g_strdup (search));
match = g_strstr_len (fold_text, -1, fold_search);
if (match != NULL) {
offsset = match - fold_text;
match = text + offsset;
}
if (!case_sen) {
g_free (fold_text);
g_free (fold_search);
}
return match;
}
static const char *
str_8bit_search_last (const char *text, const char *search, int case_sen)
{
char *fold_text;
char *fold_search;
const char *match;
size_t offsset;
fold_text = (case_sen) ? (char*) text : g_strdown (g_strdup (text));
fold_search = (case_sen) ? (char*) text : g_strdown (g_strdup (search));
match = g_strrstr_len (fold_text, -1, fold_search);
if (match != NULL) {
offsset = match - fold_text;
match = text + offsset;
}
if (!case_sen) {
g_free (fold_text);
g_free (fold_search);
}
return match;
}
static int
str_8bit_compare (const char *t1, const char *t2)
{
return strcmp (t1, t2);
}
static int
str_8bit_ncompare (const char *t1, const char *t2)
{
return strncmp (t1, t2, min (strlen (t1), strlen (t2)));
}
static int
str_8bit_casecmp (const char *t1, const char *t2)
{
return g_strcasecmp (t1, t2);
}
static int
str_8bit_ncasecmp (const char *t1, const char *t2)
{
return g_strncasecmp (t1, t2, min (strlen (t1), strlen (t2)));
}
static int
str_8bit_prefix (const char *text, const char *prefix)
{
int result;
for (result = 0; text[result] != '\0' && prefix[result] != '\0'
&& text[result] == prefix[result]; result++);
return result;
}
static int
str_8bit_caseprefix (const char *text, const char *prefix)
{
int result;
for (result = 0; text[result] != '\0' && prefix[result] != '\0'
&& toupper (text[result]) == toupper (prefix[result]);
result++);
return result;
}
static void
str_8bit_fix_string (char *text)
{
}
static char *
str_8bit_create_key (const char *text, int case_sen)
{
return (case_sen) ? (char*)text : g_strdown (g_strdup (text));
}
static int
str_8bit_key_collate (const char *t1, const char *t2, int case_sen)
{
if (case_sen) return strcmp (t1, t2);
else return strcoll (t1, t2);
}
static void
str_8bit_release_key (char *key, int case_sen)
{
if (!case_sen) g_free (key);
}
struct str_class
str_8bit_init ()
{
struct str_class result;
result.vfs_convert_to = str_8bit_vfs_convert_to;
result.insert_replace_char = str_8bit_insert_replace_char;
result.is_valid_string = str_8bit_is_valid_string;
result.is_valid_char = str_8bit_is_valid_char;
result.cnext_char = str_8bit_cnext_char;
result.cprev_char = str_8bit_cprev_char;
result.cnext_char_safe = str_8bit_cnext_char;
result.cprev_char_safe = str_8bit_cprev_char;
result.cnext_noncomb_char = str_8bit_cnext_noncomb_char;
result.cprev_noncomb_char = str_8bit_cprev_noncomb_char;
result.isspace = str_8bit_isspace;
result.ispunct = str_8bit_ispunct;
result.isalnum = str_8bit_isalnum;
result.isdigit = str_8bit_isdigit;
result.isprint = str_8bit_isprint;
result.iscombiningmark = str_8bit_iscombiningmark;
result.toupper = str_8bit_toupper;
result.tolower = str_8bit_tolower;
result.length = str_8bit_length;
result.length2 = str_8bit_length2;
result.length_noncomb = str_8bit_length;
result.fix_string = str_8bit_fix_string;
result.term_form = str_8bit_term_form;
result.fit_to_term = str_8bit_fit_to_term;
result.term_trim = str_8bit_term_trim;
result.term_width2 = str_8bit_term_width2;
result.term_width1 = str_8bit_term_width1;
result.term_char_width = str_8bit_term_char_width;
result.msg_term_size = str_8bit_msg_term_size;
result.term_substring = str_8bit_term_substring;
result.trunc = str_8bit_trunc;
result.offset_to_pos = str_8bit_offset_to_pos;
result.column_to_pos = str_8bit_column_to_pos;
result.create_search_needle = str_8bit_create_search_needle;
result.release_search_needle = str_8bit_release_search_needle;
result.search_first = str_8bit_search_first;
result.search_last = str_8bit_search_last;
result.compare = str_8bit_compare;
result.ncompare = str_8bit_ncompare;
result.casecmp = str_8bit_casecmp;
result.ncasecmp = str_8bit_ncasecmp;
result.prefix = str_8bit_prefix;
result.caseprefix = str_8bit_caseprefix;
result.create_key = str_8bit_create_key;
result.create_key_for_filename = str_8bit_create_key;
result.key_collate = str_8bit_key_collate;
result.release_key = str_8bit_release_key;
return result;
}

657
src/strutilascii.c Normal file
View File

@ -0,0 +1,657 @@
/* ASCII strings utilities
Copyright (C) 2007 Free Software Foundation, Inc.
Written 2007 by:
Rostislav Benes
The file_date routine is mostly from GNU's fileutils package,
written by Richard Stallman and David MacKenzie.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include <stdio.h>
#include <ctype.h>
#include <config.h>
#include <errno.h>
#include <iconv.h>
#include "global.h"
#include "strutil.h"
/* using g_ascii function from glib
* on terminal are showed only ascii characters (lower then 0x80)
*/
static const char replch = '?';
static void
str_ascii_insert_replace_char (struct str_buffer *buffer)
{
str_insert_char (replch, buffer);
}
static int
str_ascii_is_valid_string (const char *text)
{
return 1;
}
static int
str_ascii_is_valid_char (const char *ch, size_t size)
{
return 1;
}
static void
str_ascii_cnext_char (const char **text)
{
(*text)++;
}
static void
str_ascii_cprev_char (const char **text)
{
(*text)--;
}
static int
str_ascii_cnext_noncomb_char (const char **text)
{
if (*text[0] != '\0') {
(*text)++;
return 1;
} else return 0;
}
static int
str_ascii_cprev_noncomb_char (const char **text, const char *begin)
{
if ((*text) != begin) {
(*text)--;
return 1;
} else return 0;
}
static int
str_ascii_isspace (const char *text)
{
return g_ascii_isspace ((gchar) text[0]);
}
static int
str_ascii_ispunct (const char *text)
{
return g_ascii_ispunct ((gchar) text[0]);
}
static int
str_ascii_isalnum (const char *text)
{
return g_ascii_isalnum ((gchar) text[0]);
}
static int
str_ascii_isdigit (const char *text)
{
return g_ascii_isdigit ((gchar) text[0]);
}
static int
str_ascii_isprint (const char *text)
{
return g_ascii_isprint ((gchar) text[0]);
}
static int
str_ascii_iscombiningmark (const char *text)
{
return 0;
}
static int
str_ascii_toupper (const char *text, char **out, size_t *remain)
{
if (*remain <= 1) return 0;
(*out)[0] = (char) g_ascii_toupper ((gchar) text[0]);
(*out)++;
(*remain)--;
return 1;
}
static int
str_ascii_tolower (const char *text, char **out, size_t *remain)
{
if (*remain <= 1) return 0;
(*out)[0] = (char) g_ascii_tolower ((gchar) text[0]);
(*out)++;
(*remain)--;
return 1;
}
static int
str_ascii_length (const char *text)
{
return strlen (text);
}
static int
str_ascii_length2 (const char *text, int size)
{
return (size >= 0) ? min (strlen (text), size) : strlen (text);
}
int
str_ascii_vfs_convert_to (str_conv_t coder, const char *string,
int size, struct str_buffer *buffer)
{
str_insert_string2 (string, size, buffer);
return 0;
}
static const char *
str_ascii_term_form (const char *text)
{
static char result[BUF_MEDIUM];
char *actual;
size_t remain;
size_t length;
size_t pos = 0;
actual = result;
remain = sizeof (result);
length = strlen (text);
/* go throw all characters and check, if they are ascii and printable */
for (; pos < length && remain > 1; pos++, actual++, remain--) {
actual[0] = isascii((unsigned char)text[pos]) ? text[pos] : '?';
actual[0] = g_ascii_isprint ((gchar) actual[0]) ? actual[0] : '.';
}
actual[0] = '\0';
return result;
}
static const char *
str_ascii_fit_to_term (const char *text, int width, int just_mode)
{
static char result[BUF_MEDIUM];
char *actual;
size_t remain;
int ident;
size_t length;
size_t pos = 0;
length = strlen (text);
actual = result;
remain = sizeof(result);
if (length <= width) {
ident = 0;
switch (HIDE_FIT (just_mode)) {
case J_CENTER_LEFT:
case J_CENTER:
ident = (width - length) / 2;
break;
case J_RIGHT:
ident = width - length;
break;
}
/* add space before text */
if (remain <= ident) goto finally;
memset (actual, ' ', ident);
actual+= ident;
remain-= ident;
/* copy all characters */
for (; pos < length && remain > 1; pos++, actual++, remain--) {
actual[0] = isascii((unsigned char)text[pos]) ? text[pos] : '?';
actual[0] = g_ascii_isprint ((gchar) actual[0]) ? actual[0] : '.';
}
/* add space after text */
if (width - length - ident > 0) {
if (remain <= width - length - ident) goto finally;
memset (actual, ' ', width - length - ident);
actual+= width - length - ident;
remain-= width - length - ident;
}
} else {
if (IS_FIT (just_mode)) {
/* copy prefix of text, that is not wider than width / 2 */
for (; pos + 1 <= width / 2 && remain > 1;
actual++, pos++, remain--) {
actual[0] = isascii((unsigned char)text[pos])
? text[pos] : '?';
actual[0] = g_ascii_isprint ((gchar) actual[0])
? actual[0] : '.';
}
if (remain <= 1) goto finally;
actual[0] = '~';
actual++;
remain--;
pos+= length - width + 1;
/* copy suffix of text */
for (; pos < length && remain > 1; pos++, actual++, remain--) {
actual[0] = isascii((unsigned char)text[pos])
? text[pos] : '?';
actual[0] = g_ascii_isprint ((gchar) actual[0])
? actual[0] : '.';
}
} else {
ident = 0;
switch (HIDE_FIT (just_mode)) {
case J_CENTER:
ident = (length - width) / 2;
break;
case J_RIGHT:
ident = length - width;
break;
}
/* copy substring text, substring start from ident and take width
* characters from text */
pos+= ident;
for (; pos < ident + width && remain > 1;
pos++, actual++, remain--) {
actual[0] = isascii((unsigned char)text[pos])
? text[pos] : '?';
actual[0] = g_ascii_isprint ((gchar) actual[0])
? actual[0] : '.';
}
}
}
finally:
actual[0] = '\0';
return result;
}
static const char *
str_ascii_term_trim (const char *text, int width)
{
static char result[BUF_MEDIUM];
size_t remain;
char *actual;
size_t pos = 0;
size_t length;
length = strlen (text);
actual = result;
remain = sizeof (result);
if (width < length) {
if (width <= 3) {
memset (actual, '.', width);
actual+= width;
remain-= width;
} else {
memset (actual, '.', 3);
actual+= 3;
remain-= 3;
pos+= length - width + 3;
/* copy suffix of text*/
for (; pos < length && remain > 1; pos++, actual++, remain--) {
actual[0] = isascii((unsigned char)text[pos])
? text[pos] : '?';
actual[0] = g_ascii_isprint ((gchar) actual[0])
? actual[0] : '.';
}
}
} else {
/* copy all characters */
for (; pos < length && remain > 1; pos++, actual++, remain--) {
actual[0] = isascii((unsigned char)text[pos]) ? text[pos] : '?';
actual[0] = g_ascii_isprint ((gchar) actual[0]) ? actual[0] : '.';
}
}
actual[0] = '\0';
return result;
}
static int
str_ascii_term_width2 (const char *text, size_t length)
{
return (length != (size_t)(-1))
? min (strlen (text), length)
: strlen (text);
}
static int
str_ascii_term_width1 (const char *text)
{
return str_ascii_term_width2 (text, (size_t)(-1));
}
static int
str_ascii_term_char_width (const char *text)
{
return 1;
}
static void
str_ascii_msg_term_size (const char *text, int *lines, int *columns)
{
(*lines) = 1;
(*columns) = 0;
char *p, *tmp = g_strdup (text);
char *q;
char c = '\0';
int width;
p = tmp;
for (;;) {
q = strchr (p, '\n');
if (q != NULL) {
c = q[0];
q[0] = '\0';
}
width = str_ascii_term_width1 (p);
if (width > (*columns)) (*columns) = width;
if (q == NULL)
break;
q[0] = c;
p = q + 1;
(*lines)++;
}
g_free (tmp);
}
static const char *
str_ascii_term_substring (const char *text, int start, int width)
{
static char result[BUF_MEDIUM];
size_t remain;
char *actual;
size_t pos = 0;
size_t length;
actual = result;
remain = sizeof (result);
length = strlen (text);
if (start < length) {
pos+= start;
/* copy at most width characters from text from start */
for (; pos < length && width > 0 && remain > 1;
pos++, width--, actual++, remain--) {
actual[0] = isascii((unsigned char)text[pos]) ? text[pos] : '?';
actual[0] = g_ascii_isprint ((gchar) actual[0]) ? actual[0] : '.';
}
}
/* if text is shorter then width, add space to the end */
for (; width > 0 && remain > 1; actual++, remain--, width--) {
actual[0] = ' ';
}
actual[0] = '\0';
return result;
}
static const char *
str_ascii_trunc (const char *text, int width)
{
static char result[MC_MAXPATHLEN];
int remain;
char *actual;
size_t pos = 0;
size_t length;
actual = result;
remain = sizeof (result);
length = strlen (text);
if (length > width) {
/* copy prefix of text */
for (; pos + 1 <= width / 2 && remain > 1; actual++, pos++, remain--) {
actual[0] = isascii((unsigned char)text[pos]) ? text[pos] : '?';
actual[0] = g_ascii_isprint ((gchar) actual[0]) ? actual[0] : '.';
}
if (remain <= 1) goto finally;
actual[0] = '~';
actual++;
remain--;
pos+= length - width + 1;
/* copy suffix of text */
for (; pos < length && remain > 1; pos++, actual++, remain--) {
actual[0] = isascii((unsigned char)text[pos]) ? text[pos] : '?';
actual[0] = g_ascii_isprint ((gchar) actual[0]) ? actual[0] : '.';
}
} else {
/* copy all characters */
for (; pos < length && remain > 1; pos++, actual++, remain--) {
actual[0] = isascii((unsigned char)text[pos]) ? text[pos] : '?';
actual[0] = g_ascii_isprint ((gchar) actual[0]) ? actual[0] : '.';
}
}
finally:
actual[0] = '\0';
return result;
}
static int
str_ascii_offset_to_pos (const char *text, size_t length)
{
return (int)length;
}
static int
str_ascii_column_to_pos (const char *text, size_t pos)
{
return (int)pos;
}
static char *
str_ascii_create_search_needle (const char *needle, int case_sen)
{
return (char*) needle;
}
static void
str_ascii_release_search_needle (char *needle, int case_sen)
{
}
static const char *
str_ascii_search_first (const char *text, const char *search, int case_sen)
{
char *fold_text;
char *fold_search;
const char *match;
size_t offset;
fold_text = (case_sen) ? (char*) text : g_ascii_strdown (text, -1);
fold_search = (case_sen) ? (char*) search : g_ascii_strdown (search, -1);
match = g_strstr_len (fold_text, -1, fold_search);
if (match != NULL) {
offset = match - fold_text;
match = text + offset;
}
if (!case_sen) {
g_free (fold_text);
g_free (fold_search);
}
return match;
}
static const char *
str_ascii_search_last (const char *text, const char *search, int case_sen)
{
char *fold_text;
char *fold_search;
const char *match;
size_t offset;
fold_text = (case_sen) ? (char*) text : g_ascii_strdown (text, -1);
fold_search = (case_sen) ? (char*) search : g_ascii_strdown (search, -1);
match = g_strrstr_len (fold_text, -1, fold_search);
if (match != NULL) {
offset = match - fold_text;
match = text + offset;
}
if (!case_sen) {
g_free (fold_text);
g_free (fold_search);
}
return match;
}
static int
str_ascii_compare (const char *t1, const char *t2)
{
return strcmp (t1, t2);
}
static int
str_ascii_ncompare (const char *t1, const char *t2)
{
return strncmp (t1, t2, min (strlen (t1), strlen(t2)));
}
static int
str_ascii_casecmp (const char *t1, const char *t2)
{
return g_ascii_strcasecmp (t1, t2);
}
static int
str_ascii_ncasecmp (const char *t1, const char *t2)
{
return g_ascii_strncasecmp (t1, t2, min (strlen (t1), strlen (t2)));
}
static void
str_ascii_fix_string (char *text)
{
for (; text[0] != '\0'; text++) {
text[0] = ((unsigned char)text[0] < 128) ? text[0] : '?';
}
}
static char *
str_ascii_create_key (const char *text, int case_sen)
{
return (char*)text;
}
static int
str_ascii_key_collate (const char *t1, const char *t2, int case_sen)
{
return (case_sen) ? strcmp (t1, t2) : g_ascii_strcasecmp (t1, t2);
}
static void
str_ascii_release_key (char *key, int case_sen)
{
}
static int
str_ascii_prefix (const char *text, const char *prefix)
{
int result;
for (result = 0; text[result] != '\0' && prefix[result] != '\0'
&& text[result] == prefix[result]; result++);
return result;
}
static int
str_ascii_caseprefix (const char *text, const char *prefix)
{
int result;
for (result = 0; text[result] != '\0' && prefix[result] != '\0'
&& g_ascii_toupper (text[result]) == g_ascii_toupper (prefix[result]);
result++);
return result;
}
struct str_class
str_ascii_init ()
{
struct str_class result;
result.vfs_convert_to = str_ascii_vfs_convert_to;
result.insert_replace_char = str_ascii_insert_replace_char;
result.is_valid_string = str_ascii_is_valid_string;
result.is_valid_char = str_ascii_is_valid_char;
result.cnext_char = str_ascii_cnext_char;
result.cprev_char = str_ascii_cprev_char;
result.cnext_char_safe = str_ascii_cnext_char;
result.cprev_char_safe = str_ascii_cprev_char;
result.cnext_noncomb_char = str_ascii_cnext_noncomb_char;
result.cprev_noncomb_char = str_ascii_cprev_noncomb_char;
result.isspace = str_ascii_isspace;
result.ispunct = str_ascii_ispunct;
result.isalnum = str_ascii_isalnum;
result.isdigit = str_ascii_isdigit;
result.isprint = str_ascii_isprint;
result.iscombiningmark = str_ascii_iscombiningmark;
result.toupper = str_ascii_toupper;
result.tolower = str_ascii_tolower;
result.length = str_ascii_length;
result.length2 = str_ascii_length2;
result.length_noncomb = str_ascii_length;
result.fix_string = str_ascii_fix_string;
result.term_form = str_ascii_term_form;
result.fit_to_term = str_ascii_fit_to_term;
result.term_trim = str_ascii_term_trim;
result.term_width2 = str_ascii_term_width2;
result.term_width1 = str_ascii_term_width1;
result.term_char_width = str_ascii_term_char_width;
result.msg_term_size = str_ascii_msg_term_size;
result.term_substring = str_ascii_term_substring;
result.trunc = str_ascii_trunc;
result.offset_to_pos = str_ascii_offset_to_pos;
result.column_to_pos = str_ascii_column_to_pos;
result.create_search_needle = str_ascii_create_search_needle;
result.release_search_needle = str_ascii_release_search_needle;
result.search_first = str_ascii_search_first;
result.search_last = str_ascii_search_last;
result.compare = str_ascii_compare;
result.ncompare = str_ascii_ncompare;
result.casecmp = str_ascii_casecmp;
result.ncasecmp = str_ascii_ncasecmp;
result.prefix = str_ascii_prefix;
result.caseprefix = str_ascii_caseprefix;
result.create_key = str_ascii_create_key;
result.create_key_for_filename = str_ascii_create_key;
result.key_collate = str_ascii_key_collate;
result.release_key = str_ascii_release_key;
return result;
}

1241
src/strutilutf8.c Normal file

File diff suppressed because it is too large Load Diff

View File

@ -52,6 +52,7 @@
#include "cons.saver.h" /* handle_console() */
#include "key.h" /* XCTRL */
#include "subshell.h"
#include "strutil.h"
#ifndef WEXITSTATUS
# define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8)
@ -529,6 +530,8 @@ static void init_raw_mode ()
int invoke_subshell (const char *command, int how, char **new_dir)
{
char *pcwd;
/* Make the MC terminal transparent */
tcsetattr (STDOUT_FILENO, TCSANOW, &raw_mode);
@ -559,8 +562,10 @@ int invoke_subshell (const char *command, int how, char **new_dir)
feed_subshell (how, FALSE);
if (new_dir && subshell_alive && strcmp (subshell_cwd, current_panel->cwd))
pcwd = vfs_translate_path_n (current_panel->cwd);
if (new_dir && subshell_alive && strcmp (subshell_cwd, pcwd))
*new_dir = subshell_cwd; /* Make MC change to the subshell's CWD */
g_free (pcwd);
/* Restart the subshell if it has died by SIGHUP, SIGQUIT, etc. */
while (!subshell_alive && !quit && use_subshell)
@ -700,8 +705,10 @@ static char *
subshell_name_quote (const char *s)
{
char *ret, *d;
const char *su, *n;
const char quote_cmd_start[] = "\"`printf \"%b\" '";
const char quote_cmd_end[] = "'`\"";
int c;
/* Factor 5 because we need \, 0 and 3 other digits per character. */
d = ret = g_malloc (1 + (5 * strlen (s)) + (sizeof(quote_cmd_start) - 1)
@ -724,13 +731,19 @@ subshell_name_quote (const char *s)
* sequence of the form \0nnn, where "nnn" is the numeric value of the
* character converted to octal number.
*/
for (; *s; s++) {
if (isalnum ((unsigned char) *s)) {
*d++ = (unsigned char) *s;
su = s;
for (; su[0] != '\0'; ) {
n = str_cget_next_char_safe (su);
if (str_isalnum (su)) {
memcpy (d, su, n - su);
d+= n - su;
} else {
sprintf (d, "\\0%03o", (unsigned char) *s);
d += 5;
for (c = 0; c < n - su; c++) {
sprintf (d, "\\0%03o", (unsigned char) su[c]);
d += 5;
}
}
su = n;
}
strcpy (d, quote_cmd_end);
@ -743,15 +756,22 @@ subshell_name_quote (const char *s)
void
do_subshell_chdir (const char *directory, int do_update, int reset_prompt)
{
char *pcwd;
char *temp;
char *translate;
pcwd = vfs_translate_path_n (current_panel->cwd);
if (!
(subshell_state == INACTIVE
&& strcmp (subshell_cwd, current_panel->cwd))) {
&& strcmp (subshell_cwd, pcwd))) {
/* We have to repaint the subshell prompt if we read it from
* the main program. Please note that in the code after this
* if, the cd command that is sent will make the subshell
* repaint the prompt, so we don't have to paint it. */
if (do_update)
do_update_prompt ();
g_free (pcwd);
return;
}
@ -759,7 +779,9 @@ do_subshell_chdir (const char *directory, int do_update, int reset_prompt)
because we set "HISTCONTROL=ignorespace") */
write_all (subshell_pty, " cd ", 4);
if (*directory) {
char *temp = subshell_name_quote (directory);
translate = vfs_translate_path_n (directory);
if (translate) {
temp = subshell_name_quote (translate);
if (temp) {
write_all (subshell_pty, temp, strlen (temp));
g_free (temp);
@ -768,6 +790,10 @@ do_subshell_chdir (const char *directory, int do_update, int reset_prompt)
that we don't have memory to quote it. */
write_all (subshell_pty, ".", 1);
}
g_free (translate);
} else {
write_all (subshell_pty, ".", 1);
}
} else {
write_all (subshell_pty, "/", 1);
}
@ -777,7 +803,7 @@ do_subshell_chdir (const char *directory, int do_update, int reset_prompt)
feed_subshell (QUIETLY, FALSE);
if (subshell_alive) {
int bPathNotEq = strcmp (subshell_cwd, current_panel->cwd);
int bPathNotEq = strcmp (subshell_cwd, pcwd);
if (bPathNotEq && subshell_type == TCSH) {
char rp_subshell_cwd[PATH_MAX];
@ -786,17 +812,17 @@ do_subshell_chdir (const char *directory, int do_update, int reset_prompt)
char *p_subshell_cwd =
mc_realpath (subshell_cwd, rp_subshell_cwd);
char *p_current_panel_cwd =
mc_realpath (current_panel->cwd, rp_current_panel_cwd);
mc_realpath (pcwd, rp_current_panel_cwd);
if (p_subshell_cwd == NULL)
p_subshell_cwd = subshell_cwd;
if (p_current_panel_cwd == NULL)
p_current_panel_cwd = current_panel->cwd;
p_current_panel_cwd = pcwd;
bPathNotEq = strcmp (p_subshell_cwd, p_current_panel_cwd);
}
if (bPathNotEq && strcmp (current_panel->cwd, ".")) {
char *cwd = strip_password (g_strdup (current_panel->cwd), 1);
if (bPathNotEq && strcmp (pcwd, ".")) {
char *cwd = strip_password (g_strdup (pcwd), 1);
fprintf (stderr, _("Warning: Cannot change to %s.\n"), cwd);
g_free (cwd);
}
@ -805,6 +831,8 @@ do_subshell_chdir (const char *directory, int do_update, int reset_prompt)
if (reset_prompt)
prompt_pos = 0;
update_prompt = FALSE;
g_free (pcwd);
/* Make sure that MC never stores the CWD in a silly format */
/* like /usr////lib/../bin, or the strcmp() above will fail */
}

View File

@ -66,6 +66,8 @@ static const char *const features[] = {
#elif defined(USE_NCURSES)
N_("Using the ncurses library"),
#elif defined(USE_NCURSESW)
N_("Using the ncursesw library"),
#else
#error "Cannot compile mc without S-Lang or ncurses"
#endif /* !HAVE_SLANG && !USE_NCURSES */

View File

@ -50,6 +50,7 @@
#include "treestore.h"
#include "cmd.h"
#include "history.h"
#include "strutil.h"
#define tlines(t) (t->is_panel ? t->widget.lines-2 - (show_mini_info ? 2 : 0) : t->widget.lines)
@ -177,12 +178,14 @@ static void tree_show_mini_info (WTree *tree, int tree_lines, int tree_cols)
attrset (DLG_FOCUSC (h));
addch (PATH_SEP);
addstr ((char *) name_trunc (tree->search_buffer, tree_cols-2));
addstr (str_fit_to_term (tree->search_buffer,
tree_cols - 2, J_LEFT_FIT));
addch (' ');
attrset (DLG_FOCUSC (h));
} else {
/* Show full name of selected directory */
addstr ((char *) name_trunc (tree->selected_ptr->name, tree_cols));
addstr (str_fit_to_term (tree->selected_ptr->name,
tree_cols, J_LEFT_FIT));
}
}
@ -268,7 +271,7 @@ static void show_tree (WTree *tree)
}
/* Show full name */
addstr ((char *) name_trunc (current->name, tree_cols - 6));
addstr (str_fit_to_term (current->name, tree_cols - 6, J_LEFT_FIT));
} else{
/* Sub level directory */
@ -302,8 +305,8 @@ static void show_tree (WTree *tree)
/* Show sub-name */
addch (' ');
addstr ((char *) name_trunc (current->subname,
tree_cols - 2 - 4 - 3 * j));
addstr (str_fit_to_term (current->subname,
tree_cols - 2 - 4 - 3 * j, J_LEFT_FIT));
}
addch (' ');
@ -598,7 +601,7 @@ static void tree_copy (WTree *tree, const char *default_dest)
if (!tree->selected_ptr)
return;
g_snprintf (cmd_buf, sizeof(cmd_buf), _("Copy \"%s\" directory to:"),
name_trunc (tree->selected_ptr->name, 50));
str_trunc (tree->selected_ptr->name, 50));
dest = input_expand_dialog (_(" Copy "), cmd_buf, MC_HISTORY_FM_TREE_COPY, default_dest);
if (!dest)
@ -641,7 +644,7 @@ static void tree_move (WTree *tree, const char *default_dest)
if (!tree->selected_ptr)
return;
g_snprintf (cmd_buf, sizeof (cmd_buf), _("Move \"%s\" directory to:"),
name_trunc (tree->selected_ptr->name, 50));
str_trunc (tree->selected_ptr->name, 50));
dest = input_expand_dialog (_(" Move "), cmd_buf, MC_HISTORY_FM_TREE_MOVE, default_dest);
if (!dest)
return;

View File

@ -32,8 +32,9 @@
#include "global.h"
#include "color.h"
#include "main.h" /* for slow_terminal */
#include "strutil.h"
#ifdef USE_NCURSES
#if defined(USE_NCURSES) || defined(USE_NCURSESW)
#define WANT_TERM_H
#endif
#include "tty.h"
@ -159,9 +160,9 @@ extern void
tty_print_string(const char *s)
{
#ifdef HAVE_SLANG
SLsmg_write_string(str_unconst(s));
SLsmg_write_string (str_unconst (str_term_form (s)));
#else
addstr(s);
addstr (str_term_form (s));
#endif
}

View File

@ -15,6 +15,8 @@
#ifdef USE_NCURSES
# ifdef HAVE_NCURSES_CURSES_H
# include <ncurses/curses.h>
# elif HAVE_NCURSESW_CURSES_H
# include <ncursesw/curses.h>
# elif HAVE_NCURSES_H
# include <ncurses.h>
# else
@ -25,6 +27,13 @@
#endif /* WANT_TERM_H */
#endif /* USE_NCURSES */
#ifdef USE_NCURSESW
# include <ncursesw/curses.h>
#ifdef WANT_TERM_H
# include <term.h>
#endif
#endif
/* {{{ Input }}} */
extern void tty_enable_interrupt_key(void);

View File

@ -34,6 +34,7 @@
#include "execute.h"
#include "setup.h"
#include "history.h"
#include "strutil.h"
#include "../edit/edit.h" /* BLOCK_FILE */
#include "../edit/edit-widget.h" /* WEdit */
@ -184,7 +185,7 @@ expand_format (struct WEdit *edit_widget, char c, int quote)
if (edit_one_file != NULL)
fname = edit_widget->filename;
else {
if (islower ((unsigned char) c))
if (g_ascii_islower ((gchar) c))
panel = current_panel;
else {
if (get_other_type () != view_listing)
@ -199,7 +200,7 @@ expand_format (struct WEdit *edit_widget, char c, int quote)
else
quote_func = fake_name_quote;
c_lc = tolower ((unsigned char) c);
c_lc = g_ascii_tolower ((gchar) c);
switch (c_lc) {
case 'f':
@ -324,16 +325,22 @@ check_patterns (char *p)
point after argument. */
static char *extract_arg (char *p, char *arg, int size)
{
char *np;
while (*p && (*p == ' ' || *p == '\t' || *p == '\n'))
p++;
/* support quote space .mnu */
while (size > 1 && *p && (*p != ' ' || *(p-1) == '\\') && *p != '\t' && *p != '\n') {
*arg++ = *p++;
size--;
while (*p && (*p != ' ' || *(p-1) == '\\') && *p != '\t' && *p != '\n') {
np = str_get_next_char (p);
if (np - p >= size) break;
memcpy (arg, p, np - p);
arg+= np - p;
size-= np - p;
p = np;
}
*arg = 0;
if (!*p || *p == '\n')
p --;
str_prev_char (&p);
return p;
}
@ -410,7 +417,7 @@ static char *test_condition (WEdit *edit_widget, char *p, int *condition)
case '!':
p = test_condition (edit_widget, p, condition);
*condition = ! *condition;
p--;
str_prev_char (&p);
break;
case 'f': /* file name pattern */
p = extract_arg (p, arg, sizeof (arg));
@ -554,7 +561,7 @@ static char *test_line (WEdit *edit_widget, char *p, int *result)
debug_out (NULL, NULL, 1);
if (!*p || *p == '\n')
p --;
str_prev_char (&p);
return p;
}
@ -627,9 +634,9 @@ execute_menu_command (WEdit *edit_widget, const char *commands)
}
} else if (expand_prefix_found){
expand_prefix_found = 0;
if (isdigit ((unsigned char) *commands)) {
if (g_ascii_isdigit ((gchar) *commands)) {
do_quote = atoi (commands);
while (isdigit ((unsigned char) *commands))
while (g_ascii_isdigit ((gchar) *commands))
commands++;
}
if (*commands == '{')
@ -746,7 +753,7 @@ user_menu_cmd (struct WEdit *edit_widget)
/* Parse the menu file */
old_patterns = easy_patterns;
p = check_patterns (data);
for (menu_lines = col = 0; *p; p++){
for (menu_lines = col = 0; *p; str_next_char (&p)){
if (menu_lines >= menu_limit){
char ** new_entries;
@ -789,7 +796,7 @@ user_menu_cmd (struct WEdit *edit_widget)
selected = menu_lines;
}
}
else if (*p != ' ' && *p != '\t' && is_printable (*p)) {
else if (*p != ' ' && *p != '\t' && str_isprint (p)) {
/* A menu entry title line */
if (accept_entry)
entries [menu_lines] = p;

View File

@ -41,6 +41,7 @@
#include "mountlist.h"
#include "win.h" /* xterm_flag */
#include "timefmt.h"
#include "strutil.h"
#ifdef HAVE_CHARSET
#include "charsets.h"
@ -228,32 +229,7 @@ fake_name_quote (const char *s, int quote_percent)
const char *
name_trunc (const char *txt, size_t trunc_len)
{
static char x[MC_MAXPATHLEN + MC_MAXPATHLEN];
size_t txt_len;
char *p;
if (!txt)
return NULL;
if (!*txt)
return txt;
if (trunc_len > sizeof (x) - 1) {
trunc_len = sizeof (x) - 1;
}
txt_len = strlen (txt);
if (txt_len <= trunc_len) {
strcpy (x, txt);
} else {
size_t y = (trunc_len / 2) + (trunc_len % 2);
strncpy (x, txt, (size_t) y);
strncpy (x + y, txt + (txt_len - (trunc_len / 2)), trunc_len / 2);
x[y] = '~';
}
x[trunc_len] = 0;
for (p = x; *p; p++)
if (!is_printable (*p))
*p = '?';
return x;
return str_trunc (txt, trunc_len);
}
/*
@ -263,12 +239,11 @@ name_trunc (const char *txt, size_t trunc_len)
*/
const char *
path_trunc (const char *path, size_t trunc_len) {
const char *ret;
char *secure_path = strip_password (g_strdup (path), 1);
ret = name_trunc (secure_path, trunc_len);
const char *ret = str_trunc (secure_path, trunc_len);
g_free (secure_path);
return ret;
}
@ -725,48 +700,52 @@ load_mc_home_file (const char *filename, char **allocated_filename)
}
/* Check strftime() results. Some systems (i.e. Solaris) have different
short-month-name sizes for different locales */
short-month-name sizes for different locales */
size_t
i18n_checktimelength (void)
{
size_t length;
time_t testtime = time (NULL);
struct tm* lt = localtime(&testtime);
size_t length;
if (lt == NULL) {
// huh, localtime() doesnt seem to work ... falling back to "(invalid)"
length = strlen(INVALID_TIME_TEXT);
/* huh, localtime() doesnt seem to work ... falling back to "(invalid)" */
length = str_term_width1 (_(INVALID_TIME_TEXT));
} else {
char buf [MAX_I18NTIMELENGTH + 1];
size_t a, b;
a = strftime (buf, sizeof(buf)-1, _("%b %e %H:%M"), lt);
b = strftime (buf, sizeof(buf)-1, _("%b %e %Y"), lt);
length = max (a, b);
char buf [MB_LEN_MAX * MAX_I18NTIMELENGTH + 1];
size_t a, b;
strftime (buf, sizeof(buf) - 1, _("%b %e %H:%M"), lt);
a = str_term_width1 (buf);
strftime (buf, sizeof(buf) - 1, _("%b %e %Y"), lt);
b = str_term_width1 (buf);
length = max (a, b);
length = max (str_term_width1 (_(INVALID_TIME_TEXT)), length);
}
/* Don't handle big differences. Use standard value (email bug, please) */
if ( length > MAX_I18NTIMELENGTH || length < MIN_I18NTIMELENGTH )
length = STD_I18NTIMELENGTH;
if (length > MAX_I18NTIMELENGTH || length < MIN_I18NTIMELENGTH)
length = STD_I18NTIMELENGTH;
return length;
}
const char *
file_date (time_t when)
{
static char timebuf [MAX_I18NTIMELENGTH + 1];
static char timebuf [MB_LEN_MAX * MAX_I18NTIMELENGTH + 1];
time_t current_time = time ((time_t) 0);
static size_t i18n_timelength = 0;
static int i18n = 0;
static const char *fmtyear, *fmttime;
const char *fmt;
if (i18n_timelength == 0){
i18n_timelength = i18n_checktimelength() + 1;
if (!i18n){
/* strftime() format string for old dates */
fmtyear = _("%b %e %Y");
/* strftime() format string for recent dates */
fmttime = _("%b %e %H:%M");
i18n = 1;
}
if (current_time > when + 6L * 30L * 24L * 60L * 60L /* Old. */
@ -781,8 +760,8 @@ file_date (time_t when)
fmt = fmtyear;
else
fmt = fmttime;
FMT_LOCALTIME(timebuf, i18n_timelength, fmt, when);
FMT_LOCALTIME(timebuf, sizeof (timebuf), fmt, when);
return timebuf;
}
@ -814,7 +793,7 @@ _icase_search (const char *text, const char *data, int *lng)
e += 2;
dlng += 2;
}
if (toupper((unsigned char) *d) == toupper((unsigned char) *e))
if (g_ascii_toupper((gchar) *d) == g_ascii_toupper((gchar) *e))
d++;
else {
e -= d - text;
@ -860,19 +839,23 @@ unix_error_string (int error_num)
const char *
skip_separators (const char *s)
{
for (;*s; s++)
if (*s != ' ' && *s != '\t' && *s != ',')
break;
return s;
const char *su = s;
for (;*su; str_cnext_char (&su))
if (*su != ' ' && *su != '\t' && *su != ',') break;
return su;
}
const char *
skip_numbers (const char *s)
{
for (;*s; s++)
if (!isdigit ((unsigned char) *s))
break;
return s;
const char *su = s;
for (;*su; str_cnext_char (&su))
if (!str_isdigit (su)) break;
return su;
}
/* Remove all control sequences from the argument string. We define
@ -893,6 +876,7 @@ strip_ctrl_codes (char *s)
{
char *w; /* Current position where the stripped data is written */
char *r; /* Current position where the original data is read */
char *n;
if (!s)
return 0;
@ -914,9 +898,12 @@ strip_ctrl_codes (char *s)
continue;
}
if (is_printable(*r))
*w++ = *r;
++r;
n = str_get_next_char (r);
if (str_isprint (r)) {
memmove (w, r, n - r);
w+= n - r;
}
r = n;
}
*w = 0;
return s;
@ -1503,21 +1490,10 @@ save_file_position (const char *filename, long line, long column)
extern const char *
cstrcasestr (const char *haystack, const char *needle)
{
const char *hptr;
size_t i, needle_len;
needle_len = strlen (needle);
for (hptr = haystack; *hptr != '\0'; hptr++) {
for (i = 0; i < needle_len; i++) {
if (toupper ((unsigned char) hptr[i]) !=
toupper ((unsigned char) needle[i]))
goto next_try;
}
return hptr;
next_try:
(void) 0;
}
return NULL;
char *nee = str_create_search_needle (needle, 0);
const char *result = str_search_first (haystack, nee, 0);
str_release_search_needle (nee, 0);
return result;
}
const char *

2004
src/view.c

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -26,6 +26,26 @@ typedef enum {
/* button callback */
typedef int (*bcback) (int);
/* structure for label (caption) with hotkey, if original text does not contain
* hotkey, only start is valid and is equal to original text
* hotkey is defined as char*, but mc support only singlebyte hotkey
*/
struct hotkey_t {
char *start;
char *hotkey;
char *end;
};
/* used in static definition of menu entries */
#define NULL_HOTKEY {NULL, NULL, NULL}
/* create hotkey from text */
struct hotkey_t parse_hotkey (const char *text);
/* release hotkey, free all mebers of hotkey_t */
void release_hotkey (const struct hotkey_t hotkey);
/* return width on terminal of hotkey */
int hotkey_width (const struct hotkey_t hotkey);
typedef struct WButton {
Widget widget;
int action; /* what to do when pressed */
@ -36,8 +56,7 @@ typedef struct WButton {
#define NORMAL_BUTTON 2
#define DEFPUSH_BUTTON 3
unsigned int flags; /* button flags */
char *text; /* text of button */
int hotkey; /* hot KEY */
struct hotkey_t text; /* text of button, contain hotkey too */
int hotpos; /* offset hot KEY char in text */
bcback callback; /* Callback function */
} WButton;
@ -47,7 +66,7 @@ typedef struct WRadio {
unsigned int state; /* radio button state */
int pos, sel;
int count; /* number of members */
const char **texts; /* texts of labels */
struct hotkey_t *texts; /* texts of labels */
} WRadio;
typedef struct WCheck {
@ -56,9 +75,7 @@ typedef struct WCheck {
#define C_BOOL 0x0001
#define C_CHANGE 0x0002
unsigned int state; /* check button state */
char *text; /* text of check button */
int hotkey; /* hot KEY */
int hotpos; /* offset hot KEY char in text */
struct hotkey_t text; /* text of check button */
} WCheck;
typedef struct WGauge {
@ -74,11 +91,11 @@ char *show_hist (GList *history, int widget_y, int widget_x);
typedef struct {
Widget widget;
int point; /* cursor position in the input line */
int mark; /* The mark position */
int first_shown; /* Index of the first shown character */
int current_max_len; /* Maximum length of input line */
int field_len; /* Length of the editing field */
int point; /* cursor position in the input line in characters */
int mark; /* The mark position in characters */
int term_first_shown; /* column of the first shown character */
size_t current_max_size; /* Maximum length of input line (bytes) */
int field_width; /* width of the editing field */
int color; /* color used */
int first; /* Is first keystroke? */
int disable_update; /* Do we want to skip updates? */
@ -89,6 +106,8 @@ typedef struct {
char **completions; /* Possible completions array */
INPUT_COMPLETE_FLAGS completion_flags; /* INPUT_COMPLETE* bitwise flags(complete.h) */
char *history_name; /* name of history for loading and saving */
char charbuf[MB_LEN_MAX]; /* buffer for multibytes characters */
size_t charpoint; /* point to end of mulibyte sequence in charbuf */
} WInput;
/* For history load-save functions */
@ -152,7 +171,7 @@ WListbox *listbox_new (int x, int y, int width, int height, lcback callback);
WGroupbox *groupbox_new (int x, int y, int width, int height, const char *title);
/* Input lines */
void winput_set_origin (WInput *i, int x, int field_len);
void winput_set_origin (WInput *i, int x, int field_width);
cb_ret_t handle_char (WInput *in, int c_code);
int is_in_input_map (WInput *in, int c_code);
void update_input (WInput *in, int clear_first);
@ -175,6 +194,7 @@ void gauge_set_value (WGauge *g, int max, int current);
void gauge_show (WGauge *g, int shown);
/* Buttons */
/* return copy of button text */
const char *button_get_text (WButton *b);
void button_set_text (WButton *b, const char *text);

View File

@ -34,6 +34,7 @@
#include "win.h"
#include "key.h" /* XCTRL and ALT macros */
#include "layout.h"
#include "strutil.h"
/*
* Common handler for standard movement keys in a text area. Provided
@ -217,7 +218,7 @@ int lookup_key (char *keyname)
int i;
for (i = 0; key_name_conv_tab [i].code; i++){
if ( g_strcasecmp (key_name_conv_tab [i].name, keyname))
if (str_casecmp (key_name_conv_tab [i].name, keyname))
continue;
return key_name_conv_tab [i].code;
}

View File

@ -37,6 +37,7 @@
#include "wtools.h"
#include "key.h" /* mi_getch() */
#include "background.h" /* parent_call */
#include "strutil.h"
Listbox *
@ -49,11 +50,11 @@ create_listbox_window (int cols, int lines, const char *title, const char *help)
/* Adjust sizes */
lines = (lines > LINES - 6) ? LINES - 6 : lines;
if (title && (cols < (len = strlen (title) + 2)))
if (title && (cols < (len = str_term_width1 (title) + 2)))
cols = len;
/* no &, but 4 spaces around button for brackets and such */
if (cols < (len = strlen (cancel_string) + 3))
if (cols < (len = str_term_width1 (cancel_string) + 3))
cols = len;
cols = cols > COLS - 6 ? COLS - 6 : cols;
@ -124,7 +125,7 @@ query_dialog (const char *header, const char *text, int flags, int count, ...)
va_start (ap, count);
for (i = 0; i < count; i++) {
char *cp = va_arg (ap, char *);
win_len += strlen (cp) + 6;
win_len += str_term_width1 (cp) + 6;
if (strchr (cp, '&') != NULL)
win_len--;
}
@ -132,8 +133,8 @@ query_dialog (const char *header, const char *text, int flags, int count, ...)
}
/* count coordinates */
msglen (text, &lines, &cols);
cols = 6 + max (win_len, max ((int) strlen (header), cols));
str_msg_term_size (text, &lines, &cols);
cols = 6 + max (win_len, max (str_term_width1 (header), cols));
lines += 4 + (count > 0 ? 2 : 0);
xpos = COLS / 2 - cols / 2;
ypos = LINES / 3 - (lines - 3) / 2;
@ -148,7 +149,7 @@ query_dialog (const char *header, const char *text, int flags, int count, ...)
va_start (ap, count);
for (i = 0; i < count; i++) {
cur_name = va_arg (ap, char *);
xpos = strlen (cur_name) + 6;
xpos = str_term_width1 (cur_name) + 6;
if (strchr (cur_name, '&') != NULL)
xpos--;
@ -467,7 +468,7 @@ fg_input_dialog_help (const char *header, const char *text, const char *help,
}
msglen (text, &lines, &cols);
len = max ((int) strlen (header), cols) + 4;
len = max (str_term_width1 (header), cols) + 4;
len = max (len, 64);
/* The special value of def_text is used to identify password boxes
@ -489,7 +490,7 @@ fg_input_dialog_help (const char *header, const char *text, const char *help,
quick_widgets[1].text = _(quick_widgets[1].text);
quick_widgets[0].relative_x = len / 2 + 4;
quick_widgets[1].relative_x =
len / 2 - (strlen (quick_widgets[1].text) + 9);
len / 2 - (str_term_width1 (quick_widgets[1].text) + 9);
quick_widgets[0].x_divisions = quick_widgets[1].x_divisions = len;
#endif /* ENABLE_NLS */

View File

@ -27,6 +27,7 @@
#include <sys/types.h>
#undef USE_NCURSES /* Don't include *curses.h */
#undef USE_NCURSESW
#include "../src/global.h"
#include "../src/tty.h" /* enable/disable interrupt key */
#include "../src/wtools.h" /* message() */

373
vfs/vfs.c
View File

@ -42,6 +42,7 @@
#include "../src/tty.h" /* enable/disable interrupt key */
#include "../src/wtools.h" /* message() */
#include "../src/main.h" /* print_vfs_message */
#include "../src/strutil.h"
#include "utilvfs.h"
#include "gc.h"
@ -64,10 +65,32 @@ struct vfs_openfile {
void *fsinfo;
};
struct vfs_dirinfo{
DIR *info;
str_conv_t converter;
};
static GSList *vfs_openfiles;
#define VFS_FIRST_HANDLE 100
static struct vfs_class *localfs_class;
static struct str_buffer *vfs_str_buffer;
static const char *supported_encodings[] = {
"UTF8",
"UTF-8",
"BIG5",
"ASCII",
"ISO8859",
"ISO-8859",
"ISO_8859",
"KOI8",
"CP852",
"CP866",
"CP125",
NULL
};
/* Create new VFS handle and put it to the list */
static int
@ -309,6 +332,161 @@ vfs_get_class (const char *pathname)
return vfs;
}
const char *
vfs_get_encoding (const char *path)
{
static char result[16];
char *work;
char *semi;
char *slash;
work = g_strdup (path);
semi = g_strrstr (work, "#enc:");
if (semi != NULL) {
semi+= 5 * sizeof (char);
slash = strchr (semi, PATH_SEP);
if (slash != NULL)
slash[0] = '\0';
g_strlcpy (result, semi, sizeof(result));
g_free (work);
return result;
} else {
g_free (work);
return NULL;
}
}
/* return if encoding can by used in vfs (is ascci full compactible) */
/* contains only a few encoding now */
static int
vfs_supported_enconding (const char *encoding) {
int t;
int result = 0;
for (t = 0; supported_encodings[t] != NULL; t++) {
result+= (g_ascii_strncasecmp (encoding, supported_encodings[t],
strlen (supported_encodings[t])) == 0);
}
return result;
}
/* now used only by vfs_translate_path, but could be used in other vfs
* plugin to automatic detect encoding
* path - path to translate
* size - how many bytes from path translate
* defcnv - convertor, that is used as default, when path does not contain any
* #enc: subtring
* buffer - used to store result of translation
*/
static int
_vfs_translate_path (const char *path, int size,
str_conv_t defcnv, struct str_buffer *buffer)
{
const char *semi;
const char *ps;
const char *slash;
int state = 0;
static char encoding[16];
str_conv_t coder;
int ms;
if (size == 0) return 0;
size = (size > 0) ? size : strlen (path);
/* try found #end: */
semi = g_strrstr_len (path, size, "#enc:");
if (semi != NULL) {
/* first must be translated part before #enc: */
ms = semi - path;
/* remove '/' before #enc */
ps = str_cget_prev_char (semi);
if (ps[0] == PATH_SEP) ms = ps - path;
state = _vfs_translate_path (path, ms, defcnv, buffer);
if (state != 0) return state;
/* now can be translated part after #enc: */
semi+= 5;
slash = strchr (semi, PATH_SEP);
// ignore slashes after size;
if (slash - path >= size) slash = NULL;
ms = (slash != NULL) ? slash - semi : strlen (semi);
ms = min (ms, sizeof (encoding) - 1);
// limit encoding size (ms) to path size (size)
if (semi + ms > path + size) ms = path + size - semi;
memcpy (encoding, semi, ms);
encoding[ms] = '\0';
switch (vfs_supported_enconding (encoding)) {
case 1:
coder = str_crt_conv_to (encoding);
if (coder != (iconv_t) (-1)) {
if (slash != NULL) {
state = str_vfs_convert_to (coder, slash,
path + size - slash, buffer);
} else if (buffer->data[0] == '\0') {
/* exmaple "/#enc:utf-8" */
str_insert_char (PATH_SEP, buffer);
}
str_close_conv (coder);
return state;
} else {
errno = EINVAL;
return ESTR_FAILURE;
}
break;
default:
errno = EINVAL;
return ESTR_FAILURE;
}
} else {
/* path can be translated whole at once */
state = str_vfs_convert_to (defcnv, path, size, buffer);
return state;
}
return 0;
}
char *
vfs_translate_path (const char *path)
{
int state;
str_reset_buffer (vfs_str_buffer);
state = _vfs_translate_path (path, -1, str_cnv_from_term, vfs_str_buffer);
// strict version
//return (state == 0) ? vfs_str_buffer->data : NULL;
return (state != ESTR_FAILURE) ? vfs_str_buffer->data : NULL;
}
char *
vfs_translate_path_n (const char *path)
{
char *result;
result = vfs_translate_path (path);
return (result != NULL) ? g_strdup (result) : NULL;
}
char *
vfs_canon_and_translate (const char *path)
{
char *canon;
char *result;
canon = vfs_canon (path);
result = vfs_translate_path_n (canon);
g_free (canon);
return result;
}
static int
ferrno (struct vfs_class *vfs)
{
@ -323,7 +501,8 @@ mc_open (const char *filename, int flags, ...)
void *info;
va_list ap;
char *file = vfs_canon (filename);
char *file = vfs_canon_and_translate (filename);
if (file != NULL) {
struct vfs_class *vfs = vfs_get_class (file);
/* Get the mode flag */
@ -348,6 +527,7 @@ mc_open (const char *filename, int flags, ...)
}
return vfs_new_handle (vfs, info);
} else return -1;
}
@ -356,13 +536,15 @@ int mc_##name inarg \
{ \
struct vfs_class *vfs; \
int result; \
char *mpath = vfs_canon (path); \
char *mpath = vfs_canon_and_translate (path); \
if (mpath != NULL) { \
vfs = vfs_get_class (mpath); \
result = vfs->name ? (*vfs->name)callarg : -1; \
g_free (mpath); \
if (result == -1) \
errno = vfs->name ? ferrno (vfs) : E_NOTSUPP; \
return result; \
} else return -1; \
}
MC_NAMEOP (chmod, (const char *path, mode_t mode), (vfs, mpath, mode))
@ -370,11 +552,38 @@ MC_NAMEOP (chown, (const char *path, uid_t owner, gid_t group), (vfs, mpath, own
MC_NAMEOP (utime, (const char *path, struct utimbuf *times), (vfs, mpath, times))
MC_NAMEOP (readlink, (const char *path, char *buf, int bufsiz), (vfs, mpath, buf, bufsiz))
MC_NAMEOP (unlink, (const char *path), (vfs, mpath))
MC_NAMEOP (symlink, (const char *name1, const char *path), (vfs, name1, mpath))
MC_NAMEOP (mkdir, (const char *path, mode_t mode), (vfs, mpath, mode))
MC_NAMEOP (rmdir, (const char *path), (vfs, mpath))
MC_NAMEOP (mknod, (const char *path, mode_t mode, dev_t dev), (vfs, mpath, mode, dev))
int
mc_symlink (const char *name1, const char *path)
{
struct vfs_class *vfs;
int result;
char *mpath;
char *lpath;
char *tmp;
mpath = vfs_canon_and_translate (path);
if (mpath != NULL) {
tmp = g_strdup (name1);
lpath = vfs_translate_path_n (tmp);
g_free (tmp);
if (lpath != NULL) {
vfs = vfs_get_class (mpath);
result = vfs->symlink ? (*vfs->symlink) (vfs, lpath, mpath) : -1;
g_free (lpath);
if (result == -1)
errno = vfs->symlink ? ferrno (vfs) : E_NOTSUPP;
return result;
}
g_free (mpath);
}
return -1;
}
#define MC_HANDLEOP(name, inarg, callarg) \
ssize_t mc_##name inarg \
@ -399,9 +608,12 @@ int mc_##name (const char *fname1, const char *fname2) \
{ \
struct vfs_class *vfs; \
int result; \
char *name2, *name1 = vfs_canon (fname1); \
char *name2, *name1; \
name1 = vfs_canon_and_translate (fname1); \
if (name1 != NULL) { \
name2 = vfs_canon_and_translate (fname2); \
if (name2 != NULL) { \
vfs = vfs_get_class (name1); \
name2 = vfs_canon (fname2); \
if (vfs != vfs_get_class (name2)){ \
errno = EXDEV; \
g_free (name1); \
@ -414,6 +626,11 @@ int mc_##name (const char *fname1, const char *fname2) \
if (result == -1) \
errno = vfs->name ? ferrno (vfs) : E_NOTSUPP; \
return result; \
} else { \
g_free (name1); \
return -1; \
} \
} else return -1; \
}
MC_RENAMEOP (link)
@ -438,11 +655,13 @@ mc_setctl (const char *path, int ctlop, void *arg)
if (!path)
vfs_die("You don't want to pass NULL to mc_setctl.");
mpath = vfs_canon (path);
mpath = vfs_canon_and_translate (path);
if (mpath != NULL) {
vfs = vfs_get_class (mpath);
result = vfs->setctl ? (*vfs->setctl)(vfs, mpath, ctlop, arg) : 0;
g_free (mpath);
return result;
} else return -1;
}
int
@ -474,22 +693,43 @@ mc_opendir (const char *dirname)
int handle, *handlep;
void *info;
struct vfs_class *vfs;
char *canon;
char *dname;
struct vfs_dirinfo *dirinfo;
const char *encoding;
dname = vfs_canon (dirname);
vfs = vfs_get_class (dname);
canon = vfs_canon (dirname);
dname = vfs_translate_path_n (canon);
if (dname != NULL) {
vfs = vfs_get_class (dname);
info = vfs->opendir ? (*vfs->opendir)(vfs, dname) : NULL;
g_free (dname);
if (!info){
errno = vfs->opendir ? ferrno (vfs) : E_NOTSUPP;
g_free (canon);
return NULL;
}
handle = vfs_new_handle (vfs, info);
dirinfo = g_new (struct vfs_dirinfo, 1);
dirinfo->info = info;
encoding = vfs_get_encoding (canon);
g_free (canon);
dirinfo->converter = (encoding != NULL) ? str_crt_conv_from (encoding) :
str_cnv_from_term;
if (dirinfo->converter == (iconv_t) (-1)) dirinfo->converter =str_cnv_from_term;
handle = vfs_new_handle (vfs, dirinfo);
handlep = g_new (int, 1);
*handlep = handle;
return (DIR *) handlep;
} else {
g_free (canon);
return NULL;
}
}
struct dirent *
@ -497,7 +737,10 @@ mc_readdir (DIR *dirp)
{
int handle;
struct vfs_class *vfs;
struct dirent *result = NULL;
static struct dirent result;
struct dirent *entry = NULL;
struct vfs_dirinfo *dirinfo;
int state;
if (!dirp) {
errno = EFAULT;
@ -505,11 +748,21 @@ mc_readdir (DIR *dirp)
}
handle = *(int *) dirp;
vfs = vfs_op (handle);
if (vfs->readdir)
result = (*vfs->readdir) (vfs_info (handle));
if (!result)
errno = vfs->readdir ? ferrno (vfs) : E_NOTSUPP;
return result;
dirinfo = vfs_info (handle);
if (vfs->readdir) {
do {
entry = (*vfs->readdir) (dirinfo->info);
if (entry == NULL) return NULL;
str_reset_buffer (vfs_str_buffer);
state = str_vfs_convert_from (dirinfo->converter,
entry->d_name, vfs_str_buffer);
} while (state != 0);
memcpy (&result, entry, sizeof (struct dirent));
g_strlcpy (result.d_name, vfs_str_buffer->data, NAME_MAX + 1);
result.d_reclen = strlen (result.d_name);
}
if (entry == NULL) errno = vfs->readdir ? ferrno (vfs) : E_NOTSUPP;
return (entry != NULL) ? &result : NULL;
}
int
@ -518,9 +771,14 @@ mc_closedir (DIR *dirp)
int handle = *(int *) dirp;
struct vfs_class *vfs = vfs_op (handle);
int result;
struct vfs_dirinfo *dirinfo;
result = vfs->closedir ? (*vfs->closedir)(vfs_info (handle)) : -1;
dirinfo = vfs_info (handle);
if (dirinfo->converter != str_cnv_from_term) str_close_conv (dirinfo->converter);
result = vfs->closedir ? (*vfs->closedir)(dirinfo->info) : -1;
vfs_free_handle (handle);
g_free (dirinfo);
g_free (dirp);
return result;
}
@ -529,24 +787,37 @@ int mc_stat (const char *filename, struct stat *buf) {
struct vfs_class *vfs;
int result;
char *path;
path = vfs_canon (filename); vfs = vfs_get_class (path);
path = vfs_canon_and_translate (filename);
if (path != NULL) {
vfs = vfs_get_class (path);
result = vfs->stat ? (*vfs->stat) (vfs, path, buf) : -1;
g_free (path);
if (result == -1)
errno = vfs->name ? ferrno (vfs) : E_NOTSUPP;
return result;
} else return -1;
}
int mc_lstat (const char *filename, struct stat *buf) {
struct vfs_class *vfs;
int result;
char *path;
path = vfs_canon (filename); vfs = vfs_get_class (path);
path = vfs_canon_and_translate (filename);
if (path != NULL) {
vfs = vfs_get_class (path);
result = vfs->lstat ? (*vfs->lstat) (vfs, path, buf) : -1;
g_free (path);
if (result == -1)
errno = vfs->name ? ferrno (vfs) : E_NOTSUPP;
return result;
} else return -1;
}
int mc_fstat (int handle, struct stat *buf) {
@ -569,25 +840,40 @@ int mc_fstat (int handle, struct stat *buf) {
static const char *
_vfs_get_cwd (void)
{
char *p;
char *sys_cwd;
char *trans;
const char *encoding;
char *tmp;
int state;
struct stat my_stat, my_stat2;
if (!_vfs_get_class (current_dir)) {
p = g_get_current_dir ();
if (!p) /* One of the directories in the path is not readable */
trans = vfs_translate_path_n (current_dir); //add check if NULL
if (!_vfs_get_class (trans)) {
encoding = vfs_get_encoding (current_dir);
if (encoding == NULL) {
tmp = g_get_current_dir ();
if (tmp != NULL) { /* One of the directories in the path is not readable */
str_reset_buffer (vfs_str_buffer);
state = str_vfs_convert_from (str_cnv_from_term, tmp, vfs_str_buffer);
g_free (tmp);
sys_cwd = (state == 0) ? g_strdup (vfs_str_buffer->data) : NULL;
if (!sys_cwd)
return current_dir;
/* Otherwise check if it is O.K. to use the current_dir */
if (!cd_symlinks || mc_stat (p, &my_stat)
if (!cd_symlinks || mc_stat (sys_cwd, &my_stat)
|| mc_stat (current_dir, &my_stat2)
|| my_stat.st_ino != my_stat2.st_ino
|| my_stat.st_dev != my_stat2.st_dev) {
g_free (current_dir);
current_dir = p;
return p;
} /* Otherwise we return current_dir below */
g_free (p);
current_dir = sys_cwd;
return sys_cwd;
}/* Otherwise we return current_dir below */
}
}
}
g_free (trans);
return current_dir;
}
@ -682,22 +968,27 @@ int
mc_chdir (const char *path)
{
char *new_dir;
char *trans_dir;
struct vfs_class *old_vfs, *new_vfs;
vfsid old_vfsid;
int result;
new_dir = vfs_canon (path);
new_vfs = vfs_get_class (new_dir);
trans_dir = vfs_translate_path_n (new_dir);
if (trans_dir != NULL) {
new_vfs = vfs_get_class (trans_dir);
if (!new_vfs->chdir) {
g_free (new_dir);
g_free (trans_dir);
return -1;
}
result = (*new_vfs->chdir) (new_vfs, new_dir);
result = (*new_vfs->chdir) (new_vfs, trans_dir);
if (result == -1) {
errno = ferrno (new_vfs);
g_free (new_dir);
g_free (trans_dir);
return -1;
}
@ -720,7 +1011,12 @@ mc_chdir (const char *path)
*p = 0;
}
g_free (trans_dir);
return 0;
} else {
g_free (new_dir);
return -1;
}
}
/* Return 1 is the current VFS class is local */
@ -737,10 +1033,12 @@ vfs_file_class_flags (const char *filename)
struct vfs_class *vfs;
char *fname;
fname = vfs_canon (filename);
fname = vfs_canon_and_translate (filename);
if (fname != NULL) {
vfs = vfs_get_class (fname);
g_free (fname);
return vfs->flags;
} else return -1;
}
static char *
@ -792,7 +1090,10 @@ char *
mc_getlocalcopy (const char *pathname)
{
char *result;
char *path = vfs_canon (pathname);
char *path;
path = vfs_canon_and_translate (pathname);
if (path != NULL) {
struct vfs_class *vfs = vfs_get_class (path);
result = vfs->getlocalcopy ? (*vfs->getlocalcopy)(vfs, path) :
@ -801,6 +1102,7 @@ mc_getlocalcopy (const char *pathname)
if (!result)
errno = ferrno (vfs);
return result;
} else return NULL;
}
static int
@ -854,7 +1156,10 @@ int
mc_ungetlocalcopy (const char *pathname, const char *local, int has_changed)
{
int return_value = 0;
char *path = vfs_canon (pathname);
char *path;
path = vfs_canon_and_translate (pathname);
if (path != NULL) {
struct vfs_class *vfs = vfs_get_class (path);
return_value = vfs->ungetlocalcopy ?
@ -862,12 +1167,14 @@ mc_ungetlocalcopy (const char *pathname, const char *local, int has_changed)
mc_def_ungetlocalcopy (vfs, path, local, has_changed);
g_free (path);
return return_value;
} else return -1;
}
void
vfs_init (void)
{
vfs_str_buffer = str_get_buffer ();
/* localfs needs to be the first one */
init_localfs();
/* fallback value for vfs_get_class() */
@ -911,6 +1218,8 @@ vfs_shut (void)
(*vfs->done) (vfs);
g_slist_free (vfs_openfiles);
str_release_buffer (vfs_str_buffer);
}
/*

View File

@ -10,6 +10,17 @@ char *mc_get_current_wd (char *buffer, int bufsize);
char *vfs_get_current_dir (void);
int vfs_current_is_local (void);
int vfs_file_is_local (const char *filename);
/* translate path back to terminal encoding, remove all #enc:
* every invalid character is replaced with question mark
* return static buffer */
char *vfs_translate_path (const char *path);
/* return new string */
char *vfs_translate_path_n (const char *path);
/* return encoding after last #enc: or NULL, if part does not contain #enc:
* return static buffer */
const char *vfs_get_encoding (const char *path);
// canonize and translate path, return new string */
char *vfs_canon_and_translate (const char *path);
/* Only the routines outside of the VFS module need the emulation macros */