1
1

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
Этот коммит содержится в:
Ilia Maslakov 2009-04-04 19:50:46 +00:00
родитель 19fddfa787 ecd16f7873
Коммит 3b5e2c052f
77 изменённых файлов: 18476 добавлений и 13118 удалений

Просмотреть файл

@ -428,13 +428,20 @@ dnl
AC_DEFUN([MC_WITH_NCURSES], [ AC_DEFUN([MC_WITH_NCURSES], [
dnl has_colors() is specific to ncurses, it's not in the old curses dnl has_colors() is specific to ncurses, it's not in the old curses
save_LIBS="$LIBS" 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= LIBS=
AC_SEARCH_LIBS([has_colors], [ncurses curses], [MCLIBS="$MCLIBS $LIBS"], AC_SEARCH_LIBS([has_colors], [ncurses curses], [MCLIBS="$MCLIBS $LIBS"],
[AC_MSG_ERROR([Cannot find ncurses library])]) [AC_MSG_ERROR([Cannot find ncurses library])])
fi
dnl Check the header dnl Check the header
ncurses_h_found= 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]) [ncurses_h_found=yes; break])
if test -z "$ncurses_h_found"; then if test -z "$ncurses_h_found"; then
@ -464,6 +471,52 @@ AC_DEFUN([MC_WITH_NCURSES], [
LIBS="$save_LIBS" 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
dnl Check for ext2fs recovery code dnl Check for ext2fs recovery code

Просмотреть файл

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

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Просмотреть файл

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

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Просмотреть файл

@ -6,23 +6,23 @@
v v v mqv v v v mqu v v mj v v v mqv v v v mqu v v mj
qqqqqqCommander qj  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 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 egy entertHow to use help. Itt közvetlenül a súgó tartalomjegyzékébeContents
juthatsz. 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 A Midnight Commander mindenféle garanciaWarranty nélkül kerül
kiadсsra. Ez szabad szoftver, эgy tovсbbadhatod azt a kiadásra. Ez szabad szoftver, így továbbadhatod azt a
Felhasznсlсsi engedщlybenLicense meghatсrozott feltщtelekkel. Felhasználási engedélybenLicense meghatározott feltételekkel.
[License] [License]
Engedщlyek Engedélyek
Ez a rщsz a GNU сltalсnos felhasznсlсsi Ez a rész a GNU általános felhasználási
engedщlyщt tartalmazza. engedélyét tartalmazza.
- Ennek hivatalos nyelve angol. - - 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. Library General Public License instead of this License.
[QueryBox] [QueryBox]
Lekщrdezї box Lekérdező box
A lekщrdezї boxban kezelщsщhez a nyэl billenty√ket, a 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ї szövegrész elejének magadásást, vagy a gombokra történő
egщrkattintсst hasznсlhatod. egérkattintást használhatod.
[How to use help] [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 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 egér gombjait is használhatod. A lefelé mutató nyíl
lenyomсsсra a kЎvetkezї bejegyzщsre ugorhatsz, vagy lenyomására a következő bejegyzésre ugorhatsz, vagy
legЎrdэtheted azt. A felfelщ mutatє nyэl lenyomсsсra legördítheted azt. A felfelé mutató nyíl lenyomására
ez elїzї bejegyzщsre ugorhatsz, vagy felh·zhatod azt. ez előző bejegyzésre ugorhatsz, vagy felhúzhatod azt.
A jobbra mutatє nyэl lenyomсsсra a linknek megfelelї 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 címre lép. A balra mutató nyíl lenyomására az előzőleg
meglсtogatott cэmre lщpsz vissza. meglátogatott címre lépsz vissza.
Ha az сltalad hasznсlt terminсl nem tсmogatja a kurzor 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 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 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 TAB gombot a következő bejegyzésre való ugráshoz és az
ENTER-t a jelenlegi link сltal megadott cэmre tЎrtщnї 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épéshez. Az 'l' (last=utolsó) gombot az előzőleg
lсtogatott oldalra valє visszalщpщsre hasznсlhatod. Az látogatott oldalra való visszalépésre használhatod. Az
ESC lenyomсsсval kilщphetsz a S·gєbєl. ESC lenyomásával kiléphetsz a Súgóból.
A bal egщrgomb lenyomсsсval kЎvetheted a linket, vagy A bal egérgomb lenyomásával követheted a linket, vagy
gЎrdэthetsz. A jobb gomb lenyomсsсval visszatщrhetsz az gördíthetsz. A jobb gomb lenyomásával visszatérhetsz az
elїzїleg lсtogatott pontra. 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. tab Mozgás a következő elemre.
M-tab Mozgсs az elїzї elemre. M-tab Mozgás az előző elemre.
down Mozgсs a kЎvetkezї elemre; a sorokat lefelщ down Mozgás a következő elemre; a sorokat lefelé
gЎrdэti. gördíti.
up Mozgсs az elїzї elemre; a sorokat felfelщ up Mozgás az előző elemre; a sorokat felfelé
gЎrdэti. gördíti.
right, enter KЎveti a jelenlegi linket. right, enter Követi a jelenlegi linket.
left, l Visszalщp az elїzїleg meglсtogatott pontra. left, l Visszalép az előzőleg meglátogatott pontra.
F1 Megjelenэti a S·gєt a S·gє nщzїvel. F1 Megjeleníti a Súgót a Súgó nézővel.
n ┴tlщp a kЎvetkezї pontra. n Átlép a következő pontra.
p ┴tlщp az elїzї pontra. p Átlép az előző pontra.
c A Tartalomjegyzщkhez ugrik. c A Tartalomjegyzékhez ugrik.
F10, esc Kilщp a S·gєbєl. F10, esc Kilép a Súgóból.
 
Local variables: Local variables:
fill-column: 58 fill-column: 58

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Просмотреть файл

@ -7,17 +7,17 @@
v v v mqv v v v mqu v v mj v v v mqv v v v mqu v v mj
qqqqqqCommander qj  qqqqqqCommander qj 
Questa ш la principale schermata della guida interattiva Questa è la principale schermata della guida interattiva
del GNU Midnight Commander . del GNU Midnight Commander .
Per saperne di pi su come usare la guida interattiva, premere Per saperne di più su come usare la guida interattiva, premere
semplicemente invioHow to use help. Se lo si desidera, ш possibile semplicemente invioHow to use help. Se lo si desidera, è possibile
consultare direttamente il sommarioContents della guida. 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. 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] certe condizioniLicenza.[Licenza]
GNU GENERAL PUBLIC LICENSE GNU GENERAL PUBLIC LICENSE
@ -432,7 +432,7 @@ Library General Public License instead of this License.
[QueryBox] [QueryBox]
Finestre di dialogo di richiesta dati 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 usare i tasti freccia o la prima lettera per selezionare
una voce o cliccare con il mouse sul bottone. 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 Usare i tasti del cursore o il mouse per navigare
nel visualizzatore della guida. 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. successiva o per spostarsi in basso.
Premere freccia in su per spostarsi alla voce Premere freccia in su per spostarsi alla voce
precedente o per spostarsi in alto. precedente o per spostarsi in alto.
@ -451,7 +451,7 @@ corrente.
Premere freccia a sinistra per tornare indietro nello Premere freccia a sinistra per tornare indietro nello
storico dei nodi visitati. 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 usare la barra spaziatrice per spostarsi in avanti
ed il tasto 'b' per tornare indietro. Usare il tasto ed il tasto 'b' per tornare indietro. Usare il tasto
TAB per spostarsi sulla prossima voce e premere 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. tab Va alla voce successiva.
M-tab Va alla voce precedente. 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. su Va alla voce precedente o una riga in alto.
destra, invio Segue il collegamento corrente. destra, invio Segue il collegamento corrente.
sinistra, l Torna indietro nello storico dei nodi visitati. sinistra, l Torna indietro nello storico dei nodi visitati.

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Просмотреть файл

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

21
doc/ru/CHARSET.workflow.txt Обычный файл
Просмотреть файл

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

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Просмотреть файл

@ -6,19 +6,19 @@
v v v mqv v v v mqu v v mj v v v mqv v v v mqu v v mj
qqqqqqCommander qj  qqqqqqCommander qj 
ў┘ ╙┼╩▐┴╙ ╫╔─╔╘┼ ╟╠┴╫╬╧┼ ╧╦╬╧ ╔╬╘┼╥┴╦╘╔╫╬╧╩ ╨╧─╙╦┴┌╦╔ Вы сейчас видите главное окно интерактивной подсказки
╨╥╧╟╥┴══┘ GNU Midnight Commander . программы GNU Midnight Commander .
■╘╧┬┘ ╒┌╬┴╘╪, ╦┴╦ ╨╧╠╪┌╧╫┴╘╪╙╤ ╨╧─╙╦┴┌╦╧╩, ╬┴╓═╔╘┼ ╦╠┴╫╔█╒ Чтобы узнать, как пользоваться подсказкой, нажмите клавишу
EnterHow to use help, ╔╬┴▐┼ ╨┼╥┼╚╧─╔╘┼ ╦ ╨┼╥┼▐╬└ ╥┴┌─┼╠╧╫Contents ╨╧─╙╦┴┌╦╔. EnterHow to use help, иначе переходите к перечню разделовContents подсказки.
Ё╥╧╟╥┴══┴ Midnight Commander ╨╧╙╘┴╫╠╤┼╘╙╤ стєяьрЇюя тх· Программа Midnight Commander поставляется АБСОЛЮТНО БЕЗ
ўєёыщш чсЄсюЇщъч┴╥┴╬╘╔╤. №╘╧ ╙╫╧┬╧─╬╧ ╥┴╙╨╥╧╙╘╥┴╬╤┼═╧┼ ╨╥╧╟╥┴══╬╧┼ ВСЯКИХ ГАРАНТИЙГарантия. Это свободно распространяемое программное
╧┬┼╙╨┼▐┼╬╔┼, ╙╧┌─┴╬╬╧┼ ╟╥╒╨╨╧╩ ┴╫╘╧╥╧╫AUTHORS. ў┘ ═╧╓┼╘┼ ╨┼╥┼─┴╫┴╘╪ обеспечение, созданное группой авторовAUTHORS. Вы можете передавать
┼╟╧ ─╥╒╟╔═ ╨╥╔ ╒╙╠╧╫╔╔ ╙╧┬╠└─┼╬╔╤ ╘╥┼┬╧╫┴╬╔╩ ╠╔├┼╬┌╔╔ GNUь╔├┼╬┌╔╤ (╧╥╔╟╔╬┴╠ ╬┴ ┴╬╟╠╔╩╙╦╧═) его другим при условии соблюдения требований лицензии GNUЛицензия (оригинал на английском)
(╨╥╧▐╔╘┴╩╘┼ ╬┼╧╞╔├╔┴╠╪╬┘╩ ╨┼╥┼╫╧─ь╔├┼╬┌╔╤ ▄╘╧╩ ╠╔├┼╬┌╔╔). (прочитайте неофициальный переводЛицензия этой лицензии).
Є╒╙╙╦╔╩ ╨┼╥┼╫╧─ ╘┼╦╙╘┴ ╨╧─╙╦┴┌╦╔ - ы╧╙╘╥╧═╔╬ ў.с., 1999 ╟.[ь╔├┼╬┌╔╤ (╧╥╔╟╔╬┴╠ ╬┴ ┴╬╟╠╔╩╙╦╧═)] Русский перевод текста подсказки - Костромин В.А., 1999 г.[Лицензия (оригинал на английском)]
GNU GENERAL PUBLIC LICENSE GNU GENERAL PUBLIC LICENSE
Version 2, June 1991 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. If this is what you want to do, use the GNU
Library General Public License instead of this License. Library General Public License instead of this License.
[ь╔├┼╬┌╔╤] [Лицензия]
їющўхЄєсь°юсё ят¤хєЇўхююсё ьщухю·щё GNU УНИВЕРСАЛЬНАЯ ОБЩЕСТВЕННАЯ ЛИЦЕНЗИЯ GNU
ў┼╥╙╔╤ 2, ╔└╬╪ 1991 Версия 2, июнь 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc. Copyright (C) 1989, 1991 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
(C) Ё┼╥┼╫╧─. я.ў. ы╒┌╔╬┴, ў.э. р╞┴, 1993 (C) Перевод. О.В. Кузина, В.М. Юфа, 1993
(C) Ё┼╥┼╫╧─. я.є. Ї╔╚╧╬╧╫, 1998 (C) Перевод. О.С. Тихонов, 1998
ў╙┼═ ╥┴┌╥┼█┴┼╘╙╤ ╦╧╨╔╥╧╫┴╘╪ ╔ ╥┴╙╨╥╧╙╘╥┴╬╤╘╪ ─╧╙╠╧╫╬┘┼ ╦╧╨╔╔ Всем разрешается копировать и распространять дословные копии
▄╘╧╟╧ ╠╔├┼╬┌╔╧╬╬╧╟╧ ─╧╦╒═┼╬╘┴, ╬╧ ╔┌═┼╬╤╘╪ ┼╟╧ ╬┼╠╪┌╤. этого лицензионного документа, но изменять его нельзя.
Ё╥┼┴═┬╒╠┴ Преамбула
ь╔├┼╬┌╔╔ ╬┴ ┬╧╠╪█╒└ ▐┴╙╘╪ ╨╥╧╟╥┴══╬╧╟╧ ╧┬┼╙╨┼▐┼╬╔╤ (Ёя) ╙╧╙- Лицензии на большую часть программного обеспечения (ПО) сос-
╘┴╫╠┼╬┘ ╘┴╦, ▐╘╧┬┘ ╠╔█╔╘╪ ╫┴╙ ╙╫╧┬╧─┘ ╙╧╫═┼╙╘╬╧ ╔╙╨╧╠╪┌╧╫┴╘╪ тавлены так, чтобы лишить вас свободы совместно использовать
╔ ╔┌═┼╬╤╘╪ ┼╟╧. ю┴╨╥╧╘╔╫, ї╬╔╫┼╥╙┴╠╪╬┴╤ я┬▌┼╙╘╫┼╬╬┴╤ ь╔├┼╬┌╔╤ и изменять его. Напротив, Универсальная Общественная Лицензия
GNU ╨╥┼─╬┴┌╬┴▐┼╬┴ ╟┴╥┴╬╘╔╥╧╫┴╘╪ ╫┴█╒ ╙╫╧┬╧─╒ ╙╧╫═┼╙╘╬╧ ╔╙- GNU предназначена гарантировать вашу свободу совместно ис-
╨╧╠╪┌╧╫┴╘╪ ╔ ╔┌═┼╬╤╘╪ ╙╫╧┬╧─╬╧┼ Ёя, ╘.┼. ╒─╧╙╘╧╫┼╥╔╘╪, ▐╘╧ Ёя пользовать и изменять свободное ПО, т.е. удостоверить, что ПО
╤╫╠╤┼╘╙╤ ╙╫╧┬╧─╬┘═ ─╠╤ ╫╙┼╚ ┼╟╧ ╨╧╠╪┌╧╫┴╘┼╠┼╩. №╘┴ ї╬╔╫┼╥- является свободным для всех его пользователей. Эта Универ-
╙┴╠╪╬┴╤ я┬▌┼╙╘╫┼╬╬┴╤ ь╔├┼╬┌╔╤ ╨╥╔═┼╬╔═┴ ╦ ┬╧╠╪█┼╩ ▐┴╙╘╔ Ёя сальная Общественная Лицензия применима к большей части ПО
ц╧╬─┴ є╫╧┬╧─╬╧╟╧ Ёя ╔ ╦╧ ╫╙┼═ ─╥╒╟╔═ ╨╥╧╟╥┴══┴═, ▐╪╔ ┴╫╘╧╥┘ Фонда Свободного ПО и ко всем другим программам, чьи авторы
╨╥╔╬╔═┴└╘ ╬┴ ╙┼┬╤ ╧┬╤┌┴╘┼╠╪╙╘╫┴ ┼┼ ╔╙╨╧╠╪┌╧╫┴╘╪. (ў═┼╙╘╧ ╬┼┼ принимают на себя обязательства ее использовать. (Вместо нее
─╠╤ ▐┴╙╘╔ Ёя ц╧╬─┴ є╫╧┬╧─╬╧╟╧ Ёя ╨╥╔═┼╬╤┼╘╙╤ ї╬╔╫┼╥╙┴╠╪╬┴╤ для части ПО Фонда Свободного ПО применяется Универсальная
я┬▌┼╙╘╫┼╬╬┴╤ ь╔├┼╬┌╔╤ GNU ─╠╤ ┬╔┬╠╔╧╘┼╦.) ў┘ ╘╧╓┼ ═╧╓┼╘┼ Общественная Лицензия GNU для библиотек.) Вы тоже можете
╔╙╨╧╠╪┌╧╫┴╘╪ ┼┼ ─╠╤ ╙╫╧╔╚ ╨╥╧╟╥┴══. использовать ее для своих программ.
ы╧╟─┴ ═┘ ╟╧╫╧╥╔═ ╧ ╙╫╧┬╧─╬╧═ Ёя, ═┘ ╔═┼┼═ ╫ ╫╔─╒ ╙╫╧┬╧─╒, ┴ Когда мы говорим о свободном ПО, мы имеем в виду свободу, а
╬┼ ├┼╬╒. Ё╥┼─╨╧╠┴╟┴┼╘╙╤, ▐╘╧ ╬┴█╔ ї╬╔╫┼╥╙┴╠╪╬┘┼ я┬▌┼╙╘╫┼╬╬┘┼ не цену. Предполагается, что наши Универсальные Общественные
ь╔├┼╬┌╔╔ ╟┴╥┴╬╘╔╥╒└╘, ▐╘╧ ╫┘ ╨╧╠╪┌╒┼╘┼╙╪ ╙╫╧┬╧─╧╩ ╥┴╙╨╥╧╙╘╥┴- Лицензии гарантируют, что вы пользуетесь свободой распростра-
╬╤╘╪ ╦╧╨╔╔ ╙╫╧┬╧─╬╧╟╧ Ёя (╔ ╨╧╠╒▐┴╘╪ ┌┴ ▄╘╧ ╫╧┌╬┴╟╥┴╓─┼╬╔┼, нять копии свободного ПО (и получать за это вознаграждение,
┼╙╠╔ ╫┘ ╘╧╟╧ ╓┼╠┴┼╘┼); ▐╘╧ ╫┘ ╨╧╠╒▐┴┼╘┼ ╔╙╚╧─╬┘╩ ╦╧─ ╔╠╔ если вы того желаете); что вы получаете исходный код или
═╧╓┼╘┼ ╨╧╠╒▐╔╘╪ ┼╟╧, ┼╙╠╔ ┌┴╚╧╘╔╘┼; ▐╘╧ ╫┘ ═╧╓┼╘┼ ╔┌═┼╬╤╘╪ можете получить его, если захотите; что вы можете изменять
Ёя ╔╠╔ ╔╙╨╧╠╪┌╧╫┴╘╪ ┼╟╧ ▐┴╙╘╔ ╫ ╬╧╫┘╚ ╙╫╧┬╧─╬┘╚ ╨╥╧╟╥┴══┴╚; ПО или использовать его части в новых свободных программах;
╔ ▐╘╧ ╫┘ ┌╬┴┼╘┼, ▐╘╧ ╫┘ ═╧╓┼╘┼ ╫╙┼ ▄╘╧ ─┼╠┴╘╪. и что вы знаете, что вы можете все это делать.
■╘╧┬┘ ┌┴▌╔╘╔╘╪ ╫┴█╔ ╨╥┴╫┴, ╬┴═ ╬╒╓╬╧ ╫╫┼╙╘╔ ╘┴╦╔┼ ╧╟╥┴╬╔▐┼- Чтобы защитить ваши права, нам нужно ввести такие ограниче-
╬╔╤, ╦╧╘╧╥┘┼ ┌┴╨╥┼╘╤╘ ╦╧═╒ ┬┘ ╘╧ ╬╔ ┬┘╠╧ ╧╘╦┴┌┘╫┴╘╪ ╫┴═ ╫ ния, которые запретят кому бы то ни было отказывать вам в
▄╘╔╚ ╨╥┴╫┴╚ ╔╠╔ ╨╧╘╥┼┬╧╫┴╘╪ ╧╘ ╫┴╙ ╧╘╦┴┌┴╘╪╙╤ ╧╘ ▄╘╔╚ ╨╥┴╫. этих правах или потребовать от вас отказаться от этих прав.
№╘╔ ╧╟╥┴╬╔▐┼╬╔╤ ╨┼╥┼╫╧─╤╘╙╤ ╫ ╬┼╦╧╘╧╥┘┼ ╧┬╤┌┴╘┼╠╪╙╘╫┴ ─╠╤ Эти ограничения переводятся в некоторые обязательства для
╫┴╙, ┼╙╠╔ ╫┘ ╥┴╙╨╥╧╙╘╥┴╬╤┼╘┼ ╦╧╨╔╔ Ёя ╔╠╔ ┼╙╠╔ ╫┘ ═╧─╔╞╔├╔- вас, если вы распространяете копии ПО или если вы модифици-
╥╒┼╘┼ ┼╟╧. руете его.
ю┴╨╥╔═┼╥, ┼╙╠╔ ╫┘ ╥┴╙╨╥╧╙╘╥┴╬╤┼╘┼ ╦╧╨╔╔ ╘┴╦╧╩ ╨╥╧╟╥┴══┘ Например, если вы распространяете копии такой программы
┬┼╙╨╠┴╘╬╧ ╔╠╔ ┌┴ ╫╧┌╬┴╟╥┴╓─┼╬╔┼, ╫┘ ─╧╠╓╬┘ ╨╥┼─╧╙╘┴╫╔╘╪ бесплатно или за вознаграждение, вы должны предоставить
╨╧╠╒▐┴╘┼╠╤═ ╫╙┼ ╨╥┴╫┴, ╦╧╘╧╥┘═╔ ╫┘ ╧┬╠┴─┴┼╘┼. ў┘ ─╧╠╓╬┘ получателям все права, которыми вы обладаете. Вы должны
╟┴╥┴╬╘╔╥╧╫┴╘╪, ▐╘╧ ╧╬╔ ╘╧╓┼ ╨╧╠╒▐┴╘ ╔╠╔ ╙═╧╟╒╘ ╨╧╠╒▐╔╘╪ гарантировать, что они тоже получат или смогут получить
╔╙╚╧─╬┘╩ ╦╧─. щ ╫┘ ─╧╠╓╬┘ ╨╧╦┴┌┴╘╪ ╔═ ▄╘╔ ╒╙╠╧╫╔╤, ▐╘╧┬┘ исходный код. И вы должны показать им эти условия, чтобы
╧╬╔ ┌╬┴╠╔ ╧ ╙╫╧╔╚ ╨╥┴╫┴╚. они знали о своих правах.
э┘ ┌┴▌╔▌┴┼═ ╫┴█╔ ╨╥┴╫┴ ╫ ─╫┴ ▄╘┴╨┴: (1) ╙╧╚╥┴╬╤┼═ ┴╫╘╧╥╙╦╔┼ Мы защищаем ваши права в два этапа: (1) сохраняем авторские
╨╥┴╫┴ ╬┴ Ёя ╔ (2) ╨╥┼─╠┴╟┴┼═ ╫┴═ ▄╘╒ ╠╔├┼╬┌╔└, ╦╧╘╧╥┴╤ ─┴┼╘ права на ПО и (2) предлагаем вам эту лицензию, которая дает
╫┴═ ┌┴╦╧╬╬╧┼ ╨╥┴╫╧ ╦╧╨╔╥╧╫┴╘╪, ╥┴╙╨╥╧╙╘╥┴╬╤╘╪ ╔/╔╠╔ ═╧─╔╞╔- вам законное право копировать, распространять и/или модифи-
├╔╥╧╫┴╘╪ Ёя. цировать ПО.
Ї┴╦╓┼, ▐╘╧┬┘ ┌┴▌╔╘╔╘╪ ╬┴╙ ╔ ╦┴╓─╧╟╧ ┴╫╘╧╥┴, ═┘ ╚╧╘╔═ ╒─╧╙╘╧- Также, чтобы защитить нас и каждого автора, мы хотим удосто-
╫┼╥╔╘╪╙╤, ▐╘╧ ╫╙┼ ╨╧╬╔═┴└╘, ▐╘╧ ╟┴╥┴╬╘╔╩ ╬┴ ▄╘╧ ╙╫╧┬╧─╬╧┼ Ёя вериться, что все понимают, что гарантий на это свободное ПО
╬┼╘. х╙╠╔ Ёя ═╧─╔╞╔├╔╥╒┼╘╙╤ ╔ ╨┼╥┼─┴┼╘╙╤ ╦┼═-╘╧ ┼▌┼, ═┘ нет. Если ПО модифицируется и передается кем-то еще, мы
╚╧╘╔═, ▐╘╧┬┘ ╨╧╠╒▐┴╘┼╠╔ Ёя ┌╬┴╠╔, ▐╘╧ ╘╧, ▐╘╧ ╒ ╬╔╚ ┼╙╘╪ -- хотим, чтобы получатели ПО знали, что то, что у них есть --
▄╘╧ ╬┼ ╧╥╔╟╔╬┴╠, ▐╘╧┬┘ ╠└┬┘┼ ╨╥╧┬╠┼═┘, ╙╧┌─┴╬╬┘┼ ─╥╒╟╔═╔, ╬┼ это не оригинал, чтобы любые проблемы, созданные другими, не
╧╘╥┴┌╔╠╔╙╪ ╬┴ ╥┼╨╒╘┴├╔╔ ╨┼╥╫╧╬┴▐┴╠╪╬┘╚ ┴╫╘╧╥╧╫. отразились на репутации первоначальных авторов.
щ ╬┴╦╧╬┼├, ╦┴╓─╧╩ ╙╫╧┬╧─╬╧╩ ╨╥╧╟╥┴══┼ ╨╧╙╘╧╤╬╬╧ ╒╟╥╧╓┴└╘ ╨┴- И наконец, каждой свободной программе постоянно угрожают па-
╘┼╬╘┘ ╬┴ Ёя. э┘ ╚╧╘╔═ ╔┌┬┼╓┴╘╪ ╧╨┴╙╬╧╙╘╔, ▐╘╧ ╨╧╫╘╧╥╬┘┼ ╥┴╙- тенты на ПО. Мы хотим избежать опасности, что повторные рас-
╨╥╧╙╘╥┴╬╔╘┼╠╔ ╙╫╧┬╧─╬╧╩ ╨╥╧╟╥┴══┘ ╙┴═╧╙╘╧╤╘┼╠╪╬╧ ╨╧╠╒▐┴╘ ╨┴- пространители свободной программы самостоятельно получат па-
╘┼╬╘┘, ─┼╠┴╤ ╨╥╧╟╥┴══╒ ╘┴╦╔═ ╧┬╥┴┌╧═ ▐┴╙╘╬╧╩ ╙╧┬╙╘╫┼╬╬╧╙╘╪└. тенты, делая программу таким образом частной собственностью.
■╘╧┬┘ ╨╥┼─╧╘╫╥┴╘╔╘╪ ▄╘╧, ═┘ ╤╫╬╧ ┌┴╤╫╠╤┼═, ▐╘╧ ╠└┬╧╩ ╨┴╘┼╬╘ Чтобы предотвратить это, мы явно заявляем, что любой патент
─╧╠╓┼╬ ┬┘╘╪ ╠╔┬╧ ╨╥┼─╧╙╘┴╫╠┼╬ ╫╙┼═ ─╠╤ ╙╫╧┬╧─╬╧╟╧ ╔╙╨╧╠╪┌╧- должен быть либо предоставлен всем для свободного использо-
╫┴╬╔╤, ╠╔┬╧ ╬┼ ╨╥┼─╧╙╘┴╫╠┼╬ ╬╔╦╧═╒. вания, либо не предоставлен никому.
ю╔╓┼ ╙╠┼─╒└╘ ╘╧▐╬┘┼ ╧╨╥┼─┼╠┼╬╔╤ ╔ ╒╙╠╧╫╔╤ ─╠╤ ╦╧╨╔╥╧╫┴╬╔╤, Ниже следуют точные определения и условия для копирования,
╥┴╙╨╥╧╙╘╥┴╬┼╬╔╤ ╔ ═╧─╔╞╔╦┴├╔╔. распространения и модификации.
яЁЄхфхьхющё щ їєьяўщё фьё ыяЁщЄяўсющё, ЄсєЁЄяєЇЄсюхющё щ ОПРЕДЕЛЕНИЯ И УСЛОВИЯ ДЛЯ КОПИРОВАНИЯ, РАСПРОСТРАНЕНИЯ И
эяфщцщысущщ МОДИФИКАЦИИ
1. №╘┴ ь╔├┼╬┌╔╤ ╨╥╔═┼╬╔═┴ ╦ ╠└┬╧╩ ╨╥╧╟╥┴══┼ ╔╠╔ ─╥╒╟╧═╒ 1. Эта Лицензия применима к любой программе или другому
╨╥╧╔┌╫┼─┼╬╔└, ╙╧─┼╥╓┴▌┼═╒ ╒╫┼─╧═╠┼╬╔┼, ╨╧═┼▌┼╬╬╧┼ ─┼╥╓┴- произведению, содержащему уведомление, помещенное держа-
╘┼╠┼═ ┴╫╘╧╥╙╦╔╚ ╨╥┴╫ ╔ ╙╧╧┬▌┴└▌┼┼ ╧ ╘╧═, ▐╘╧ ╧╬╧ ═╧╓┼╘ телем авторских прав и сообщающее о том, что оно может
╥┴╙╨╥╧╙╘╥┴╬╤╘╪╙╤ ╨╥╔ ╒╙╠╧╫╔╤╚, ╧╟╧╫╧╥┼╬╬┘╚ ╫ ─┴╬╬╧╩ ї╬╔- распространяться при условиях, оговоренных в данной Уни-
╫┼╥╙┴╠╪╬╧╩ я┬▌┼╙╘╫┼╬╬╧╩ ь╔├┼╬┌╔╔. ў ╨╧╙╠┼─╒└▌┼═ ╘┼╥═╔╬ версальной Общественной Лицензии. В последующем термин
"Ё╥╧╟╥┴══┴" ╧╘╬╧╙╔╘╙╤ ╦ ╠└┬╧╩ ╘┴╦╧╩ ╨╥╧╟╥┴══┼ ╔╠╔ ╨╥╧╔┌- "Программа" относится к любой такой программе или произ-
╫┼─┼╬╔└, ┴ ╘┼╥═╔╬ "╨╥╧╔┌╫┼─┼╬╔┼, ╧╙╬╧╫┴╬╬╧┼ ╬┴ Ё╥╧╟╥┴══┼" ведению, а термин "произведение, основанное на Программе"
╧┌╬┴▐┴┼╘ Ё╥╧╟╥┴══╒ ╔╠╔ ╠└┬╧┼ ╨╥╧╔┌╫┼─┼╬╔┼, ╙╧─┼╥╓┴▌┼┼ означает Программу или любое произведение, содержащее
Ё╥╧╟╥┴══╒ ╔╠╔ ┼┼ ▐┴╙╘╪, ─╧╙╠╧╫╬╒└, ╔╠╔ ═╧─╔╞╔├╔╥╧╫┴╬╬╒└, Программу или ее часть, дословную, или модифицированную,
╔/╔╠╔ ╨┼╥┼╫┼─┼╬╬╒└ ╬┴ ─╥╒╟╧╩ ╤┌┘╦. (·─┼╙╪ ╔ ─┴╠┼┼ ╨┼╥┼╫╧─ и/или переведенную на другой язык. (Здесь и далее перевод
╫╦╠└▐┴┼╘╙╤ ┬┼┌ ╧╟╥┴╬╔▐┼╬╔╩ ╫ ╨╧╬╤╘╔┼ "═╧─╔╞╔╦┴├╔╤".) включается без ограничений в понятие "модификация".)
ы┴╓─┘╩ ╧┬╠┴─┴╘┼╠╪ ╠╔├┼╬┌╔╔ ┴─╥┼╙╒┼╘╙╤ ╦┴╦ "╫┘". ў╔─┘ ─┼╤- Каждый обладатель лицензии адресуется как "вы". Виды дея-
╘┼╠╪╬╧╙╘╔, ╬┼ ╤╫╠╤└▌╔┼╙╤ ╦╧╨╔╥╧╫┴╬╔┼═, ╥┴╙╨╥╧╙╘╥┴╬┼╬╔┼═ тельности, не являющиеся копированием, распространением
╔╠╔ ═╧─╔╞╔╦┴├╔┼╩ ╬┼ ╧╚╫┴╘┘╫┴└╘╙╤ ▄╘╧╩ ь╔├┼╬┌╔┼╩; ╧╬╔ ┌┴ или модификацией не охватываются этой Лицензией; они за
╨╥┼─┼╠┴═╔ ┼┼ ╫╠╔╤╬╔╤. щ╙╨╧╠╪┌╧╫┴╬╔┼ Ё╥╧╟╥┴══┘ ╨╧ ┼┼ ╞╒╬╦- пределами ее влияния. Использование Программы по ее функ-
├╔╧╬┴╠╪╬╧═╒ ╬┴┌╬┴▐┼╬╔└ ╬┼ ╧╟╥┴╬╔▐┼╬╧, ╔ ╫┘╚╧─╬┘┼ ─┴╬╬┘┼ циональному назначению не ограничено, и выходные данные
Ё╥╧╟╥┴══┘ ╧╚╫┴╘┘╫┴└╘╙╤ ▄╘╧╩ ь╔├┼╬┌╔┼╩, ╘╧╠╪╦╧ ┼╙╠╔ ╔╚ ╙╧- Программы охватываются этой Лицензией, только если их со-
─┼╥╓┴╬╔┼ ╤╫╠╤┼╘╙╤ ╨╥╧╔┌╫┼─┼╬╔┼═, ╧╙╬╧╫┴╬╬┘═ ╬┴ Ё╥╧╟╥┴══┼ держание является произведением, основанным на Программе
(╫╬┼ ┌┴╫╔╙╔═╧╙╘╔ ╧╘ ╘╧╟╧, ┬┘╠╔ ╠╔ ╧╬╔ ╨╧╠╒▐┼╬┘ ╫ ╨╥╧├┼╙╙┼ (вне зависимости от того, были ли они получены в процессе
╔╙╨╧╠╪┌╧╫┴╬╔╤ Ё╥╧╟╥┴══┘). ё╫╠╤└╘╙╤ ╠╔ ╧╬╔ ╘┴╦╧╫┘═╔, ┌┴╫╔- использования Программы). Являются ли они таковыми, зави-
╙╔╘ ╧╘ ╘╧╟╧, ▐╘╧ ╔═┼╬╬╧ ─┼╠┴┼╘ Ё╥╧╟╥┴══┴. сит от того, что именно делает Программа.
2. ў┘ ═╧╓┼╘┼ ╦╧╨╔╥╧╫┴╘╪ ╔ ╥┴╙╨╥╧╙╘╥┴╬╤╘╪ ─╧╙╠╧╫╬┘┼ ╦╧╨╔╔ ╔╙- 2. Вы можете копировать и распространять дословные копии ис-
╚╧─╬╧╟╧ ╦╧─┴ Ё╥╧╟╥┴══┘ ╨╧ ┼╟╧ ╨╧╠╒▐┼╬╔╔ ╬┴ ╠└┬╧═ ╬╧╙╔╘┼- ходного кода Программы по его получении на любом носите-
╠┼, ╨╥╔ ╒╙╠╧╫╔╔ ▐╘╧ ╫┘ ╙╧╧╘╫┼╘╙╘╫╒└▌╔═ ╧┬╥┴┌╧═ ╨╧═┼▌┴┼╘┼ ле, при условии что вы соответствующим образом помещаете
╬┴ ╫╔─╬╧═ ═┼╙╘┼ ╫ ╦┴╓─╧╩ ╦╧╨╔╔ ╙╧╧╘╫┼╘╙╘╫╒└▌┼┼ ╒╫┼─╧═╠┼- на видном месте в каждой копии соответствующее уведомле-
╬╔┼ ╧┬ ┴╫╘╧╥╙╦╔╚ ╨╥┴╫┴╚ ╔ ╧╘╦┴┌ ╧╘ ╟┴╥┴╬╘╔╩; ╧╙╘┴╫╠╤┼╘┼ ние об авторских правах и отказ от гарантий; оставляете
╬┼╘╥╧╬╒╘┘═╔ ╫╙┼ ╒╫┼─╧═╠┼╬╔╤, ╧╘╬╧╙╤▌╔┼╙╤ ╦ ─┴╬╬╧╩ ь╔├┼╬- нетронутыми все уведомления, относящиеся к данной Лицен-
┌╔╔ ╔ ╦ ╧╘╙╒╘╙╘╫╔└ ╦┴╦╔╚-╠╔┬╧ ╟┴╥┴╬╘╔╩; ╔ ╨┼╥┼─┴┼╘┼ ╫╙┼═ зии и к отсутствию каких-либо гарантий; и передаете всем
─╥╒╟╔═ ╨╧╠╒▐┴╘┼╠╤═ Ё╥╧╟╥┴══┘ ╦╧╨╔└ ─┴╬╬╧╩ ь╔├┼╬┌╔╔ ╫═┼╙╘┼ другим получателям Программы копию данной Лицензии вместе
╙ Ё╥╧╟╥┴══╧╩. ў┘ ═╧╓┼╘┼ ╬┴┌╬┴▐╔╘╪ ╨╠┴╘╒ ┌┴ ╞╔┌╔▐┼╙╦╔╩ ┴╦╘ с Программой. Вы можете назначить плату за физический акт
╨┼╥┼─┴▐╔ ╦╧╨╔╔ ╔ ═╧╓┼╘┼ ╨╧ ╙╫╧┼═╒ ╒╙═╧╘╥┼╬╔└ ╨╥┼─╧╙╘┴╫- передачи копии и можете по своему усмотрению предостав-
╠╤╘╪ ╟┴╥┴╬╘╔╔ ┌┴ ╫╧┌╬┴╟╥┴╓─┼╬╔┼. лять гарантии за вознаграждение.
3. ў┘ ═╧╓┼╘┼ ╔┌═┼╬╤╘╪ ╙╫╧└ ╦╧╨╔└ ╔╠╔ ╦╧╨╔╔ Ё╥╧╟╥┴══┘ ╔╠╔ 3. Вы можете изменять свою копию или копии Программы или
╠└┬╧╩ ┼┼ ▐┴╙╘╔, ╙╧┌─┴╫┴╤ ╘┴╦╔═ ╧┬╥┴┌╧═ ╨╥╧╔┌╫┼─┼╬╔┼, ╧╙- любой ее части, создавая таким образом произведение, ос-
╬╧╫┴╬╬╧┼ ╬┴ Ё╥╧╟╥┴══┼, ╔ ╦╧╨╔╥╧╫┴╘╪ ╔ ╥┴╙╨╥╧╙╘╥┴╬╤╘╪ ▄╘╔ нованное на Программе, и копировать и распространять эти
═╧─╔╞╔╦┴├╔╔ ╔╠╔ ╨╥╧╔┌╫┼─┼╬╔┼ ╫ ╙╧╧╘╫┼╘╙╘╫╔╔ ╙ Є┴┌─┼╠╧═ 1, модификации или произведение в соответствии с Разделом 1,
╨╥╔╫┼─┼╬╬┘═ ╫┘█┼, ╨╥╔ ╒╙╠╧╫╔╔, ▐╘╧ ╫┘ ╫┘╨╧╠╬╔╘┼ ╫╙┼ ╬╔╓┼- приведенным выше, при условии, что вы выполните все ниже-
╙╠┼─╒└▌╔┼ ╒╙╠╧╫╔╤: следующие условия:
1. ў┘ ╧┬╤┌┴╬┘ ╙╬┴┬─╔╘╪ ═╧─╔╞╔├╔╥╧╫┴╬╬┘┼ ╞┴╩╠┘ ┌┴═┼╘╬┘═╔ 1. Вы обязаны снабдить модифицированные файлы заметными
╒╫┼─╧═╠┼╬╔╤═╔, ╙╧─┼╥╓┴▌╔═╔ ╒╦┴┌┴╬╔╤ ╬┴ ╘╧, ▐╘╧ ╫┘ уведомлениями, содержащими указания на то, что вы
╔┌═┼╬╔╠╔ ╞┴╩╠┘, ╔ ─┴╘╒ ╦┴╓─╧╟╧ ╔┌═┼╬┼╬╔╤. изменили файлы, и дату каждого изменения.
2. ў┘ ╧┬╤┌┴╬┘ ╨╥┼─╧╙╘┴╫╔╘╪ ╫╙┼═ ╘╥┼╘╪╔═ ╠╔├┴═ ╠╔├┼╬┌╔└ 2. Вы обязаны предоставить всем третьим лицам лицензию
╬┴ ┬┼╙╨╠┴╘╬╧┼ ╔╙╨╧╠╪┌╧╫┴╬╔┼ ╦┴╓─╧╟╧ ╨╥╧╔┌╫┼─┼╬╔╤, на бесплатное использование каждого произведения,
╦╧╘╧╥╧┼ ╫┘ ╥┴╙╨╥╧╙╘╥┴╬╤┼╘┼ ╔╠╔ ╨╒┬╠╔╦╒┼╘┼, ├┼╠╔╦╧═, которое вы распространяете или публикуете, целиком,
╔ ╦╧╘╧╥╧┼ ╨╧╠╬╧╙╘╪└ ╔╠╔ ▐┴╙╘╔▐╬╧ ╙╧─┼╥╓╔╘ Ё╥╧╟╥┴══╒ и которое полностью или частично содержит Программу
╔╠╔ ╦┴╦╒└-╠╔┬╧ ┼┼ ▐┴╙╘╪, ╬┴ ╒╙╠╧╫╔╤╚, ╧╟╧╫╧╥┼╬╬┘╚ ╫ или какую-либо ее часть, на условиях, оговоренных в
─┴╬╬╧╩ ь╔├┼╬┌╔╔. данной Лицензии.
3. х╙╠╔ ═╧─╔╞╔├╔╥╧╫┴╬╬┴╤ ╨╥╧╟╥┴══┴ ╧┬┘▐╬╧ ▐╔╘┴┼╘ ╦╧═┴╬- 3. Если модифицированная программа обычно читает коман-
─┘ ╫ ╔╬╘┼╥┴╦╘╔╫╬╧═ ╥┼╓╔═┼ ╥┴┬╧╘┘, ╫┘ ─╧╠╓╬┘ ╙─┼╠┴╘╪ ды в интерактивном режиме работы, вы должны сделать
╘┴╦, ▐╘╧┬┘ ╨╥╔ ┌┴╨╒╙╦┼ ─╠╤ ╥┴┬╧╘┘ ╫ ╘┴╦╧═ ╔╬╘┼╥- так, чтобы при запуске для работы в таком интер-
┴╦╘╔╫╬╧═ ╥┼╓╔═┼ ╧┬┘▐╬┘═ ─╠╤ ╬┼┼ ╙╨╧╙╧┬╧═ ╧╬┴ ╨┼▐┴- активном режиме обычным для нее способом она печа-
╘┴╠┴ ╔╠╔ ╫┘╫╧─╔╠┴ ╬┴ ▄╦╥┴╬ ╧┬▀╤╫╠┼╬╔┼, ╙╧─┼╥╓┴▌┼┼ тала или выводила на экран объявление, содержащее
╙╧╧╘╫┼╘╙╘╫╒└▌┼┼ ╒╫┼─╧═╠┼╬╔┼ ╧┬ ┴╫╘╧╥╙╦╔╚ ╨╥┴╫┴╚ ╔ соответствующее уведомление об авторских правах и
╒╫┼─╧═╠┼╬╔┼ ╧ ╘╧═, ▐╘╧ ╟┴╥┴╬╘╔╩ ╬┼╘ (╔╠╔, ╬┴╧┬╧╥╧╘, уведомление о том, что гарантий нет (или, наоборот,
╙╧╧┬▌┴└▌┼┼ ╧ ╘╧═, ▐╘╧ ╫┘ ╧┬┼╙╨┼▐╔╫┴┼╘┼ ╟┴╥┴╬╘╔╔), ╔ сообщающее о том, что вы обеспечиваете гарантии), и
▐╘╧ ╨╧╠╪┌╧╫┴╘┼╠╔ ═╧╟╒╘ ╨╧╫╘╧╥╬╧ ╥┴╙╨╥╧╙╘╥┴╬╤╘╪ ╨╥╧- что пользователи могут повторно распространять про-
╟╥┴══╒ ╨╥╔ ▄╘╔╚ ╒╙╠╧╫╔╤╚, ╔ ╒╦┴┌┘╫┴└▌┼┼ ╨╧╠╪┌╧╫┴╘┼- грамму при этих условиях, и указывающее пользовате-
╠└, ╦┴╦ ╨╥╧╙═╧╘╥┼╘╪ ╦╧╨╔└ ─┴╬╬╧╩ ь╔├┼╬┌╔╔. лю, как просмотреть копию данной Лицензии.
(щ╙╦╠└▐┼╬╔┼: ┼╙╠╔ ╙┴═┴ Ё╥╧╟╥┴══┴ ╥┴┬╧╘┴┼╘ ╫ ╔╬╘┼╥- (Исключение: если сама Программа работает в интер-
┴╦╘╔╫╬╧═ ╥┼╓╔═┼, ╬╧ ╧┬┘▐╬╧ ╬┼ ╫┘╫╧─╔╘ ╨╧─╧┬╬╧┼ активном режиме, но обычно не выводит подобное
╧┬▀╤╫╠┼╬╔┼, ╘╧ ╫┴█┼ ╨╥╧╔┌╫┼─┼╬╔┼, ╧╙╬╧╫┴╬╬╧┼ ╬┴ объявление, то ваше произведение, основанное на
Ё╥╧╟╥┴══┼, ╬┼ ╧┬╤┌┴╬╧ ╫┘╫╧─╔╘╪ ╧┬▀╤╫╠┼╬╔┼.) Программе, не обязано выводить объявление.)
№╘╔ ╘╥┼┬╧╫┴╬╔╤ ╨╥╔═┼╬╤└╘╙╤ ╦ ═╧─╔╞╔├╔╥╧╫┴╬╬╧═╒ ╨╥╧╔┌╫┼- Эти требования применяются к модифицированному произве-
─┼╬╔└ ╫ ├┼╠╧═. х╙╠╔ ╔┌╫┼╙╘╬┘┼ ▐┴╙╘╔ ▄╘╧╟╧ ╨╥╧╔┌╫┼─┼╬╔╤ дению в целом. Если известные части этого произведения
╬┼ ┬┘╠╔ ╧╙╬╧╫┴╬┘ ╬┴ Ё╥╧╟╥┴══┼ ╔ ═╧╟╒╘ ╧┬╧╙╬╧╫┴╬╬╧ ╙▐╔- не были основаны на Программе и могут обоснованно счи-
╘┴╘╪╙╤ ╬┼┌┴╫╔╙╔═┘═╔ ╔ ╙┴═╧╙╘╧╤╘┼╠╪╬┘═╔ ╨╥╧╔┌╫┼─┼╬╔╤═╔, таться независимыми и самостоятельными произведениями,
╘╧ ▄╘┴ ь╔├┼╬┌╔╤ ╔ ┼┼ ╒╙╠╧╫╔╤ ╬┼ ╥┴╙╨╥╧╙╘╥┴╬╤└╘╙╤ ╬┴ ▄╘╔ то эта Лицензия и ее условия не распространяются на эти
▐┴╙╘╔, ┼╙╠╔ ╫┘ ╥┴╙╨╥╧╙╘╥┴╬╤┼╘┼ ╔╚ ╦┴╦ ╧╘─┼╠╪╬┘┼ ╨╥╧╔┌╫┼- части, если вы распространяете их как отдельные произве-
─┼╬╔╤. ю╧ ┼╙╠╔ ╫┘ ╥┴╙╨╥╧╙╘╥┴╬╤┼╘┼ ▄╘╔ ▐┴╙╘╔ ╦┴╦ ▐┴╙╘╪ дения. Но если вы распространяете эти части как часть
├┼╠╧╟╧ ╨╥╧╔┌╫┼─┼╬╔╤, ╧╙╬╧╫┴╬╬╧╟╧ ╬┴ Ё╥╧╟╥┴══┼, ╘╧ ╫┘ целого произведения, основанного на Программе, то вы
╧┬╤┌┴╬┘ ─┼╠┴╘╪ ▄╘╧ ╫ ╙╧╧╘╫┼╘╙╘╫╔╔ ╙ ╒╙╠╧╫╔╤═╔ ─┴╬╬╧╩ ь╔- обязаны делать это в соответствии с условиями данной Ли-
├┼╬┌╔╔, ╥┴╙╨╥╧╙╘╥┴╬╤╤ ╨╥┴╫┴ ╨╧╠╒▐┴╘┼╠┼╩ ╠╔├┼╬┌╔╔ ╬┴ ╫╙┼ цензии, распространяя права получателей лицензии на все
╨╥╧╔┌╫┼─┼╬╔┼ ╔, ╘┴╦╔═ ╧┬╥┴┌╧═, ╬┴ ╦┴╓─╒└ ▐┴╙╘╪, ╫╬┼ ┌┴- произведение и, таким образом, на каждую часть, вне за-
╫╔╙╔═╧╙╘╔ ╧╘ ╘╧╟╧, ╦╘╧ ┼┼ ╬┴╨╔╙┴╠. Ї┴╦╔═ ╧┬╥┴┌╧═, ╙╧─┼╥- висимости от того, кто ее написал. Таким образом, содер-
╓┴╬╔┼ ▄╘╧╟╧ ╥┴┌─┼╠┴ ╬┼ ╔═┼┼╘ ├┼╠╔ ╨╥┼╘┼╬─╧╫┴╘╪ ╬┴ ╫┴█╔ жание этого раздела не имеет цели претендовать на ваши
╨╥┴╫┴ ╬┴ ╨╥╧╔┌╫┼─┼╬╔┼, ╬┴╨╔╙┴╬╬╧┼ ╨╧╠╬╧╙╘╪└ ╫┴═╔, ╔╠╔ права на произведение, написанное полностью вами, или
╧╙╨┴╥╔╫┴╘╪ ╔╚; ├┼╠╪ ╙╦╧╥┼┼ ╫ ╘╧═, ▐╘╧┬┘ ╥┴┌╫╔╘╪ ╨╥┴╫╧ оспаривать их; цель скорее в том, чтобы развить право
╒╨╥┴╫╠╤╘╪ ╥┴╙╨╥╧╙╘╥┴╬┼╬╔┼═ ╨╥╧╔┌╫╧─╬┘╚ ╔╠╔ ╦╧╠╠┼╦╘╔╫╬┘╚ управлять распространением производных или коллективных
╨╥╧╔┌╫┼─┼╬╔╩, ╧╙╬╧╫┴╬╬┘╚ ╬┴ Ё╥╧╟╥┴══┼. ы╥╧═┼ ╘╧╟╧, ╨╥╧╙- произведений, основанных на Программе. Кроме того, прос-
╘╧┼ ╬┴╚╧╓─┼╬╔┼ ─╥╒╟╧╟╧ ╨╥╧╔┌╫┼─┼╬╔╤, ╬┼ ╧╙╬╧╫┴╬╬╧╟╧ ╬┴ тое нахождение другого произведения, не основанного на
▄╘╧╩ Ё╥╧╟╥┴══┼, ╙╧╫═┼╙╘╬╧ ╙ Ё╥╧╟╥┴══╧╩ (╔╠╔ ╙ ╨╥╧╔┌╫┼─┼- этой Программе, совместно с Программой (или с произведе-
╬╔┼═, ╧╙╬╧╫┴╬╬┘═ ╬┴ ▄╘╧╩ Ё╥╧╟╥┴══┼) ╬┴ ╘╧═ ╓┼ ╬╧╙╔╘┼╠┼ нием, основанным на этой Программе) на том же носителе
─╠╤ ╨╧╙╘╧╤╬╬╧╟╧ ╚╥┴╬┼╬╔╤ ╔╠╔ ╥┴╙╨╥╧╙╘╥┴╬╤┼═╧═ ╬╧╙╔╘┼╠┼ для постоянного хранения или распространяемом носителе
╬┼ ╥┴╙╨╥╧╙╘╥┴╬╤┼╘ ─┼╩╙╘╫╔┼ ▄╘╧╩ ь╔├┼╬┌╔╔ ╬┴ ─╥╒╟╧┼ ╨╥╧╔┌- не распространяет действие этой Лицензии на другое произ-
╫┼─┼╬╔┼. ведение.
4. ў┘ ═╧╓┼╘┼ ╦╧╨╔╥╧╫┴╘╪ ╔ ╥┴╙╨╥╧╙╘╥┴╬╤╘╪ Ё╥╧╟╥┴══╒ (╔╠╔ 4. Вы можете копировать и распространять Программу (или
╨╥╧╔┌╫┼─┼╬╔┼, ╧╙╬╧╫┴╬╬╧┼ ╬┴ ╬┼╩) ╙╧╟╠┴╙╬╧ Є┴┌─┼╠╒ 2) ╫ произведение, основанное на ней) согласно Разделу 2) в
╧┬▀┼╦╘╬╧═ ╦╧─┼ ╔╠╔ ╫ ╫┘╨╧╠╬╔═╧═ ╫╔─┼ ╫ ╙╧╧╘╫┼╘╙╘╫╔╔ ╙ объектном коде или в выполнимом виде в соответствии с
Є┴┌─┼╠┴═╔ 1 ╔ 2, ╨╥╔╫┼─┼╬╬┘═╔ ╫┘█┼, ╨╥╔ ╒╙╠╧╫╔╔, ▐╘╧ ╫┘ Разделами 1 и 2, приведенными выше, при условии, что вы
╘┴╦╓┼ ╫┘╨╧╠╬╔╘┼ ╧─╬╧ ╔┌ ╙╠┼─╒└▌╔╚ ╘╥┼┬╧╫┴╬╔╩: также выполните одно из следующих требований:
1. є╧╨╥╧╫╧─╔╘┼ ┼┼ ╨╧╠╬┘═ ╙╧╧╘╫┼╘╙╘╫╒└▌╔═ ═┴█╔╬╧▐╔╘┴┼═┘═ 1. Сопроводите ее полным соответствующим машиночитаемым
╔╙╚╧─╬┘═ ╦╧─╧═, ╦╧╘╧╥┘╩ ─╧╠╓┼╬ ╥┴╙╨╥╧╙╘╥┴╬╤╘╪╙╤ ╫ исходным кодом, который должен распространяться в
╙╧╧╘╫┼╘╙╘╫╔╔ ╙ Є┴┌─┼╠┴═╔ 1 ╔ 2, ╨╥╔╫┼─┼╬╬┘═╔ ╫┘█┼, соответствии с Разделами 1 и 2, приведенными выше,
╬┴ ╬╧╙╔╘┼╠┼, ╧┬┘▐╬╧ ╔╙╨╧╠╪┌╒┼═╧═ ─╠╤ ╧┬═┼╬┴ Ёя; ╔╠╔, на носителе, обычно используемом для обмена ПО; или,
2. є╧╨╥╧╫╧─╔╘┼ ┼┼ ╨╔╙╪═┼╬╬┘═ ╨╥┼─╠╧╓┼╬╔┼═, ─┼╩╙╘╫╔╘┼╠╪- 2. Сопроводите ее письменным предложением, действитель-
╬┘═ ╨╧ ╦╥┴╩╬┼╩ ═┼╥┼ ╫ ╘┼▐┼╬╔┼ ╘╥┼╚ ╠┼╘, ╨╥┼─╧╙╘┴╫╔╘╪ ным по крайней мере в течение трех лет, предоставить
╠└┬╧═╒ ╘╥┼╘╪┼═╒ ╠╔├╒ ┌┴ ╫╧┌╬┴╟╥┴╓─┼╬╔┼ ╬┼ ┬╧╠╪█┼┼ любому третьему лицу за вознаграждение не большее
╙╘╧╔═╧╙╘╔ ╞╔┌╔▐┼╙╦╧╟╧ ┴╦╘┴ ╔┌╟╧╘╧╫╠┼╬╔╤ ╦╧╨╔╔ ╨╧╠╬╒└ стоимости физического акта изготовления копии полную
═┴█╔╬╧▐╔╘┴┼═╒└ ╦╧╨╔└ ╙╧╧╘╫┼╘╙╘╫╒└▌┼╟╧ ╔╙╚╧─╬╧╟╧ машиночитаемую копию соответствующего исходного
╦╧─┴, ╨╧─╠┼╓┴▌╒└ ╥┴╙╨╥╧╙╘╥┴╬┼╬╔└ ╫ ╙╧╧╘╫┼╘╙╘╫╔╔ ╙ кода, подлежащую распространению в соответствии с
Є┴┌─┼╠┴═╔ 1 ╔ 2, ╨╥╔╫┼─┼╬╬┘═╔ ╫┘█┼; ╔╠╔ Разделами 1 и 2, приведенными выше; или
3. є╧╨╥╧╫╧─╔╘┼ ┼┼ ╔╬╞╧╥═┴├╔┼╩, ╨╧╠╒▐┼╬╬╧╩ ╫┴═╔ ╫ ╦┴- 3. Сопроводите ее информацией, полученной вами в ка-
▐┼╙╘╫┼ ╨╥┼─╠╧╓┼╬╔╤ ╥┴╙╨╥╧╙╘╥┴╬╔╘╪ ╙╧╧╘╫┼╘╙╘╫╒└▌╔╩ честве предложения распространить соответствующий
╔╙╚╧─╬┘╩ ╦╧─. (№╘┴ ╫╧┌═╧╓╬╧╙╘╪ ─╧╨╒╙╘╔═┴ ╘╧╠╪╦╧ ─╠╤ исходный код. (Эта возможность допустима только для
╬┼╦╧══┼╥▐┼╙╦╧╟╧ ╥┴╙╨╥╧╙╘╥┴╬┼╬╔╤, ╔ ╘╧╠╪╦╧ ┼╙╠╔ ╫┘ некоммерческого распространения, и только если вы
╨╧╠╒▐╔╠╔ ╨╥╧╟╥┴══╒ ╫ ╧┬▀┼╦╘╬╧═ ╦╧─┼ ╔╠╔ ╫ ╫┘╨╧╠╬╔═╧═ получили программу в объектном коде или в выполнимом
╫╔─┼ ╙ ╨╥┼─╠╧╓┼╬╔┼═ ╫ ╙╧╧╘╫┼╘╙╘╫╔╔ ╙ Ё╒╬╦╘╧═ b) виде с предложением в соответствии с Пунктом b)
╫┘█┼.) выше.)
щ╙╚╧─╬┘╩ ╦╧─ ─╠╤ ╨╥╧╔┌╫┼─┼╬╔╤ ╧┌╬┴▐┴┼╘ ┼╟╧ ╫╔─, ╨╥┼─- Исходный код для произведения означает его вид, пред-
╨╧▐╘╔╘┼╠╪╬┘╩ ─╠╤ ╫┘╨╧╠╬┼╬╔╤ ╫ ╬┼═ ═╧─╔╞╔╦┴├╔╩. ф╠╤ ╔╙- почтительный для выполнения в нем модификаций. Для ис-
╨╧╠╬╤┼═╧╟╧ ╨╥╧╔┌╫┼─┼╬╔╤ ╨╧╠╬┘╩ ╔╙╚╧─╬┘╩ ╦╧─ ╧┌╬┴▐┴┼╘ ╫╙┼ полняемого произведения полный исходный код означает все
╔╙╚╧─╬┘┼ ╦╧─┘ ─╠╤ ╫╙┼╚ ═╧─╒╠┼╩, ╦╧╘╧╥┘┼ ╧╬ ╙╧─┼╥╓╔╘, ╨╠└╙ исходные коды для всех модулей, которые он содержит, плюс
╠└┬┘┼ ╙╫╤┌┴╬╬┘┼ ╙ ╨╥╧╔┌╫┼─┼╬╔┼═ ╞┴╩╠┘ ╧╨╥┼─┼╠┼╬╔╤ любые связанные с произведением файлы определения
╔╬╘┼╥╞┼╩╙┴, ╨╠└╙ ╙├┼╬┴╥╔╔, ╔╙╨╧╠╪┌╒┼═┘┼ ─╠╤ ╒╨╥┴╫╠┼╬╔╤ интерфейса, плюс сценарии, используемые для управления
╦╧═╨╔╠╤├╔┼╩ ╔ ╒╙╘┴╬╧╫╦╧╩ ╔╙╨╧╠╬╤┼═╧╟╧ ╨╥╧╔┌╫┼─┼╬╔╤. компиляцией и установкой исполняемого произведения.
я─╬┴╦╧, ╫ ╫╔─┼ ╧╙╧┬╧╟╧ ╔╙╦╠└▐┼╬╔╤ ╥┴╙╨╥╧╙╘╥┴╬╤┼═┘╩ ╔╙╚╧─- Однако, в виде особого исключения распространяемый исход-
╬┘╩ ╦╧─ ╬┼ ╧┬╤┌┴╬ ╫╦╠└▐┴╘╪ ╘╧, ▐╘╧ ╧┬┘▐╬╧ ╨╥┼─╧╙╘┴╫╠╤┼╘╙╤ ный код не обязан включать то, что обычно предоставляется
╙ ╧╙╬╧╫╬┘═╔ ╦╧═╨╧╬┼╬╘┴═╔ ╧╨┼╥┴├╔╧╬╬╧╩ ╙╔╙╘┼═┘, ╨╧─ с основными компонентами операционной системы, под
╒╨╥┴╫╠┼╬╔┼═ ╦╧╘╧╥╧╩ ╥┴┬╧╘┴┼╘ ╔╙╨╧╠╬╤┼═╧┼ ╨╥╧╔┌╫┼─┼╬╔┼, ┌┴ управлением которой работает исполняемое произведение, за
╔╙╦╠└▐┼╬╔┼═ ╙╠╒▐┴╤, ╦╧╟─┴ ╙┴═ ╦╧═╨╧╬┼╬╘ ╙╧╨╥╧╫╧╓─┴┼╘ исключением случая, когда сам компонент сопровождает
╔╙╨╧╠╬╤┼═╧┼ ╨╥╧╔┌╫┼─┼╬╔┼. х╙╠╔ ╥┴╙╨╥╧╙╘╥┴╬┼╬╔┼ ╔╙╨╧╠╬╤- исполняемое произведение. Если распространение исполня-
┼═╧╟╧ ╨╥╧╔┌╫┼─┼╬╔╤ ╔╠╔ ╧┬▀┼╦╘╬╧╟╧ ╦╧─┴ ╨╥╧╔╙╚╧─╔╘ ╨╒╘┼═ емого произведения или объектного кода происходит путем
╨╥┼─╧╙╘┴╫╠┼╬╔╤ ─╧╙╘╒╨┴ ─╠╤ ╦╧╨╔╥╧╫┴╬╔╤ ╙ ╧┬╧┌╬┴▐┼╬╬╧╟╧ предоставления доступа для копирования с обозначенного
═┼╙╘┴, ╘╧ ╨╥┼─╧╙╘┴╫╠┼╬╔┼ ─╧╙╘╒╨┴ ─╠╤ ╦╧╨╔╥╧╫┴╬╔╤ ╔╙╚╧─╬╧- места, то предоставление доступа для копирования исходно-
╟╧ ╦╧─┴ ╙ ╘╧╟╧ ╓┼ ═┼╙╘┴ ╙▐╔╘┴┼╘╙╤ ╥┴╙╨╥╧╙╘╥┴╬┼╬╔┼═ ╔╙╚╧─- го кода с того же места считается распространением исход-
╬╧╟╧ ╦╧─┴, ─┴╓┼ ┼╙╠╔ ╘╥┼╘╪╔ ╠╔├┴ ╬┼ ╨╥╔╬╒╓─┴└╘╙╤ ╦ ╦╧╨╔- ного кода, даже если третьи лица не принуждаются к копи-
╥╧╫┴╬╔└ ╔╙╚╧─╬╧╟╧ ╦╧─┴ ╫═┼╙╘┼ ╙ ╧┬▀┼╦╘╬┘═ ╦╧─╧═. рованию исходного кода вместе с объектным кодом.
5. ў┘ ╬┼ ═╧╓┼╘┼ ╦╧╨╔╥╧╫┴╘╪, ╔┌═┼╬╤╘╪, ╨╧╫╘╧╥╬╧ ╠╔├┼╬┌╔╥╧- 5. Вы не можете копировать, изменять, повторно лицензиро-
╫┴╘╪, ╔╠╔ ╥┴╙╨╥╧╙╘╥┴╬╤╘╪ Ё╥╧╟╥┴══╒ ╔╬┴▐┼, ▐┼═ ▄╘╧ ╤╫╬╧ вать, или распространять Программу иначе, чем это явно
╨╥┼─╒╙═╧╘╥┼╬╧ ─┴╬╬╧╩ ь╔├┼╬┌╔┼╩. ь└┬┴╤ ╨╧╨┘╘╦┴ ╦╧╨╔╥╧╫┴╘╪, предусмотрено данной Лицензией. Любая попытка копировать,
╔┌═┼╬╤╘╪, ╨╧╫╘╧╥╬╧ ╠╔├┼╬┌╔╥╧╫┴╘╪, ╔╠╔ ╥┴╙╨╥╧╙╘╥┴╬╤╘╪ Ё╥╧- изменять, повторно лицензировать, или распространять Про-
╟╥┴══╒ ╦┴╦╔═-╠╔┬╧ ─╥╒╟╔═ ╙╨╧╙╧┬╧═ ╬┼╨╥┴╫╧═┼╥╬┴ ╔ ┴╫╘╧═┴- грамму каким-либо другим способом неправомерна и автома-
╘╔▐┼╙╦╔ ╨╥┼╦╥┴▌┴┼╘ ╫┴█╔ ╨╥┴╫┴ ─┴╬╬┘┼ ╫┴═ ▄╘╧╩ ь╔├┼╬┌╔┼╩. тически прекращает ваши права данные вам этой Лицензией.
я─╬┴╦╧ ╠╔├┼╬┌╔╔ ╠╔├, ╨╧╠╒▐╔╫█╔╚ ╧╘ ╫┴╙ ╦╧╨╔╔ ╔╠╔ ╨╥┴╫┴ Однако лицензии лиц, получивших от вас копии или права
╙╧╟╠┴╙╬╧ ─┴╬╬╧╩ ї╬╔╫┼╥╙┴╠╪╬╧╩ я┬▌┼╙╘╫┼╬╬╧╩ ь╔├┼╬┌╔╔, ╬┼ согласно данной Универсальной Общественной Лицензии, не
╨╥┼╦╥┴╘╤╘ ╙╫╧┼╟╧ ─┼╩╙╘╫╔╤ ─╧ ╘┼╚ ╨╧╥, ╨╧╦┴ ▄╘╔ ╠╔├┴ ╨╧╠- прекратят своего действия до тех пор, пока эти лица пол-
╬╧╙╘╪└ ╙╧┬╠└─┴└╘ ╒╙╠╧╫╔╤. ностью соблюдают условия.
6. ў┘ ╬┼ ╧┬╤┌┴╬┘ ╙╧╟╠┴█┴╘╪╙╤ ╙ ▄╘╧╩ ь╔├┼╬┌╔┼╩, ╘┴╦ ╦┴╦ ╫┘ 6. Вы не обязаны соглашаться с этой Лицензией, так как вы
╬┼ ╨╧─╨╔╙┘╫┴╠╔ ┼┼. я─╬┴╦╧ ╘╧╟─┴ ╫┘ ╬┼ ╨╧╠╒▐┴┼╘┼ ╨╥┴╫┴ не подписывали ее. Однако тогда вы не получаете права
═╧─╔╞╔├╔╥╧╫┴╘╪ ╔╠╔ ╥┴╙╨╥╧╙╘╥┴╬╤╘╪ Ё╥╧╟╥┴══╒ ╔╠╔ ╧╙╬╧╫┴╬- модифицировать или распространять Программу или основан-
╬┘┼ ╬┴ Ё╥╧╟╥┴══┼ ╨╥╧╔┌╫┼─┼╬╔╤. №╘╔ ─┼╩╙╘╫╔╤ ┌┴╨╥┼▌┼╬┘ ные на Программе произведения. Эти действия запрещены
┌┴╦╧╬╧═, ┼╙╠╔ ╫┘ ╬┼ ╨╥╔╬╔═┴┼╘┼ ╦ ╙╧┬╠└─┼╬╔└ ▄╘╒ ь╔├┼╬┌╔└. законом, если вы не принимаете к соблюдению эту Лицензию.
с ┌╬┴▐╔╘, ╔┌═┼╬╤╤ ╔╠╔ ╥┴╙╨╥╧╙╘╥┴╬╤╤ Ё╥╧╟╥┴══╒ (╔╠╔ А значит, изменяя или распространяя Программу (или
╨╥╧╔┌╫┼─┼╬╔┼, ╧╙╬╧╫┴╬╬╧┼ ╬┴ Ё╥╧╟╥┴══┼), ╫┘ ╔┌▀╤╫╠╤┼╘┼ произведение, основанное на Программе), вы изъявляете
╙╫╧┼ ╙╧╟╠┴╙╔┼ ╙ ▄╘╧╩ ь╔├┼╬┌╔┼╩ ╔ ╫╙┼═╔ ┼┼ ╒╙╠╧╫╔╤═╔ ╧ свое согласие с этой Лицензией и всеми ее условиями о
╦╧╨╔╥╧╫┴╬╔╔, ╥┴╙╨╥╧╙╘╥┴╬┼╬╔╔ ╔╠╔ ═╧─╔╞╔╦┴├╔╔ Ё╥╧╟╥┴══┘ копировании, распространении или модификации Программы
╔╠╔ ╨╥╧╔┌╫┼─┼╬╔╩, ╧╙╬╧╫┴╬╬┘╚ ╬┴ ╬┼╩. или произведений, основанных на ней.
7. ы┴╓─┘╩ ╥┴┌, ╦╧╟─┴ ╫┘ ╨╧╫╘╧╥╬╧ ╥┴╙╨╥╧╙╘╥┴╬╤┼╘┼ Ё╥╧╟╥┴══╒ 7. Каждый раз, когда вы повторно распространяете Программу
(╔╠╔ ╠└┬╧┼ ╨╥╧╔┌╫┼─┼╬╔┼, ╧╙╬╧╫┴╬╬╧┼ ╬┴ Ё╥╧╟╥┴══┼), ╨╧╠╒- (или любое произведение, основанное на Программе), полу-
▐┴╘┼╠╪ ▄╘╧╟╧ ╨╥╧╔┌╫┼─┼╬╔╤ ┴╫╘╧═┴╘╔▐┼╙╦╔ ╨╧╠╒▐┴┼╘ ╠╔├┼╬┌╔└ чатель этого произведения автоматически получает лицензию
╧╘ ╨┼╥╫╧╬┴▐┴╠╪╬╧╟╧ ─┼╥╓┴╘┼╠╤ ╠╔├┼╬┌╔╔ ╬┴ ╦╧╨╔╥╧╫┴╬╔┼, от первоначального держателя лицензии на копирование,
╥┴╙╨╥╧╙╘╥┴╬┼╬╔┼ ╔╠╔ ═╧─╔╞╔╦┴├╔└ Ё╥╧╟╥┴══┘, ╧┬╙╒╓─┴┼═╒└ распространение или модификацию Программы, обсуждаемую
╫ ▄╘╔╚ ╧╨╥┼─┼╠┼╬╔╤╚ ╔ ╒╙╠╧╫╔╤╚. ў┘ ╬┼ ═╧╓┼╘┼ ╬┴╠┴╟┴╘╪ в этих определениях и условиях. Вы не можете налагать
╦┴╦╔╚-╠╔┬╧ ─╧╨╧╠╬╔╘┼╠╪╬┘╚ ╧╟╥┴╬╔▐┼╬╔╩ ╬┴ ╧╙╒▌┼╙╘╫╠┼╬╔┼ каких-либо дополнительных ограничений на осуществление
╨╧╠╒▐┴╘┼╠┼═ ╨╥┴╫, ╨╥┼─╧╙╘┴╫╠┼╬╬┘╚ ─┴╬╬┘═ ─╧╦╒═┼╬╘╧═. ў┘ получателем прав, предоставленных данным документом. Вы
╬┼ ╬┼╙┼╘┼ ╧╘╫┼╘╙╘╫┼╬╬╧╙╘╔ ┌┴ ╙╧┬╠└─┼╬╔┼ ╘╥┼╘╪╔═╔ ╠╔├┴═╔ не несете ответственности за соблюдение третьими лицами
╒╙╠╧╫╔╩ ▄╘╧╩ ь╔├┼╬┌╔╔. условий этой Лицензии.
8. х╙╠╔ ╫ ╥┼┌╒╠╪╘┴╘┼ ╙╒─┼┬╬╧╟╧ ╥┴┌┬╔╥┴╘┼╠╪╙╘╫┴, ╔╠╔ ╧┬╫╔╬┼- 8. Если в результате судебного разбирательства, или обвине-
╬╔╤ ╫ ╬┴╥╒█┼╬╔╔ ╨┴╘┼╬╘┴ ╔╠╔ ╨╧ ╠└┬╧╩ ─╥╒╟╧╩ ╨╥╔▐╔╬┼ (╬┼ ния в нарушении патента или по любой другой причине (не
╧┬╤┌┴╘┼╠╪╬╧ ╙╫╤┌┴╬╬╧╩ ╙ ╨┴╘┼╬╘┴═╔), ╫┴═ ╬┴╫╤┌┴╬┘ ╒╙╠╧╫╔╤, обязательно связанной с патентами), вам навязаны условия,
╨╥╧╘╔╫╧╥┼▐┴▌╔┼ ─┴╬╬╧╩ ь╔├┼╬┌╔╔ (╦┴╦ ╨╧ ╥┼█┼╬╔└ ╙╒─┴, ╘┴╦ противоречащие данной Лицензии (как по решению суда, так
╔ ╬┼╘), ╘╧ ▄╘╧ ╬┼ ╧╙╫╧┬╧╓─┴┼╘ ╫┴╙ ╧╘ ╙╧┬╠└─┼╬╔╤ ь╔├┼╬┌╔╔. и нет), то это не освобождает вас от соблюдения Лицензии.
х╙╠╔ ╫┘ ╬┼ ═╧╓┼╘┼ ┌┴╬╔═┴╘╪╙╤ ╥┴╙╨╥╧╙╘╥┴╬┼╬╔┼═ ╘┴╦, ▐╘╧┬┘ Если вы не можете заниматься распространением так, чтобы
╧─╬╧╫╥┼═┼╬╬╧ ╒─╧╫╠┼╘╫╧╥╔╘╪ ╘╥┼┬╧╫┴╬╔╤═ ╔ ▄╘╧╩ ь╔├┼╬┌╔╔, одновременно удовлетворить требованиям и этой Лицензии,
╔ ╫╙┼═ ─╥╒╟╔═ ╘╥┼┬╧╫┴╬╔╤═, ╘╧ ╫┘ ╬┼ ─╧╠╓╬┘ ┌┴╬╔═┴╘╪╙╤ и всем другим требованиям, то вы не должны заниматься
╥┴╙╨╥╧╙╘╥┴╬┼╬╔┼═ Ё╥╧╟╥┴══┘. распространением Программы.
ю┴╨╥╔═┼╥, ┼╙╠╔ ╨┴╘┼╬╘ ╬┼ ╨╧┌╫╧╠╤┼╘ ┬┼┌╫╧┌═┼┌─╬╧┼ ╨╧╫╘╧╥- Например, если патент не позволяет безвозмездное повтор-
╬╧┼ ╥┴╙╨╥╧╙╘╥┴╬┼╬╔┼ Ё╥╧╟╥┴══┘ ╫╙┼═, ╦╘╧ ╨╧╠╒▐╔╠ ╦╧╨╔╔ ╧╘ ное распространение Программы всем, кто получил копии от
╫┴╙ ╬┼╨╧╙╥┼─╙╘╫┼╬╬╧ ╔╠╔ ▐┼╥┼┌ ╨╧╙╥┼─╬╔╦╧╫, ╘╧ ┼─╔╬╙╘╫┼╬- вас непосредственно или через посредников, то единствен-
╬┘═ ╙╨╧╙╧┬╧═ ╒─╧╫╠┼╘╫╧╥╔╘╪ ╔ ╨┴╘┼╬╘╒, ╔ ▄╘╧╩ ь╔├┼╬┌╔╔ ным способом удовлетворить и патенту, и этой Лицензии
┬╒─┼╘ ╫┴█ ╨╧╠╬┘╩ ╧╘╦┴┌ ╧╘ ╥┴╙╨╥╧╙╘╥┴╬┼╬╔╤ Ё╥╧╟╥┴══┘. х╙╠╔ будет ваш полный отказ от распространения Программы. Если
╦┴╦┴╤-╠╔┬╧ ▐┴╙╘╪ ▄╘╧╟╧ ╥┴┌─┼╠┴ ╬┼ ╔═┼┼╘ ╙╔╠┘ ╔╠╔ ╬┼ ═╧╓┼╘ какая-либо часть этого раздела не имеет силы или не может
┬┘╘╪ ╨╥╔═┼╬┼╬┴ ╨╥╔ ╠└┬┘╚ ╦╧╬╦╥┼╘╬┘╚ ╧┬╙╘╧╤╘┼╠╪╙╘╫┴╚, ╘╧ быть применена при любых конкретных обстоятельствах, то
╨╧─╥┴┌╒═┼╫┴┼╘╙╤, ▐╘╧ ╔═┼┼╘ ╙╔╠╒ ╧╙╘┴╠╪╬┴╤ ▐┴╙╘╪ ╥┴┌─┼╠┴, подразумевается, что имеет силу остальная часть раздела,
╔ ╫┼╙╪ Є┴┌─┼╠ ╔═┼┼╘ ╙╔╠╒ ╨╥╔ ─╥╒╟╔╚ ╧┬╙╘╧╤╘┼╠╪╙╘╫┴╚. у┼╠╪ и весь Раздел имеет силу при других обстоятельствах. Цель
▄╘╧╟╧ ╥┴┌─┼╠┴ -- ╬┼ ╨╧┬╒─╔╘╪ ╫┴╙ ─┼╠┴╘╪ ┌┴╤╫╠┼╬╔╤ ╧ ╬┴╥╒- этого раздела -- не побудить вас делать заявления о нару-
█┼╬╔╤╚ ╨╥┴╫ ╬┴ ╨┴╘┼╬╘, ╔╠╔ ┌┴╤╫╠╤╘╪ ╧ ─╥╒╟╔╚ ╨╥┼╘┼╬┌╔╤╚ шениях прав на патент, или заявлять о других претензиях
╬┴ ╨╥┴╫╧ ╙╧┬╙╘╫┼╬╬╧╙╘╔, ╔╠╔ ╧╙╨┴╥╔╫┴╘╪ ╨╥┴╫╔╠╪╬╧╙╘╪ ╨╧- на право собственности, или оспаривать правильность по-
─╧┬╬┘╚ ╨╥┼╘┼╬┌╔╩; ┼─╔╬╙╘╫┼╬╬┴╤ ├┼╠╪ ▄╘╧╟╧ ╥┴┌─┼╠┴ -- ┌┴- добных претензий; единственная цель этого раздела -- за-
▌╔╘┴ ├┼╠╧╙╘╬╧╙╘╔ ╙╔╙╘┼═┘ ╥┴╙╨╥╧╙╘╥┴╬┼╬╔╤ ╙╫╧┬╧─╬╧╟╧ Ёя, щита целостности системы распространения свободного ПО,
╦╧╘╧╥┴╤ ╥┼┴╠╔┌╒┼╘╙╤ ╔╙╨╧╠╪┌╧╫┴╬╔┼═ ╧┬▌╔╚ ╠╔├┼╬┌╔╩. э╬╧╟╔┼ которая реализуется использованием общих лицензий. Многие
╠└─╔ ┬╠┴╟╧─┴╥╤ ▄╘╧╩ ╙╔╙╘┼═┼ ╫╬┼╙╠╔ ▌┼─╥┘╩ ╫╦╠┴─ ╫ █╔╥╧╦╔╩ люди благодаря этой системе внесли щедрый вклад в широкий
╙╨┼╦╘╥ ╥┴╙╨╥╧╙╘╥┴╬╤┼═╧╟╧ Ёя ╨╧╠┴╟┴╤╙╪ ╬┴ ╙╧╟╠┴╙╧╫┴╬╬╧┼ спектр распространяемого ПО полагаясь на согласованное
╨╥╔═┼╬┼╬╔┼ ▄╘╧╩ ╙╔╙╘┼═┘; ┴╫╘╧╥╒ ╨╥╔╬┴─╠┼╓╔╘ ╨╥┴╫╧ ╥┼█┴╘╪ применение этой системы; автору принадлежит право решать
╚╧▐┼╘ ╠╔ ╧╬ ╔╠╔ ╧╬┴ ╥┴╙╨╥╧╙╘╥┴╬╤╘╪ Ёя ╫ ▄╘╧╩ ╙╔╙╘┼═┼ ╔╠╔ хочет ли он или она распространять ПО в этой системе или
╫ ╦┴╦╧╩-╘╧ ─╥╒╟╧╩, ╔ ╨╧╠╒▐┴╘┼╠╪ ╠╔├┼╬┌╔╔ ╬┼ ═╧╓┼╘ ╫╠╔╤╘╪ в какой-то другой, и получатель лицензии не может влиять
╬┴ ╨╥╔╬╤╘╔┼ ▄╘╧╟╧ ╥┼█┼╬╔╤. №╘╧╘ ╥┴┌─┼╠ ╨╥┼─╬┴┌╬┴▐┼╬ ─╠╤ на принятие этого решения. Этот раздел предназначен для
╘╧╟╧, ▐╘╧┬┘ ╘▌┴╘┼╠╪╬╧ ╨╥╧╤╙╬╔╘╪, ▐╘╧ ╨╧╠┴╟┴┼╘╙╤ ╙╠┼─╙╘╫╔- того, чтобы тщательно прояснить, что полагается следстви-
┼═ ╔┌ ╧╙╘┴╠╪╬╧╩ ▐┴╙╘╔ ─┴╬╬╧╩ ь╔├┼╬┌╔╔. ем из остальной части данной Лицензии.
9. х╙╠╔ ╥┴╙╨╥╧╙╘╥┴╬┼╬╔┼ ╔/╔╠╔ ╨╥╔═┼╬┼╬╔┼ Ё╥╧╟╥┴══┘ ╧╟╥┴╬╔▐┼- 9. Если распространение и/или применение Программы ограниче-
╬╧ ╫ ╥╤─┼ ╙╘╥┴╬ ╠╔┬╧ ╨┴╘┼╬╘┴═╔, ╠╔┬╧ ┴╫╘╧╥╙╦╔═╔ ╨╥┴╫┴═╔ но в ряде стран либо патентами, либо авторскими правами
╬┴ ╔╬╘┼╥╞┼╩╙┘, ╨┼╥╫╧╬┴▐┴╠╪╬┘╩ ╧┬╠┴─┴╘┼╠╪ ┴╫╘╧╥╙╦╔╚ ╨╥┴╫, на интерфейсы, первоначальный обладатель авторских прав,
╫┘╨╒╙╦┴└▌╔╩ Ё╥╧╟╥┴══╒ ╙ ▄╘╧╩ ь╔├┼╬┌╔┼╩, ═╧╓┼╘ ─╧┬┴╫╔╘╪ выпускающий Программу с этой Лицензией, может добавить
╤╫╬╧┼ ╧╟╥┴╬╔▐┼╬╔┼ ╬┴ ╟┼╧╟╥┴╞╔▐┼╙╦╧┼ ╥┴╙╨╥╧╙╘╥┴╬┼╬╔┼, явное ограничение на географическое распространение,
╔╙╦╠└▐╔╫ ╘┴╦╔┼ ╙╘╥┴╬┘, ╘┴╦ ▐╘╧ ╥┴╙╨╥╧╙╘╥┴╬┼╬╔┼ ╥┴┌╥┼█┴- исключив такие страны, так что распространение разреша-
┼╘╙╤ ╘╧╠╪╦╧ ╫ ╘┼╚ ╙╘╥┴╬┴╚, ╦╧╘╧╥┘┼ ╬┼ ┬┘╠╔ ╔╙╦╠└▐┼╬┘. ў ется только в тех странах, которые не были исключены. В
▄╘╧═ ╙╠╒▐┴┼ ─┴╬╬┴╤ ь╔├┼╬┌╔╤ ╫╦╠└▐┴┼╘ ╫ ╙┼┬╤ ▄╘╧ ╧╟╥┴╬╔▐┼- этом случае данная Лицензия включает в себя это ограниче-
╬╔┼, ╦┴╦ ┼╙╠╔ ┬┘ ╧╬╧ ┬┘╠╧ ╬┴╨╔╙┴╬╧ ╫ ╘┼╦╙╘┼ ─┴╬╬╧╩ ь╔├┼╬- ние, как если бы оно было написано в тексте данной Лицен-
┌╔╔. зии.
10. ц╧╬─ є╫╧┬╧─╬╧╟╧ Ёя ═╧╓┼╘ ╫╥┼═╤ ╧╘ ╫╥┼═┼╬╔ ╨╒┬╠╔╦╧╫┴╘╪ 10. Фонд Свободного ПО может время от времени публиковать
╨┼╥┼╙═╧╘╥┼╬╬┘┼ ╔/╔╠╔ ╬╧╫┘┼ ╫┼╥╙╔╔ ї╬╔╫┼╥╙┴╠╪╬╧╩ я┬▌┼╙╘- пересмотренные и/или новые версии Универсальной Общест-
╫┼╬╬╧╩ ь╔├┼╬┌╔╔. Ї┴╦╔┼ ╬╧╫┘┼ ╫┼╥╙╔╔ ┬╒─╒╘ ╙╚╧─╬┘ ╨╧ ─╒╚╒ венной Лицензии. Такие новые версии будут сходны по духу
╙ ╬┴╙╘╧╤▌┼╩ ╫┼╥╙╔┼╩, ╬╧ ═╧╟╒╘ ╧╘╠╔▐┴╘╪╙╤ ╫ ─┼╘┴╠╤╚, с настоящей версией, но могут отличаться в деталях,
╬┴╨╥┴╫╠┼╬╬┘╚ ╬┴ ╬╧╫┘┼ ╨╥╧┬╠┼═┘ ╔╠╔ ╧┬╙╘╧╤╘┼╠╪╙╘╫┴. ы┴╓─╧╩ направленных на новые проблемы или обстоятельства. Каждой
╫┼╥╙╔╔ ╨╥╔─┴┼╘╙╤ ╧╘╠╔▐╔╘┼╠╪╬┘╩ ╬╧═┼╥ ╫┼╥╙╔╔. х╙╠╔ ╫ Ё╥╧- версии придается отличительный номер версии. Если в Про-
╟╥┴══┼ ╒╦┴┌┴╬ ╬╧═┼╥ ╫┼╥╙╔╔ ─┴╬╬╧╩ ь╔├┼╬┌╔╔, ╦╧╘╧╥┴╤ ╦ ╬┼╩ грамме указан номер версии данной Лицензии, которая к ней
╨╥╔═┼╬╔═┴, ╔ ╙╠╧╫┴ "╠└┬┴╤ ╨╧╙╠┼─╒└▌┴╤ ╫┼╥╙╔╤", ╫┘ ═╧╓┼╘┼ применима, и слова "любая последующая версия", вы можете
╨╧ ╫┘┬╧╥╒ ╙╠┼─╧╫┴╘╪ ╧╨╥┼─┼╠┼╬╔╤═ ╔ ╒╙╠╧╫╔╤═ ╠╔┬╧ ─┴╬╬╧╩ по выбору следовать определениям и условиям либо данной
╫┼╥╙╔╔, ╠╔┬╧ ╠└┬╧╩ ╨╧╙╠┼─╒└▌┼╩ ╫┼╥╙╔╔, ╧╨╒┬╠╔╦╧╫┴╬╬╧╩ версии, либо любой последующей версии, опубликованной
ц╧╬─╧═ є╫╧┬╧─╬╧╟╧ Ёя. х╙╠╔ ╫ Ё╥╧╟╥┴══┼ ╬┼ ╒╦┴┌┴╬ ╬╧═┼╥ Фондом Свободного ПО. Если в Программе не указан номер
╫┼╥╙╔╔ ─┴╬╬╧╩ ь╔├┼╬┌╔╔, ╫┘ ═╧╓┼╘┼ ╫┘┬╥┴╘╪ ╠└┬╒└ ╫┼╥╙╔└, версии данной Лицензии, вы можете выбрать любую версию,
╦╧╟─┴-╠╔┬╧ ╧╨╒┬╠╔╦╧╫┴╬╬╒└ ц╧╬─╧═ є╫╧┬╧─╬╧╟╧ Ёя. когда-либо опубликованную Фондом Свободного ПО.
11. х╙╠╔ ╫┘ ╚╧╘╔╘┼ ╫╙╘╥╧╔╘╪ ▐┴╙╘╔ Ё╥╧╟╥┴══┘ ╫ ─╥╒╟╔┼ ╙╫╧┬╧─- 11. Если вы хотите встроить части Программы в другие свобод-
╬┘┼ ╨╥╧╟╥┴══┘ ╙ ╔╬┘═╔ ╒╙╠╧╫╔╤═╔ ╥┴╙╨╥╧╙╘╥┴╬┼╬╔╤, ╬┴╨╔█╔╘┼ ные программы с иными условиями распространения, напишите
┴╫╘╧╥╒ ╙ ╨╥╧╙╪┬╧╩ ╧ ╥┴┌╥┼█┼╬╔╔. ф╠╤ Ёя, ╦╧╘╧╥╧┼ ╧╚╥┴╬╤┼╘- автору с просьбой о разрешении. Для ПО, которое охраняет-
╙╤ ┴╫╘╧╥╙╦╔═╔ ╨╥┴╫┴═╔ ц╧╬─┴ є╫╧┬╧─╬╧╟╧ Ёя, ╬┴╨╔█╔╘┼ ╫ ся авторскими правами Фонда Свободного ПО, напишите в
ц╧╬─ є╫╧┬╧─╬╧╟╧ Ёя; ═┘ ╔╬╧╟─┴ ─┼╠┴┼═ ╔╙╦╠└▐┼╬╔╤ ─╠╤ Фонд Свободного ПО; мы иногда делаем исключения для
▄╘╧╟╧. ю┴█┼ ╥┼█┼╬╔┼ ┬╒─┼╘ ╥╒╦╧╫╧─╙╘╫╧╫┴╘╪╙╤ ─╫╒═╤ ├┼╠╤═╔: этого. Наше решение будет руководствоваться двумя целями:
╙╧╚╥┴╬┼╬╔╤ ╙╫╧┬╧─╬╧╟╧ ╙╘┴╘╒╙┴ ╫╙┼╚ ╨╥╧╔┌╫╧─╬┘╚ ╬┴█┼╟╧ сохранения свободного статуса всех производных нашего
╙╫╧┬╧─╬╧╟╧ Ёя ╔ ╙╧─┼╩╙╘╫╔╤ ╙╧╫═┼╙╘╬╧═╒ ╔ ╨╧╫╘╧╥╬╧═╒ ╔╙- свободного ПО и содействия совместному и повторному ис-
╨╧╠╪┌╧╫┴╬╔└ Ёя ╫╧╧┬▌┼. пользованию ПО вообще.
[ч┴╥┴╬╘╔╤] [Гарантия]
ющысыщш чсЄсюЇщъ НИКАКИХ ГАРАНТИЙ
12. Ёяєыяь°ыї ЁЄячЄсээс ЁЄхфяєЇсўьёхЇєё тхєЁьсЇюя, юс ЁЄя- 12. ПОСКОЛЬКУ ПРОГРАММА ПРЕДОСТАВЛЯЕТСЯ БЕСПЛАТНО, НА ПРО-
чЄсээї юхЇ чсЄсюЇщъ ў Їяъ эхЄх, ысысё фяЁїєЇщэс ЁЄщэхющ- ГРАММУ НЕТ ГАРАНТИЙ В ТОЙ МЕРЕ, КАКАЯ ДОПУСТИМА ПРИМЕНИ-
э∙э ·сыяюяэ, ·с щєыьр■хющхэ Їхш єьї■схў, ыячфс ЁЄяЇщўюях МЫМ ЗАКОНОМ, ЗА ИСКЛЮЧЕНИЕМ ТЕХ СЛУЧАЕВ, КОГДА ПРОТИВНОЕ
·сёўьхюя ў Ёщє°эхююяъ цяЄэх. ЗАЯВЛЕНО В ПИСЬМЕННОЙ ФОРМЕ.
фхЄЎсЇхьщ сўЇяЄєыщш ЁЄсў щ/щьщ фЄїчщх єЇяЄяю∙ ЁяєЇсўьёрЇ ДЕРЖАТЕЛИ АВТОРСКИХ ПРАВ И/ИЛИ ДРУГИЕ СТОРОНЫ ПОСТАВЛЯЮТ
ЁЄячЄсээї "ысы яюс хєЇ°" тх· ысыячя-ьщтя ўщфс чсЄсюЇщъ, ПРОГРАММУ "КАК ОНА ЕСТЬ" БЕЗ КАКОГО-ЛИБО ВИДА ГАРАНТИЙ,
ў∙ЄсЎхюю∙ш ёўюя щьщ ЁяфЄс·їэхўсхэ∙ш, ўыьр■сё, юя юх ВЫРАЖЕННЫХ ЯВНО ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ
ячЄсющ■щўсёє° ЁяфЄс·їэхўсхэ∙эщ чсЄсюЇщёэщ ыяээхЄ■хєыяъ ОГРАНИЧИВАЯСЬ ПОДРАЗУМЕВАЕМЫМИ ГАРАНТИЯМИ КОММЕРЧЕСКОЙ
ухююяєЇщ щ ЁЄщчяфюяєЇщ фьё ыяюыЄхЇюяъ ухьщ. ўхє° Єщєы ў ЦЕННОСТИ И ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ. ВЕСЬ РИСК В
яЇюя√хющщ ыс■хєЇўс щ ЁЄящ·ўяфщЇхь°юяєЇщ ЁЄячЄсээ∙ ОТНОШЕНИИ КАЧЕСТВА И ПРОИЗВОДИТЕЛЬНОСТИ ПРОГРАММЫ
яєЇсхЇєё ЁЄщ ўсє. хєьщ ЁЄячЄсээс яысЎхЇєё фхцхыЇщўюяъ, ОСТАЕТСЯ ПРИ ВАС. ЕСЛИ ПРОГРАММА ОКАЖЕТСЯ ДЕФЕКТИВНОЙ,
ў∙ ЁЄщющэсхЇх юс єхтё єЇящэяєЇ° ўєхчя юхятшяфщэячя ВЫ ПРИНИМАЕТЕ НА СЕБЯ СТОИМОСТЬ ВСЕГО НЕОБХОДИМОГО
ятєьїЎщўсющё, ўяєєЇсюяўьхющё щьщ щєЁЄсўьхющё. ОБСЛУЖИВАНИЯ, ВОССТАНОВЛЕНИЯ ИЛИ ИСПРАВЛЕНИЯ.
13. ющ ў ыяхэ єьї■сх, хєьщ юх ЇЄхтїхЇєё Ёяфшяфё¤щэ ·сыяюяэ 13. НИ В КОЕМ СЛУЧАЕ, ЕСЛИ НЕ ТРЕБУЕТСЯ ПОДХОДЯЩИМ ЗАКОНОМ
щьщ юх їєьяўьхюя ў Ёщє°эхююяъ цяЄэх, ющысыяъ фхЄЎсЇхь° ИЛИ НЕ УСЛОВЛЕНО В ПИСЬМЕННОЙ ФОРМЕ, НИКАКОЙ ДЕРЖАТЕЛЬ
сўЇяЄєыщш ЁЄсў щьщ ющысыях фЄїчях ьщуя, ыяЇяЄях эяЎхЇ АВТОРСКИХ ПРАВ ИЛИ НИКАКОЕ ДРУГОЕ ЛИЦО, КОТОРОЕ МОЖЕТ
щ·эхюёЇ° щ/щьщ ЁяўЇяЄюя ЄсєЁЄяєЇЄсюёЇ° ЁЄячЄсээї, ысы ИЗМЕНЯТЬ И/ИЛИ ПОВТОРНО РАСПРОСТРАНЯТЬ ПРОГРАММУ, КАК
т∙ья Єс·Єх√хюя ў∙√х, юх яЇўхЇєЇўхюю∙ ЁхЄхф ўсэщ ·с їт∙Ї- БЫЛО РАЗРЕШЕНО ВЫШЕ, НЕ ОТВЕТСТВЕННЫ ПЕРЕД ВАМИ ЗА УБЫТ-
ыщ, ўыьр■сё ьрт∙х ят¤щх, єЁхущсь°ю∙х, єьї■съю∙х щьщ КИ, ВКЛЮЧАЯ ЛЮБЫЕ ОБЩИЕ, СПЕЦИАЛЬНЫЕ, СЛУЧАЙНЫЕ ИЛИ
Ёяєьхфяўсў√щх їт∙Їыщ, ЁЄящєЇхыср¤щх щ· щєЁяь°·яўсющё щьщ ПОСЛЕДОВАВШИЕ УБЫТКИ, ПРОИСТЕКАЮЩИЕ ИЗ ИСПОЛЬЗОВАНИЯ ИЛИ
юхўя·эяЎюяєЇщ щєЁяь°·яўсющё ЁЄячЄсээ∙ (ўыьр■сё, юя юх НЕВОЗМОЖНОСТИ ИСПОЛЬЗОВАНИЯ ПРОГРАММЫ (ВКЛЮЧАЯ, НО НЕ
ячЄсющ■щўсёє° ЁяЇхЄхъ фсюю∙ш, щьщ фсюю∙эщ, єЇсў√щэщ ОГРАНИЧИВАЯСЬ ПОТЕРЕЙ ДАННЫХ, ИЛИ ДАННЫМИ, СТАВШИМИ
юхЁЄсўщь°ю∙эщ, щьщ ЁяЇхЄёэщ, Ёяюхєхюю∙эщ щ·-·с ўсє щьщ НЕПРАВИЛЬНЫМИ, ИЛИ ПОТЕРЯМИ, ПОНЕСЕННЫМИ ИЗ-ЗА ВАС ИЛИ
ЇЄхЇ°щш ьщу, щьщ яЇыс·яэ ЁЄячЄсээ∙ ЄстяЇсЇ° єяўэхєЇюя є ТРЕТЬИХ ЛИЦ, ИЛИ ОТКАЗОМ ПРОГРАММЫ РАБОТАТЬ СОВМЕСТНО С
ьрт∙эщ фЄїчщэщ ЁЄячЄсээсэщ), фсЎх хєьщ Їсыяъ фхЄЎсЇхь° щьщ ЛЮБЫМИ ДРУГИМИ ПРОГРАММАМИ), ДАЖЕ ЕСЛИ ТАКОЙ ДЕРЖАТЕЛЬ ИЛИ
фЄїчях ьщуя т∙ьщ щ·ўх¤хю∙ я ўя·эяЎюяєЇщ Їсыщш їт∙Їыяў. ДРУГОЕ ЛИЦО БЫЛИ ИЗВЕЩЕНЫ О ВОЗМОЖНОСТИ ТАКИХ УБЫТКОВ.
ыяюху яЁЄхфхьхющъ щ їєьяўщъ КОНЕЦ ОПРЕДЕЛЕНИЙ И УСЛОВИЙ
ы┴╦ ╨╥╔═┼╬╤╘╪ ▄╘╔ ╒╙╠╧╫╔╤ ╦ ╫┴█╔═ ╬╧╫┘═ ╨╥╧╟╥┴══┴═ Как применять эти условия к вашим новым программам
х╙╠╔ ╫┘ ╥┴┌╥┴┬┴╘┘╫┴┼╘┼ ╬╧╫╒└ ╨╥╧╟╥┴══╒ ╔ ╚╧╘╔╘┼, ▐╘╧┬┘ ╧╬┴ Если вы разрабатываете новую программу и хотите, чтобы она
╨╥╔╬┼╙╠┴ ═┴╦╙╔═┴╠╪╬╧ ╫╧┌═╧╓╬╒└ ╨╧╠╪┌╒ ╧┬▌┼╙╘╫╒, ╠╒▐█╔╩ ╙╨╧╙╧┬ принесла максимально возможную пользу обществу, лучший способ
─╧╙╘╔▐╪ ▄╘╧╟╧ - ╫╦╠└▐╔╘╪ ┼┼ ╫ ╙╫╧┬╧─╬╧┼ Ёя, ╦╧╘╧╥╧┼ ╦┴╓─┘╩ достичь этого - включить ее в свободное ПО, которое каждый
═╧╓┼╘ ╨╧╫╘╧╥╬╧ ╥┴╙╨╥╧╙╘╥┴╬╤╘╪ ╔ ╔┌═┼╬╤╘╪ ╙╧╟╠┴╙╬╧ ─┴╬╬┘═ может повторно распространять и изменять согласно данным
╒╙╠╧╫╔╤═. условиям.
■╘╧┬┘ ╙─┼╠┴╘╪ ▄╘╧, ─╧┬┴╫╪╘┼ ╫ ╨╥╧╟╥┴══╒ ╙╠┼─╒└▌╔┼ ╒╫┼─╧═╠┼- Чтобы сделать это, добавьте в программу следующие уведомле-
╬╔╤. є┴═╧┼ ┬┼┌╧╨┴╙╬╧┼ -- ▄╘╧ ─╧┬┴╫╔╘╪ ╔╚ ╫ ╬┴▐┴╠╧ ╦┴╓─╧╟╧ ния. Самое безопасное -- это добавить их в начало каждого
╔╙╚╧─╬╧╟╧ ╞┴╩╠┴, ▐╘╧┬┘ ╬┴╔┬╧╠┼┼ ▄╞╞┼╦╘╔╫╬╧ ╧╘╧┬╥┴┌╔╘╪ ╔╙╦╠└- исходного файла, чтобы наиболее эффективно отобразить исклю-
▐┼╬╔┼ ╟┴╥┴╬╘╔╩; ╔ ╦┴╓─┘╩ ╞┴╩╠ ─╧╠╓┼╬ ╙╧─┼╥╓┴╘╪ ╨╧ ═┼╬╪█┼╩ чение гарантий; и каждый файл должен содержать по меньшей
═┼╥┼ ╙╘╥╧╦╒, ╙╧─┼╥╓┴▌╒└ ┌╬┴╦ ╧╚╥┴╬┘ ┴╫╘╧╥╙╦╧╟╧ ╨╥┴╫┴ ╔ мере строку, содержащую знак охраны авторского права и
╒╦┴┌┴╬╔┼ ╬┴ ╘╧, ╟─┼ ╬┴╚╧─╔╘╙╤ ╨╧╠╬╧┼ ╒╫┼─╧═╠┼╬╔┼. указание на то, где находится полное уведомление.
╧─╬┴ ╙╘╥╧╦┴, ╙╧─┼╥╓┴▌┴╤ ╬┴┌╫┴╬╔┼ ╨╥╧╟╥┴══┘ ╔ ╦╥┴╘╦╧┼ одна строка, содержащая название программы и краткое
╧╨╔╙┴╬╔┼ ╘╧╟╧, ▐╘╧ ╧╬┴ ─┼╠┴┼╘. описание того, что она делает.
(C) ╬┴╔═┼╬╧╫┴╬╔┼ (╔═╤) ┴╫╘╧╥┴ 19╟╟ (C) наименование (имя) автора 19гг
№╘╧ ╙╫╧┬╧─╬┴╤ ╨╥╧╟╥┴══┴; ╫┘ ═╧╓┼╘┼ ╨╧╫╘╧╥╬╧ ╥┴╙╨╥╧╙╘╥┴╬╤╘╪ Это свободная программа; вы можете повторно распространять
┼┼ ╔/╔╠╔ ═╧─╔╞╔├╔╥╧╫┴╘╪ ┼┼ ╫ ╙╧╧╘╫┼╘╙╘╫╔╔ ╙ ї╬╔╫┼╥╙┴╠╪╬╧╩ ее и/или модифицировать ее в соответствии с Универсальной
я┬▌┼╙╘╫┼╬╬╧╩ ь╔├┼╬┌╔┼╩ GNU, ╧╨╒┬╠╔╦╧╫┴╬╬╧╩ ц╧╬─╧═ є╫╧┬╧─╬╧╟╧ Общественной Лицензией GNU, опубликованной Фондом Свободного
Ёя; ╠╔┬╧ ╫┼╥╙╔╔ 2, ╠╔┬╧ (╨╧ ╫┴█┼═╒ ╫┘┬╧╥╒) ╠└┬╧╩ ┬╧╠┼┼ ПО; либо версии 2, либо (по вашему выбору) любой более
╨╧┌─╬┼╩ ╫┼╥╙╔╔. поздней версии.
№╘┴ ╨╥╧╟╥┴══┴ ╥┴╙╨╥╧╙╘╥┴╬╤┼╘╙╤ ╫ ╬┴─┼╓─┼, ▐╘╧ ╧╬┴ ┬╒─┼╘ Эта программа распространяется в надежде, что она будет
╨╧╠┼┌╬╧╩, ╬╧ тх· ысыщш-ьщтя чсЄсюЇщъ; ─┴╓┼ ┬┼┌ ╨╧─╥┴┌╒═┼╫┴┼- полезной, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумевае-
═┘╚ ╟┴╥┴╬╘╔╩ ыяээхЄ■хєыяъ ухююяєЇщ ╔╠╔ ЁЄщчяфюяєЇщ фьё мых гарантий КОММЕРЧЕСКОЙ ЦЕННОСТИ или ПРИГОДНОСТИ ДЛЯ
ыяюыЄхЇюяъ ухьщ. ф╠╤ ╨╧╠╒▐┼╬╔╤ ╨╧─╥╧┬╬┘╚ ╙╫┼─┼╬╔╩ ╙═╧╘╥╔╘┼ КОНКРЕТНОЙ ЦЕЛИ. Для получения подробных сведений смотрите
ї╬╔╫┼╥╙┴╠╪╬╒└ я┬▌┼╙╘╫┼╬╬╒└ ь╔├┼╬┌╔└ GNU. Универсальную Общественную Лицензию GNU.
ў┘ ─╧╠╓╬┘ ┬┘╠╔ ╨╧╠╒▐╔╘╪ ╦╧╨╔└ ї╬╔╫┼╥╙┴╠╪╬╧╩ я┬▌┼╙╘╫┼╬╬╧╩ Вы должны были получить копию Универсальной Общественной
ь╔├┼╬┌╔╔ GNU ╫═┼╙╘┼ ╙ ▄╘╧╩ ╨╥╧╟╥┴══╧╩; ┼╙╠╔ ╬┼╘, ╬┴╨╔█╔╘┼ Лицензии GNU вместе с этой программой; если нет, напишите
╨╧ ┴─╥┼╙╒: Free Software Foundation, Inc., 51 Franklin Street, по адресу: Free Software Foundation, Inc., 51 Franklin Street,
Fifth Floor, Boston, MA 02110-1301 USA Fifth Floor, Boston, MA 02110-1301 USA
ф╧┬┴╫╪╘┼ ╘┴╦╓┼ ╙╫┼─┼╬╔╤ ╧ ╘╧═, ╦┴╦ ╙╫╤┌┴╘╪╙╤ ╙ ╫┴═╔ ╨╧ Добавьте также сведения о том, как связаться с вами по
▄╠┼╦╘╥╧╬╬╧╩ ╔ ╧┬┘▐╬╧╩ ╨╧▐╘┼. электронной и обычной почте.
х╙╠╔ ╨╥╧╟╥┴══┴ ╔╬╘┼╥┴╦╘╔╫╬┴╤, ╙─┼╠┴╩╘┼ ╘┴╦, ▐╘╧┬┘ ╨╥╔ ┌┴╨╒╙╦┼ Если программа интерактивная, сделайте так, чтобы при запуске
╫ ╔╬╘┼╥┴╦╘╔╫╬╧═ ╥┼╓╔═┼ ╧╬┴ ╫┘─┴╫┴╠┴ ╦╥┴╘╦╧┼ ╒╫┼─╧═╠┼╬╔┼ ╘╔╨┴ в интерактивном режиме она выдавала краткое уведомление типа
╙╠┼─╒└▌┼╟╧: следующего:
Gnomovision, ╫┼╥╙╔╤ 69, (C) ╔═╤ ┴╫╘╧╥┴ 19╟╟ Gnomovision, версия 69, (C) имя автора 19гг
Gnomovision ╨╧╙╘┴╫╠╤┼╘╙╤ стєяьрЇюя тх· ысыщш-ьщтя чсЄсюЇщъ; Gnomovision поставляется АБСОЛЮТНО БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ;
─╠╤ ╨╧╠╒▐┼╬╔╤ ╨╧─╥╧┬╬╧╙╘┼╩ ╬┴╨┼▐┴╘┴╩╘┼ 'show w'. №╘╧ ╙╫╧┬╧─- для получения подробностей напечатайте 'show w'. Это свобод-
╬┴╤ ╨╥╧╟╥┴══┴, ╔ ╫┘ ╨╥╔╟╠┴█┴┼╘┼╙╪ ╨╧╫╘╧╥╬╧ ╥┴╙╨╥╧╙╘╥┴╬╤╘╪ ┼┼ ная программа, и вы приглашаетесь повторно распространять ее
╨╥╔ ╧╨╥┼─┼╠┼╬╬┘╚ ╒╙╠╧╫╔╤╚; ─╠╤ ╨╧╠╒▐┼╬╔╤ ╨╧─╥╧┬╬╧╙╘┼╩ ╫╫┼─╔╘┼ при определенных условиях; для получения подробностей введите
'show c'. '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] [QueryBox]
ф╔┴╠╧╟╧╫┘┼ ╧╦╬┴ ┌┴╨╥╧╙╧╫ Диалоговые окна запросов
ў ╧╦╬┴╚ ┌┴╨╥╧╙╧╫ ─╠╤ ╫┘┬╧╥┴ ╦┴╦╧╟╧-╠╔┬╧ ╫┴╥╔┴╬╘┴ ╧╘╫┼╘┴ В окнах запросов для выбора какого-либо варианта ответа
(╦╧╘╧╥┘┼ ╧┬┘▐╬╧ ┌┴─┴└╘╙╤ ╫ ╫╔─┼ ▄╦╥┴╬╬┘╚ ╦╬╧╨╧╦) ў┘ ═╧╓┼╘┼ (которые обычно задаются в виде экранных кнопок) Вы можете
╔╙╨╧╠╪┌╧╫┴╘╪ ╠╔┬╧ ╦╠┴╫╔█╔ ╙╧ ╙╘╥┼╠╦┴═╔, ╠╔┬╧ ╫┘┬╥┴╘╪ ╧╘╫┼╘ использовать либо клавиши со стрелками, либо выбрать ответ
╨╒╘┼═ ╬┴╓┴╘╔╤ ╦╠┴╫╔█╔ ╙ ╫┘─┼╠┼╬╬╧╩ ╫ ╬┴┌╫┴╬╔╔ ╦╬╧╨╦╔ путем нажатия клавиши с выделенной в названии кнопки
┬╒╦╫╧╩, ╠╔┬╧ ▌┼╠╦╬╒╫ ╨╧ ╬╒╓╬╧╩ ╦╬╧╨╦┼ ═┘█╦╧╩. буквой, либо щелкнув по нужной кнопке мышкой.
[How to use help] [How to use help]
ы┴╦ ╨╧╠╪┌╧╫┴╘╪╙╤ ╨╧═╧▌╪└ Как пользоваться помощью
Ё╥╔ ╥┴┬╧╘┼ ╙ ╨╥╧╟╥┴══╧╩ Midnight Commander ╨╥┴╦╘╔▐┼╙╦╔ ╫ При работе с программой Midnight Commander практически в
╠└┬╧╩ ═╧═┼╬╘ ═╧╓╬╧ ╧┬╥┴╘╔╘╪╙╤ ╦ ╔╬╘┼╥┴╦╘╔╫╬╧╩ ╨╧─╙╦┴┌╦┼, любой момент можно обратиться к интерактивной подсказке,
╫┘┌╧╫ ╦╧╘╧╥╧╩ ╧╙╒▌┼╙╘╫╠╤┼╘╙╤ ╬┴╓┴╘╔┼═ ╦╠┴╫╔█╔ F1. ф╠╤ вызов которой осуществляется нажатием клавиши F1. Для
╨┼╥┼═┼▌┼╬╔╤ ╫ ╧╦╬┼ ╨╥╧╙═╧╘╥┴ ╨╧─╙╦┴┌╦╔ ў┘ ═╧╓┼╘┼ перемещения в окне просмотра подсказки Вы можете
╔╙╨╧╠╪┌╧╫┴╘╪ ╦╠┴╫╔█╔ ╨┼╥┼═┼▌┼╬╔╤ ╦╒╥╙╧╥┴ (╙╘╥┼╠╦╔) ╔╠╔ использовать клавиши перемещения курсора (стрелки) или
═┘█╪. є╘╥┼╠╦┴ ╫╬╔┌ ╫┘┌┘╫┴┼╘ ╨┼╥┼╚╧─ ╦ ╙╠┼─╒└▌┼╩ ╙╙┘╠╦┼ мышь. Стрелка вниз вызывает переход к следующей ссылке
(╫┘─┼╠┼╬┘ ╟╧╠╒┬┘═ ╞╧╬╧═) ╔╠╔ ╙─╫╔╟ ╘┼╦╙╘┴ ╬┴ ╧─╬╒ ╙╘╥╧╦╒ (выделены голубым фоном) или сдвиг текста на одну строку
╫╫┼╥╚. є╘╥┼╠╦┴ ╫╫┼╥╚ ╫┘┌┘╫┴┼╘ ╨┼╥┼╚╧─ ╦ ╨╥┼─┘─╒▌┼╩ ╙╙┘╠╦┼ вверх. Стрелка вверх вызывает переход к предыдущей ссылке
╔╠╔ ╙─╫╔╟ ╘┼╦╙╘┴ ╬┴ ╧─╬╒ ╙╘╥╧╦╒ ╫╫┼╥╚. є╘╥┼╠╦┴ ╫╨╥┴╫╧ или сдвиг текста на одну строку вверх. Стрелка вправо
╫┘┌┘╫┴┼╘ ╨┼╥┼╚╧─ ╨╧ ╙╙┘╠╦┼, ╦╧╘╧╥┴╤ ╫ ─┴╬╬┘╩ ═╧═┼╬╘ вызывает переход по ссылке, которая в данный момент
╫┘─┼╠┼╬┴ ╙╔╬╔═ ╞╧╬╧═ (╘┼╦╒▌┴╤ ╙╙┘╠╦┴). Ё╧ ╙╘╥┼╠╦┼ ╫╠┼╫╧ выделена синим фоном (текущая ссылка). По стрелке влево
╨╥╧╔╙╚╧─╔╘ ╨┼╥┼╚╧─ ╦ ╥┴╬┼┼ ╨╥╧╙═╧╘╥┼╬╬┘═ ╥┴┌─┼╠┴═ происходит переход к ранее просмотренным разделам
╨╧─╙╦┴┌╦╔. подсказки.
х╙╠╔ ў┴█ ╘┼╥═╔╬┴╠ ╬┼ ╨╧──┼╥╓╔╫┴┼╘ ╦╠┴╫╔█╔-╙╘╥┼╠╦╔, ў┘ Если Ваш терминал не поддерживает клавиши-стрелки, Вы
═╧╓┼╘┼ ╔╙╨╧╠╪┌╧╫┴╘╪ ╦╠┴╫╔█╒ ╨╥╧┬┼╠┴ ─╠╤ ╨┼╥┼╚╧─┴ ╦ можете использовать клавишу пробела для перехода к
╙╠┼─╒└▌┼╩ ╙╘╥┴╬╔├┼ ╨╧─╙╦┴┌╦╔ ╔ ╦╠┴╫╔█╒ 'b' ─╠╤ ╨┼╥┼╚╧─┴ ╦ следующей странице подсказки и клавишу 'b' для перехода к
╨╥┼─┘─╒▌┼╩ ╙╘╥┴╬╔├┼. ы╠┴╫╔█┴ TAB ╫┘┌┘╫┴┼╘ ╨┼╥┼╚╧─ ╦ предыдущей странице. Клавиша TAB вызывает переход к
╙╠┼─╒└▌┼╩ ╙╙┘╠╦┼, ┴ ╬┴╓┴╘╔┼ ENTER - ╨┼╥┼╚╧─ ╨╧ ╘┼╦╒▌┼╩ следующей ссылке, а нажатие ENTER - переход по текущей
╙╙┘╠╦┼. Ё╥╔ ╨╥╧╙═╧╘╥┼ ╨╧─╙╦┴┌╦╔ ╨╥╧╟╥┴══┴ ┌┴╨╧═╔╬┴┼╘ ссылке. При просмотре подсказки программа запоминает
╨╧╙╠┼─╧╫┴╘┼╠╪╬╧╙╘╪ ╨┼╥┼╚╧─╧╫ ╨╧ ╙╙┘╠╦┴═ ╔ ╨╧┌╫╧╠╤┼╘ последовательность переходов по ссылкам и позволяет
╫┼╥╬╒╘╪╙╤ ╦ ╥┴╬┼┼ ╨╥╧╙═╧╘╥┼╬╬┘═ ╥┴┌─┼╠┴═, ╫╧╙╨╧╠╪┌╧╫┴╫█╔╙╪ вернуться к ранее просмотренным разделам, воспользовавшись
╦╠┴╫╔█┼╩ 'l' (last). ю┴╓┴╘╔┼ ╬┴ ESC ╫┘┌┘╫┴┼╘ ╫┘╚╧─ ╔┌ ╧╦╬┴ клавишей 'l' (last). Нажатие на ESC вызывает выход из окна
╨╧─╙╦┴┌╦╔. подсказки.
Ё╧ ▌┼╠▐╦╒ ╠┼╫╧╩ ╦╠┴╫╔█╔ ═┘█╔ ╨╥╧╔╙╚╧─╔╘ ╨┼╥┼╚╧─ ╨╧ ╙╙┘╠╦┼ По щелчку левой клавиши мыши происходит переход по ссылке
╔╠╔ ╨┼╥┼═┼▌┼╬╔┼ ╨╧ ╘┼╦╙╘╒ ╨╧─╙╦┴┌╦╔. ¤┼╠▐╧╦ ╨╥┴╫╧╩ ╦╬╧╨╦╧╩ или перемещение по тексту подсказки. Щелчок правой кнопкой
═┘█╔ ╔╙╨╧╠╪┌╒┼╘╙╤ ─╠╤ ╨┼╥┼╚╧─ ╦ ╥┴╬┼┼ ╨╥╧╙═╧╘╥┼╬╬┘═ мыши используется для переход к ранее просмотренным
╥┴┌─┼╠┴═. разделам.
Ё╧╠╬┘╩ ╙╨╔╙╧╦ ╒╨╥┴╫╠╤└▌╔╚ ╦╧═┬╔╬┴├╔╩ ─╠╤ ╧╦╬┴ ╨╥╧╙═╧╘╥┴ Полный список управляющих комбинаций для окна просмотра
╨╧─╙╦┴┌╦╔: подсказки:
Є┴┬╧╘┴└╘ ╫╙┼ ╦╠┴╫╔█╔ ╒╨╥┴╫╠┼╬╔╤ ╨┼╥┼═┼▌┼╬╔┼═General Movement Keys. Работают все клавиши управления перемещениемGeneral Movement Keys.
tab Ё┼╥┼╚╧─ ╬┴ ╙╠┼─╒└▌╒└ ╙╙┘╠╦╒. tab Переход на следующую ссылку.
M-tab Ё┼╥┼╚╧─ ╬┴ ╨╥┼─┘─╒▌╒└ ╙╙┘╠╦╒. M-tab Переход на предыдущую ссылку.
down Ё┼╥┼╚╧─ ╬┴ ╙╠┼─╒└▌╒└ ╙╙┘╠╦╒ ╔╠╔ ╙═┼▌┼╬╔┼ down Переход на следующую ссылку или смещение
╘┼╦╙╘┴ ╬┴ ╧─╬╒ ╙╘╥╧╦╒ ╫╫┼╥╚. текста на одну строку вверх.
up Ё┼╥┼╚╧─ ╬┴ ╙╠┼─╒└▌╒└ ╙╙┘╠╦╒ ╔╠╔ ╙═┼▌┼╬╔┼ up Переход на следующую ссылку или смещение
╘┼╦╙╘┴ ╬┴ ╧─╬╒ ╙╘╥╧╦╒ ╫╬╔┌. текста на одну строку вниз.
right, enter Ё┼╥┼╚╧─ ╨╧ ╘┼╦╒▌┼╩ ╙╙┘╠╦┼. right, enter Переход по текущей ссылке.
left, l Ё┼╥┼╚╧─ ╦ ╥┴╬┼┼ ╨╥╧╙═╧╘╥┼╬╬┘═ ╥┴┌─┼╠┴═. left, l Переход к ранее просмотренным разделам.
F1 Ё╧═╧▌╪ ╨╧ ╔╙╨╧╠╪┌╧╫┴╬╔└ ╙┴═╧╩ ╨╧─╙╦┴┌╦╔. F1 Помощь по использованию самой подсказки.
n Ё┼╥┼╚╧─ ╦ ╙╠┼─╒└▌┼═╒ ╥┴┌─┼╠╒ ╨╧═╧▌╔. n Переход к следующему разделу помощи.
p Ё┼╥┼╚╧─ ╦ ╨╥┼─┘─╒▌┼═╒ ╥┴┌─┼╠╒ ╨╧═╧▌╔. p Переход к предыдущему разделу помощи.
c Ё┼╥┼╚╧─ ╦ ╧╟╠┴╫╠┼╬╔└ ╨╧─╙╦┴┌╦╔. c Переход к оглавлению подсказки.
F10, esc ў┘╚╧─ ╔┌ ╧╦╬┴ ╨╥╧╙═╧╘╥┴ ╨╧─╙╦┴┌╦╔. F10, esc Выход из окна просмотра подсказки.
 

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Просмотреть файл

@ -6,25 +6,25 @@
x x lqk w w lqk tqk w w w w x x lqk w w lqk tqk w w w w
x x x x tqu x x x x tqu x x x x x x tqu x x x x tqu x x
v x mqj v v mqj x v v v mqv v x mqj v v mqj x v v v mqv
mqqq▌╨р╒╘▌╪┌ qqj  mqqqнаредник qqj 
╛╥▐ °╒ ╙█╨╥▌╪ ╒┌р╨▌ ▀▐▄▐√╪ ╫╨ │╜├-▐╥▐╙ ▀▐▌▐√▌▐╙ ▌╨р╒╘▌╪┌╨ . Ово је главни екран помоћи за ГНУ-овог поноћног наредника .
┤╨ ╤╪ст╒ с╨╫▌╨█╪ ╥╪ш╒ ▐ т▐▄╒ ┌╨┌▐ ╘╨ ┌▐р╪ст╪т╒ ╪▌т╒р╨┌т╪╥▌╪ Да бисте сазнали више о томе како да користите интерактивни
с╪ст╒▄ ▀▐▄▐√╪ ▀▐тр╒╤▌▐ °╒ ╘╨ ▀р╪т╪с▌╒т╒ EnterHow to use help. систем помоћи потребно је да притиснете EnterHow to use help.
╝▐╓╒т╒ ╪ ▐╘▄╨х ▐т╪√╪ ▌╨ с╨╘р╓╨°Contents ▀▐▄▐√╪. Можете и одмах отићи на садржајContents помоћи.
│╜├-▐╥▐╙ ▀▐▌▐√▌▐╙ ▌╨р╒╘▌╪┌╨ су ▌╨▀╪с╨█╪ ·╒╙▐╥╪ ╨ут▐р╪AUTHORS. ГНУ-овог поноћног наредника су написали његови ауториAUTHORS.
│╜├-▐╥ ▀▐▌▐√▌╪ ▌╨р╒╘▌╪┌ с╒ ╪с▀▐ручу°╒ ▒╡╖ ╕║░║▓╡ │░└░╜╞╕и╡Warranty. ГНУ-ов поноћни наредник се испоручује БЕЗ ИКАКВЕ ГАРАНЦИЈЕWarranty.
╛╥▐ °╒ с█▐╤▐╘▌╪ с▐фт╥╒р, ╨ ╥╪ ст╒ ▀▐╫╥╨▌╪ ╘╨ ╙╨ Ово је слободни софтвер, а ви сте позвани да га
р╨с▀▐╘╒█╪т╒ ▀▐╘ ▐╘р╒╘╤╨▄╨ │╜├-▐╥╒ ▐▀шт╒ °╨╥▌╒ █╪ц╒▌ц╒╗╪ц╒▌ц╨ (▐р╪╙╪▌╨█ ▌╨ ╒▌╙█╒с┌▐▄). расподелите под одредбама ГНУ-ове опште јавне лиценцеЛиценца (оригинал на енглеском).
┐▐╙█╒╘╨°т╒ ╪ ▌╒╫╥╨▌╪ч╨▌ ▀р╒╥▐╘ │╜├-▐╥╒ ╛и╗ ▌╨ ср▀с┌╪╗╪ц╒▌ц╨ (▌╨ ср▀с┌▐▄). Погледајте и незваничан превод ГНУ-ове ОЈЛ на српскиЛиценца (на српском).
┐р╒╥▐╘ ┐▐▌▐√▌▐╙ ▌╨р╒╘▌╪┌╨ ╪ ▐╥╒ ╘╨т▐т╒┌╒ ▀▐▄▐√╪ ▌╨ ср▀с┌╪: Превод Поноћног наредника и ове датотеке помоћи на српски:
┴тр╨х╪·╨ └╨╘╪√, <mr99164@alas.matf.bg.ac.yu > Страхиња Радић, <mr99164@alas.matf.bg.ac.yu >
┴└┤ `├█╪┌с', http://uliks.sourceforge.net СРД `Уликс', http://uliks.sourceforge.net
[╗╪ц╒▌ц╨ (▐р╪╙╪▌╨█ ▌╨ ╒▌╙█╒с┌▐▄)] [Лиценца (оригинал на енглеском)]
GNU GENERAL PUBLIC LICENSE GNU GENERAL PUBLIC LICENSE
Version 2, June 1991 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. If this is what you want to do, use the GNU
Library General Public License instead of this License. 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, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
USA. USA.
┤▐╫╥▐∙╒▌▐ °╒ у▄▌▐╓╨╥╨·╒ ╪ р╨с▀▐╘╒█╨ ╘▐с█▐╥▌▐╙ ▀р╪▄╒р┌╨ Дозвољено је умножавање и расподела дословног примерка
т╒┌ст╨ ▐╥╒ █╪ц╒▌ц╒, ╨█╪ ▌╪°╒ ╘▐╫╥▐∙╒▌▐ ·╒▌▐ ▄╒·╨·╒. текста ове лиценце, али није дозвољено њено мењање.
├╙▐╥▐р Уговор
╖╨ ╥╒√╪▌у с▐фт╥╒р╨ █╪ц╒▌ц╒ су ▌╨ч╪·╒▌╒ с╨ ц╪∙╒▄ ╘╨ ╥╨▄ За већину софтвера лиценце су начињене са циљем да вам
▐╘у╫▄у с█▐╤▐╘у ╘╨ ╙╨ ╘╒█╪т╒ с╨ ╘ру╙╪▄╨ ╪ ▄╒·╨т╒. ╜╨су▀р▐т одузму слободу да га делите са другима и мењате. Насупрот
т▐▄╒, │╜├-▐╥╨ ▐▀шт╨ °╨╥▌╨ █╪ц╒▌ц╨ ╥╨▄ ╙╨р╨▌ту°╒ с█▐╤▐╘у томе, ГНУ-ова општа јавна лиценца вам гарантује слободу
╘╒∙╒·╨ ╪ ╪╫▄╒▌╒ с█▐╤▐╘▌▐╙ с▐фт╥╒р╨ ╘╨ ╤╪ ▐с╪╙ур╨█╨ с█▐╤▐╘у дељења и измене слободног софтвера да би осигурала слободу
с▐фт╥╒р╨ ╫╨ с╥╒ ·╒╙▐╥╒ ┌▐р╪с▌╪┌╒. ╛╥╨ ╛▀шт╨ °╨╥▌╨ █╪ц╒▌ц╨ софтвера за све његове кориснике. Ова Општа јавна лиценца
с╒ ▐╘▌▐с╪ ▌╨ ╥╒√╪▌у с▐фт╥╒р╨ ╪╫ ╖╨╘у╓╤╪▌╒ ╫╨ с█▐╤▐╘▌╪ се односи на већину софтвера из Задужбине за слободни
с▐фт╥╒р ╪ ▌╨ с╥╨┌╪ ╘ру╙╪ ▀р▐╙р╨▄, ч╪°╪ с╒ ╨ут▐р╪ ▐╤╨╥╒╓у софтвер и на сваки други програм, чији се аутори обавежу
▌╨ ·╒▌▐ ┌▐р╪ш√╒·╒. (┤ру╙╪ с▐фт╥╒р ╖╨╘у╓╤╪▌╒ ╫╨ с█▐╤▐╘▌╪ на њено коришћење. (Други софтвер Задужбине за слободни
с▐фт╥╒р °╒ у▄╒ст▐ ▐╥╒ █╪ц╒▌ц╒ ▀▐┌р╪╥╒▌ │╜├-▐╥▐▄ софтвер је уместо ове лиценце покривен ГНУ-овом
╤╪╤█╪▐т╒ч┌▐▄ ▐▀шт▐▄ °╨╥▌▐▄ █╪ц╒▌ц▐▄ (**).) ╕ ╥╪ °╒ ▄▐╓╒т╒ библиотечком општом јавном лиценцом (**).) И ви је можете
▀р╪▄╒▌╪т╪ ▌╨ ╥╨ш╒ ▀р▐╙р╨▄╒. применити на ваше програме.
║╨╘╨ ╙▐╥▐р╪▄▐ ▐ с█▐╤▐╘▌▐▄ с▐фт╥╒ру, ▄╪с█╪▄▐ ▌╨ с█▐╤▐╘у, Када говоримо о слободном софтверу, мислимо на слободу,
╨ ▌╒ ▌╨ ц╒▌у. ╜╨ш╒ ▐▀шт╒ °╨╥▌╒ █╪ц╒▌ц╒ су ╫╨▄╪ш∙╒▌╒ ╘╨ а не на цену. Наше опште јавне лиценце су замишљене да
▐с╪╙ур╨°у ╥╨шу с█▐╤▐╘у р╨с▀▐╘╒█╒ ▀р╪▄╒р╨┌╨ с█▐╤▐╘▌▐╙ осигурају вашу слободу расподеле примерака слободног
с▐фт╥╒р╨ (╪ ▌╨▀█╨√╪╥╨·╨ ╫╨ ту ус█у╙у ▀▐ ╓╒∙╪), ▀р╪▄╨·╨ софтвера (и наплаћивања за ту услугу по жељи), примања
╪╫╥▐р▌▐╙ ┌▐╘╨ ╪█╪ ·╒╙▐╥▐╙ ╘▐╤╪°╨·╨ ▀▐ ╓╒∙╪, ▄▐╙у√▌▐ст╪ изворног кода или његовог добијања по жељи, могућности
╪╫▄╒▌╒ с▐фт╥╒р╨ ╪█╪ ┌▐р╪ш√╒·╨ ╘╒█▐╥╨ ╪ст▐╙ у ▌▐╥╪▄ измене софтвера или коришћења делова истог у новим
с█▐╤▐╘▌╪▄ ▀р▐╙р╨▄╪▄╨; ╪ ╘╨ ╥╨▄ ╘╨°у ╘▐ ╫▌╨·╨ ╘╨ т▐ ▄▐╓╒т╒ слободним програмима; и да вам дају до знања да то можете
╘╨ ур╨╘╪т╒. да урадите.
┤╨ ╤╪с▄▐ ╫╨шт╪т╪█╪ ╥╨ш╨ ▀р╨╥╨, ▄▐р╨▄▐ ╘╨ ▀▐ст╨╥╪▄▐ Да бисмо заштитили ваша права, морамо да поставимо
▐╙р╨▌╪ч╒·╨ ┌▐°╨ ╫╨╤р╨·у°у ╤╪█▐ ┌▐▄╒ ╘╨ ╥╨▄ ▐с▀▐р╪ ▐╥╨ ограничења која забрањују било коме да вам оспори ова
▀р╨╥╨ ╪█╪ ╘╨ тр╨╓╪ ▐╘ ╥╨с ╘╨ ╪х с╒ ▐╘р╒┌▌╒т╒. ╛╥╨ права или да тражи од вас да их се одрекнете. Ова
▐╙р╨▌╪ч╒·╨ су ╪ ▐╤╨╥╒╫у°у√╨ ╫╨ ╥╨с ╨┌▐ р╨с▀▐╘╒∙у°╒т╒ ограничења су и обавезујућа за вас ако расподељујете
▀р╪▄╒р┌╒ с▐фт╥╒р╨, ╪█╪ ╙╨ ╪╫▄╒▌╪т╒. примерке софтвера, или га измените.
╜╨ ▀р╪▄╒р, ╨┌▐ р╨с▀▐╘╒∙у°╒т╒ ▀р╪▄╒р┌╒ т╨┌╥▐╙ ▀р▐╙р╨▄╨, На пример, ако расподељујете примерке таквог програма,
╤╒с▀█╨т▌▐ ╪█╪ ╫╨ ▐╘р╒Є╒▌у ▌▐╥ч╨▌у ▌╨╘▐┌▌╨╘у, ▄▐р╨т╒ ╘╨т╪ ╪ бесплатно или за одређену новчану надокнаду, морате дати и
▀р╪▄╨▐ц╪▄╨ с╥╨ ▀р╨╥╨ ┌▐°╨ с╨▄╪ ▀▐с╒╘у°╒т╒. ╝▐р╨т╒ с╒ примаоцима сва права која сами поседујете. Морате се
▀▐ст╨р╨т╪ ╘╨ ╪ ▐▌╪ ▀р╪▄╒ ╪█╪ ▄▐╙у ╘╨ ╘▐╤╪°у ╪╫╥▐р▌╪ ┌▐╘. постарати да и они приме или могу да добију изворни код.
╜╨°╫╨╘, ▄▐р╨т╒ ╪▄ ▀▐┌╨╫╨т╪ ▐╥╒ ▐╘р╒╘╤╒ ╘╨ ╤╪ ╤╪█╪ у▀▐╫▌╨т╪ Најзад, морате им показати ове одредбе да би били упознати
с╨ с╥▐°╪▄ ▀р╨╥╪▄╨. са својим правима.
╝╪ шт╪т╪▄▐ ╥╨ш╨ ▀р╨╥╨ у ╘╥╨ ┌▐р╨┌╨: (1) шт╪т╪▄▐ с▐фт╥╒р Ми штитимо ваша права у два корака: (1) штитимо софтвер
╫╨шт╪т▐▄ ╨ут▐рс┌╪х ▀р╨╥╨, ╪ (2) ▌у╘╪▄▐ ╥╨▄ ▐╥у █╪ц╒▌цу заштитом ауторских права, и (2) нудимо вам ову лиценцу
┌▐°╨ ╥╨▄ ╘╨°╒ ▀р╨╥▌у ╘▐╫╥▐█у ╘╨ у▄▌▐╓╨╥╨т╒, р╨с▀▐╘╒∙у°╒т╒ која вам даје правну дозволу да умножавате, расподељујете
╪/╪█╪ ▄╒·╨т╒ с▐фт╥╒р. и/или мењате софтвер.
┬╨┌▐Є╒, р╨╘╪ ╫╨шт╪т╒ с╥╨┌▐╙ ╨ут▐р╨ ╪ ▌╨с х▐√╒▄▐ ╘╨ с╒ Такође, ради заштите сваког аутора и нас хоћемо да се
▐с╪╙ур╨▄▐ ╘╨ с╥╨┌▐ р╨╫у▄╒ ╘╨ ▌╒ ▀▐ст▐°╪ ╙╨р╨▌ц╪°╨ ╫╨ ▐╥╨° осигурамо да свако разуме да не постоји гаранција за овај
с█▐╤▐╘▌╪ с▐фт╥╒р. ░┌▐ °╒ с▐фт╥╒р ▌╒┌▐ ╘ру╙╪ ╪╫▄╒▌╪▐ ╪ слободни софтвер. Ако је софтвер неко други изменио и
▀р▐с█╒╘╪▐ ╙╨, х▐√╒▄▐ ╘╨ ▀р╪▄╨▐ц╪ ╫▌╨°у ╘╨ ▐▌▐ шт▐ ╪▄╨°у проследио га, хоћемо да примаоци знају да оно што имају
▌╪°╒ ▐р╪╙╪▌╨█, т╨┌▐ ╘╨ с╒ ╤╪█▐ ┌╨┌╥╪ ▀р▐╤█╒▄╪ ┌▐°╪ су није оригинал, тако да се било какви проблеми који су
▌╨ст╨█╪ ╫╤▐╙ ╘ру╙╪х, ▌╒√╒ ▐╘р╨╫╪т╪ ▌╨ у╙█╒╘ ╨ут▐р╨ настали због других, неће одразити на углед аутора
▐р╪╙╪▌╨█╨. оригинала.
╜╨°╫╨╘, с╥╒ с█▐╤▐╘▌╒ ▀р▐╙р╨▄╒ ▌╒▀р╒ст╨▌▐ у╙р▐╓╨╥╨°у Најзад, све слободне програме непрестано угрожавају
с▐фт╥╒рс┌╪ ▀╨т╒▌т╪. ╝╪ х▐√╒▄▐ ╘╨ ╪╫╤╒╙▌╒▄▐ ▐▀╨с▌▐ст ╘╨ софтверски патенти. Ми хоћемо да избегнемо опасност да
р╨с▀▐╘╒∙╪╥╨ч╪ с█▐╤▐╘▌▐╙ ▀р▐╙р╨▄╨ ╪▌╘╪╥╪╘у╨█▌▐ ╘▐╤╪°у расподељивачи слободног програма индивидуално добију
▀╨т╒▌т▌╒ █╪ц╒▌ц╒ ╪ ▌╨ т╨° ▌╨ч╪▌ ст╨╥╒ ▀р▐╙р╨▄ у ▀р╪╥╨т▌▐ патентне лиценце и на тај начин ставе програм у приватно
╥█╨с▌╪шт╥▐. ┤╨ ╤╪с▄▐ с▀р╒ч╪█╪ ▐╥▐, °╨с▌▐ с▄▐ ╪ст╨┌█╪ ╘╨ власништво. Да бисмо спречили ово, јасно смо истакли да
с╥╨┌╪ ▀╨т╒▌т ▄▐р╨ ╘╨ ╤у╘╒ █╪ц╒▌ц╪р╨▌ ╫╨ с╥╨ч╪°у с█▐╤▐╘▌у сваки патент мора да буде лиценциран за свачију слободну
у▀▐тр╒╤у ╪█╪ ╘╨ у▐▀шт╒ ▌╒ ╤у╘╒ █╪ц╒▌ц╪р╨▌. употребу или да уопште не буде лиценциран.
┐р╒ц╪╫▌╒ ▐╘р╒╘╤╒ ╪ ус█▐╥╪ у▄▌▐╓╨╥╨·╨, р╨с▀▐╘╒█╒ ╪ ╪╫▄╒▌╒ Прецизне одредбе и услови умножавања, расподеле и измене
с█╒╘╒. следе.
│╜├-╛▓░ ╛┐╚┬░ и░▓╜░ ╗╕╞╡╜╞░ ГНУ-ОВА ОПШТА ЈАВНА ЛИЦЕНЦА
╛┤└╡┤▒╡ ╕ ├┴╗╛▓╕ ├╝╜╛╢░▓░к░, └░┴┐╛┤╡╗╡ ╕ ╕╖╝╡╜╡ ОДРЕДБЕ И УСЛОВИ УМНОЖАВАЊА, РАСПОДЕЛЕ И ИЗМЕНЕ
0. ╛╥╨ █╪ц╒▌ц╨ с╒ ▐╘▌▐с╪ ▌╨ с╥╨┌╪ ▀р▐╙р╨▄ ╪█╪ ╘ру╙▐ ╘╒█▐ 0. Ова лиценца се односи на сваки програм или друго дело
┌▐°╒ с╨╘р╓╪ с╨▐▀шт╒·╒ ╥█╨с▌╪┌╨ ╨ут▐рс┌╪х ▀р╨╥╨ у ┌▐▄ ст▐°╪ које садржи саопштење власника ауторских права у ком стоји
╘╨ ▄▐╓╒ ╤╪т╪ р╨с▀▐╘╒∙╒▌ ▀▐╘ ▐╘р╒╘╤╨▄╨ ▐╥╒ ▐▀шт╒ °╨╥▌╒ да може бити расподељен под одредбама ове опште јавне
█╪ц╒▌ц╒. ,,┐р▐╙р╨▄`` √╒ ▌╨╘╨∙╒ ▐╫▌╨ч╨╥╨т╪ с╥╨┌╪ т╨┌╨╥ лиценце. ,,Програм`` ће надаље означавати сваки такав
▀р▐╙р╨▄ ╪█╪ р╨╘, ╨ ,,╘╒█▐ ╫╨с▌▐╥╨▌▐ ▌╨ ┐р▐╙р╨▄у`` √╒ програм или рад, а ,,дело засновано на Програму`` ће
▐╫▌╨ч╨╥╨т╪ ┐р▐╙р╨▄ ╪█╪ ╤╪█▐ ┌▐°╪ р╨╘ ▀р▐╪ст╒┌╨▐ ╪╫ ·╒╙╨ ▀▐ означавати Програм или било који рад проистекао из њега по
╖╨┌▐▌у ▐ ╨ут▐рс┌╪▄ ▀р╨╥╪▄╨; т°. ╘╒█▐ ┌▐°╒ с╨╘р╓╪ ┐р▐╙р╨▄ Закону о ауторским правима; тј. дело које садржи Програм
╪█╪ ·╒╙▐╥ ╘╒▐, ╤╪█▐ ╘▐с█▐╥▌╪ ╪█╪ с╨ ╪╫▄╒▌╨▄╨ ╪/╪█╪ или његов део, било дословни или са изменама и/или
▀р╒╥╒╘╒▌ ▌╨ ╘ру╙╪ °╒╫╪┌. (╛╘╨╥╘╒ ▀╨ ▌╨╘╨∙╒, ▀р╒╥▐╘ °╒ преведен на други језик. (Одавде па надаље, превод је
у┌∙уч╒▌ ╤╒╫ ▐╙р╨▌╪ч╒·╨ у ▀▐╙█╒╘у ╪╫р╨╫╨ ,,╪╫▄╒▌╨``.) ┴╥╨┌╪ укључен без ограничења у погледу израза ,,измена``.) Сваки
┌▐р╪с▌╪┌ █╪ц╒▌ц╒ °╒ ▐╫▌╨ч╒▌ ┌╨▐ ,,╥╪``. корисник лиценце је означен као ,,ви``.
┤ру╙╒ ╨┌т╪╥▌▐ст╪ ▐с╪▄ у▄▌▐╓╨╥╨·╨, р╨с▀▐╘╒█╒ ╪ ╪╫▄╒▌╒ ▌╪су Друге активности осим умножавања, расподеле и измене нису
▐╤ух╥╨√╒▌╒ ▐╥▐▄ █╪ц╒▌ц▐▄; ▐▌╒ су ╪╫╥╨▌ ·╒▌▐╙ ╘▐▄╒▌╨. ╟╪▌ обухваћене овом лиценцом; оне су изван њеног домена. Чин
▀▐┌р╒т╨·╨ ┐р▐╙р╨▄╨ ▌╪°╒ ▐╙р╨▌╪ч╒▌, ╨ ╘▐╤╪°╒▌╪ р╒╫у█т╨т покретања Програма није ограничен, а добијени резултат
╪╫╥рш╨╥╨·╨ ┐р▐╙р╨▄╨ °╒ ▐╤ух╥╨√╒▌ у с█уч╨°у ╘╨ с╒ ·╒╙▐╥ извршавања Програма је обухваћен у случају да се његов
с╨╘р╓╨° с╨ст▐°╪ ▐╘ ╘╒█╨ ╫╨с▌▐╥╨▌▐╙ ▌╨ ┐р▐╙р╨▄у (▌╒╫╨╥╪с▌▐ садржај састоји од дела заснованог на Програму (независно
▐╘ ч╪·╒▌╪ц╒ ╘╨ °╒ ▌╨ст╨▐ ┌╨▐ р╒╫у█т╨т ▀▐┌р╒т╨·╨ ┐р▐╙р╨▄╨). од чињенице да је настао као резултат покретања Програма).
╛╥▐ ▌╒▀▐ср╒╘▌▐ ╫╨╥╪с╪ ▐╘ т▐╙╨ шт╨ ┐р▐╙р╨▄ р╨╘╪. Ово непосредно зависи од тога шта Програм ради.
1. ▓╪ ▄▐╓╒т╒ у▄▌▐╓╨╥╨т╪ ╪ р╨с▀▐╘╒█╪т╪ ╘▐с█▐╥▌╒ ▀р╪▄╒р┌╒ 1. Ви можете умножавати и расподелити дословне примерке
╪╫╥▐р▌▐╙ ┌▐╘╨ ┐р▐╙р╨▄╨ ч╪▄ ╙╨ ▀р╪▄╪т╒, ▌╨ ╤╪█▐ ┌▐°╒▄ изворног кода Програма чим га примите, на било којем
▄╒╘╪°у▄у, у╫ ус█▐╥ ╘╨ ▌╨ ╨╘╒┌╥╨т╨▌ ╪ ▐╘╙▐╥╨р╨°у√╪ ▌╨ч╪▌ медијуму, уз услов да на адекватан и одговарајући начин
▐╫▌╨ч╪т╒ ▌╨ с╥╨┌▐▄ ▀р╪▄╒р┌у ▐╘╙▐╥╨р╨°у√╒ с╨▐▀шт╒·╒ ▐ означите на сваком примерку одговарајуће саопштење о
╨ут▐рс┌╪▄ ▀р╨╥╪▄╨ ╪ ▐╤°╨ш·╒·╒ ╙╨р╨▌ц╪°╒; с╨чу╥╨т╒ ауторским правима и објашњење гаранције; сачувате
▌╒╘╪р▌ут╪▄ с╨▐▀шт╒·╨ ┌▐°╨ с╒ ▀▐╫╪╥╨°у ▌╨ ▐╥у █╪ц╒▌цу ╪ недирнутим саопштења која се позивају на ову лиценцу и
▐╘суст╥▐ ╤╪█▐ ┌╨┌╥╒ ╙╨р╨▌ц╪°╒; ╪ с╥╪▄ ╘ру╙╪▄ ▀р╪▄╨▐ц╪▄╨ одсуство било какве гаранције; и свим другим примаоцима
┐р▐╙р╨▄╨ ╘╨т╒ ▀р╪▄╒р╨┌ ▐╥╒ █╪ц╒▌ц╒ ╫╨°╒╘▌▐ с╨ ┐р▐╙р╨▄▐▄. Програма дате примерак ове лиценце заједно са Програмом.
▓╪ ▄▐╓╒т╒ ▌╨▀█╨√╪╥╨т╪ ▌▐╥ч╨▌у ▌╨╘▐┌▌╨╘у ╫╨ ч╪▌ ф╪╫╪ч┌▐╙ Ви можете наплаћивати новчану надокнаду за чин физичког
▀р╒▌▐с╨ ▀р╪▄╒р┌╨, ╪ ▀▐ ╥╨ш╒▄ ╪╫╤▐ру ▄▐╓╒т╒ ▀▐▌у╘╪т╪ преноса примерка, и по вашем избору можете понудити
╫╨шт╪ту ╙╨р╨▌ц╪°▐▄ у ╫╨▄╒▌у ╫╨ ▌▐╥ч╨▌у ▌╨╘▐┌▌╨╘у. заштиту гаранцијом у замену за новчану надокнаду.
2. ▓╪ ▄▐╓╒т╒ ╪╫▄╒▌╪т╪ ╥╨ш ▀р╪▄╒р╨┌ ╪█╪ ▀р╪▄╒р┌╒ ┐р▐╙р╨▄╨ 2. Ви можете изменити ваш примерак или примерке Програма
╪█╪ ╤╪█▐ ┌▐╙ ·╒╙▐╥▐╙ ╘╒█╨, ▐╤р╨╫у°у√╪ ╘╒█▐ ╫╨с▌▐╥╨▌▐ ▌╨ или било ког његовог дела, образујући дело засновано на
┐р▐╙р╨▄у, ╪ у▄▌▐╓╨╥╨т╪ ╪ р╨с▀▐╘╒█╪т╪ т╨┌╥╒ ╪╫▄╒▌╒ ╪█╪ ╘╒█╨ Програму, и умножавати и расподелити такве измене или дела
▀▐╘ ╙▐р·╪▄ ▐╘р╒╘╤╨▄╨ ч█╨▌╨ 1, у╫ ус█▐╥ ╘╨ с╨▄╪ т╨┌▐Є╒ под горњим одредбама члана 1, уз услов да сами такође
╪с▀у▌╪т╒ с╥╨┌╪ ▐╘ с█╒╘╒√╪х ус█▐╥╨: испуните сваки од следећих услова:
╨) ▄▐р╨т╒ ▐с╪╙ур╨т╪ ╘╨ ╪╫▄╒·╒▌╒ ╘╨т▐т╒┌╒ ▌▐с╒ у▐ч∙╪╥╨ а) морате осигурати да измењене датотеке носе уочљива
▐╤╨╥╒шт╒·╨ ╘╨ ст╒ ╥╪ ╪╫▄╒▌╪█╪ ╘╨т▐т╒┌╒ ┌╨▐ ╪ ╘╨ту▄ обавештења да сте ви изменили датотеке као и датум
╤╪█▐ ┌╨┌╥╒ ╪╫▄╒▌╒; било какве измене;
╤) ▄▐р╨т╒ ▐с╪╙ур╨т╪ ╘╨ с╥╨┌▐ ╘╒█▐ ┌▐°╒ р╨с▀▐╘╒∙у°╒т╒ б) морате осигурати да свако дело које расподељујете
╪█╪ ╪╫╘╨°╒т╒, ╨ ┌▐°╒ у ц╒█╪▌╪ ╪█╪ ╘╒█▐▄ с╨╘р╓╪ ╪█╪ °╒ или издајете, а које у целини или делом садржи или је
╪╫╥╒╘╒▌▐ ╪╫ ┐р▐╙р╨▄╨ ╪█╪ ╤╪█▐ ┌▐╙ ·╒╙▐╥▐╙ ╘╒█╨, ╤у╘╒ изведено из Програма или било ког његовог дела, буде
█╪ц╒▌ц╪р╨▌▐ у ц╒█╪▌╪ ╤╒╫ ▌▐╥ч╨▌╒ ▌╨╘▐┌▌╨╘╒ с╥╪▄ тр╒√╪▄ лиценцирано у целини без новчане надокнаде свим трећим
█╪ц╪▄╨ ▀▐╘ ▐╘р╒╘╤╨▄╨ ▐╥╒ █╪ц╒▌ц╒; лицима под одредбама ове лиценце;
╥) ╨┌▐ ╪╫▄╒·╒▌╪ ▀р▐╙р╨▄ ч╪т╨ ┌▐▄╨▌╘╒ ╪▌т╒р╨┌т╪╥▌▐ ┌╨╘╨ в) ако измењени програм чита команде интерактивно када
°╒ ▀▐┌р╒▌ут, ╥╪ ▄▐р╨т╒ ▐с╪╙ур╨т╪ ╘╨, ┌╨╘╨ °╒ ▀▐┌р╒▌ут је покренут, ви морате осигурати да, када је покренут
у ц╪∙у т╨┌╥╒ ╪▌т╒р╨┌т╪╥▌╒ у▀▐тр╒╤╒ ▌╨ у▐╤╪ч╨°╒▌ ▌╨ч╪▌, у циљу такве интерактивне употребе на уобичајен начин,
╪с▀╪ш╒ ╪█╪ ▀р╪┌╨╓╒ ▐╤°╨╥у ┌▐°╨ у┌∙учу°╒ ▐╘╙▐╥╨р╨°у√╒ испише или прикаже објаву која укључује одговарајуће
с╨▐▀шт╒·╒ ▐ ╨ут▐рс┌╪▄ ▀р╨╥╪▄╨ ╪ с╨▐▀шт╒·╒ ╘╨ ▌╒ саопштење о ауторским правима и саопштење да не
▀▐ст▐°╪ ╙╨р╨▌ц╪°╨ (╪█╪ ╘╨ ╥╪ ╘╨°╒т╒ ╙╨р╨▌ц╪°у) ╘╨ постоји гаранција (или да ви дајете гаранцију) да
┌▐р╪с▌╪ц╪ ▄▐╙у р╨с▀▐╘╒█╪т╪ ▀р▐╙р╨▄ ▀▐╘ ▐╥╪▄ ус█▐╥╪▄╨, корисници могу расподелити програм под овим условима,
╪ ▐╤°╨ш·╒·╒ ┌▐р╪с▌╪┌у ┌╨┌▐ ╘╨ ▀р╪┌╨╓╒ ▀р╪▄╒р╨┌ ▐╥╒ и објашњење кориснику како да прикаже примерак ове
█╪ц╒▌ц╒. (╕╫у╫╒т╨┌: ╨┌▐ °╒ ┐р▐╙р╨▄ ╪▌т╒р╨┌т╪╥╨▌ ╨█╪ лиценце. (Изузетак: ако је Програм интерактиван али
▐╤╪ч▌▐ ▌╒ ╪с▀╪су°╒ т╨┌╥у ▐╤°╨╥у, ╥╨ш╒ ╘╒█▐ ╫╨с▌▐╥╨▌▐ обично не исписује такву објаву, ваше дело засновано
▌╨ ┐р▐╙р╨▄у ▌╒ ▄▐р╨ ╘╨ ╪с▀╪ш╒ ▐╤°╨╥у.) на Програму не мора да испише објаву.)
╛╥╪ ╫╨хт╒╥╪ с╒ ▐╘▌▐с╒ ▌╨ ╪╫▄╒·╒▌▐ ╘╒█▐ ┌╨▐ ц╒█╪▌у. ░┌▐ Ови захтеви се односе на измењено дело као целину. Ако
у▐ч∙╪╥╪ ╘╒█▐╥╪ т╨┌╥▐╙ ╘╒█╨ ▌╪су ╪╫╥╒╘╒▌╪ ╪╫ ┐р▐╙р╨▄╨, ▀╨ уочљиви делови таквог дела нису изведени из Програма, па
с╒ ▄▐╙у р╨╫у▄▌▐ сх╥╨т╪т╪ ┌╨▐ ▌╒╫╨╥╪с▌╨ ╪ ▐╘╥▐°╒▌╨ ╘╒█╨ ╫╨ се могу разумно схватити као независна и одвојена дела за
с╒╤╒, ▐▌╘╨ с╒ ▐╥╨ █╪ц╒▌ц╨ ╪ ·╒▌╒ ▐╘р╒╘╤╒ ▌╒ ▐╘▌▐с╒ ▌╨ т╒ себе, онда се ова лиценца и њене одредбе не односе на те
╘╒█▐╥╒ ┌╨╘╨ ╪х р╨с▀▐╘╒∙у°╒т╒ ┌╨▐ ▐╘╥▐°╒▌╨ ╘╒█╨. ░█╪ ┌╨╘╨ делове када их расподељујете као одвојена дела. Али када
р╨с▀▐╘╒∙у°╒т╒ ╪ст╒ ╘╒█▐╥╒ ┌╨▐ ╘╒▐ ц╒█╪▌╒ ┌▐°╨ °╒ ╘╒█▐ расподељујете исте делове као део целине која је дело
╫╨с▌▐╥╨▌▐ ▌╨ ┐р▐╙р╨▄у, р╨с▀▐╘╒█╨ ц╒█╪▌╒ ▄▐р╨ ╤╪т╪ ▀▐╘ засновано на Програму, расподела целине мора бити под
▐╘р╒╘╤╨▄╨ ▐╥╒ █╪ц╒▌ц╒, ч╪°╒ ╘▐╫╥▐█╒ ╫╨ ╘ру╙╒ ·╒▌╒ ▌▐с╪▐ц╒ одредбама ове лиценце, чије дозволе за друге њене носиоце
с╒ ▀р▐ш╪ру°у ▌╨ ц╒█╪▌у, ╨ с╨▄╪▄ т╪▄ ▌╨ с╥╨┌╪ ╘╒▐ ╤╒╫ се проширују на целину, а самим тим на сваки део без
▐╤╫╪р╨ ┌▐ ╙╨ °╒ ▌╨▀╪с╨▐. обзира ко га је написао.
╜╨▄╒р╨ ▐╥▐╙ ч█╨▌╨ ▌╪°╒ ╘╨ тр╨╓╪ ▀р╨╥╨ ╪█╪ ▐с▀▐р╪ ╥╨ш╨ Намера овог члана није да тражи права или оспори ваша
▀р╨╥╨ ▌╨ ╘╒█▐ ┌▐°╒ ст╒ у ц╒█╪▌╪ ▌╨▀╪с╨█╪; ▌╨▄╒р╨ °╒ права на дело које сте у целини написали; намера је
▀р╥╒▌ст╥╒▌▐ ╘╨ с╒ ус▀▐ст╨╥╪ ▀р╨╥▐ ▌╨ ┌▐▌тр▐█у р╨с▀▐╘╒█╒ првенствено да се успостави право на контролу расподеле
╪╫╥╒╘╒▌╪х ╪█╪ ┌▐█╒┌т╪╥▌╪х ╘╒█╨ ╫╨с▌▐╥╨▌╪х ▌╨ ┐р▐╙р╨▄у. изведених или колективних дела заснованих на Програму.
┴╨▄▐ ▀р╪┌∙уч╪╥╨·╒ ┐р▐╙р╨▄у (╪█╪ ╘╒█у ╫╨с▌▐╥╨▌▐▄ ▌╨ Само прикључивање Програму (или делу заснованом на
┐р▐╙р╨▄у) ╘ру╙▐╙ ╘╒█╨ ┌▐°╒ ▌╨ ·╒▄у ▌╪°╒ ╫╨с▌▐╥╨▌▐ ▌╨ Програму) другог дела које на њему није засновано на
°╒╘╪▌╪ц╪ ╫╨ с┌█╨╘╪шт╒·╒ ╪█╪ ▄╒╘╪°у▄у ╫╨ р╨с▀▐╘╒█у ▌╒ јединици за складиштење или медијуму за расподелу не
╘▐╥▐╘╪ ╘ру╙▐ ╘╒█▐ ▀▐╘ ▐┌╥╪р ▐╥╒ █╪ц╒▌ц╒. доводи друго дело под оквир ове лиценце.
3. ╝▐╓╒т╒ у▄▌▐╓╨╥╨т╪ ╪ р╨с▀▐╘╒█╪т╪ ┐р▐╙р╨▄ (╪█╪ ╘╒█▐ 3. Можете умножавати и расподелити Програм (или дело
╫╨с▌▐╥╨▌▐ ▌╨ ·╒▄у, ▀▐ ч█╨▌у 2) у ▐╤°╒┌т▌▐▄ ┌▐╘у ╪█╪ засновано на њему, по члану 2) у објектном коду или
╪╫╥рш▌▐▄ ▐╤█╪┌у ▀▐╘ ╙▐р·╪▄ ▐╘р╒╘╤╨▄╨ ч█╨▌▐╥╨ 1 ╪ 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, Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301 USA. Boston, MA 02110-1301 USA.
┬╨┌▐Є╒ ╘▐╘╨°т╒ ▐╤╨╥╒шт╒·╒ ┌╨┌▐ ╥╨▄ с╒ ▄▐╓╒ °╨╥╪т╪ ▀р╒┌▐ Такође додајте обавештење како вам се може јавити преко
╒█╒┌тр▐▌с┌╒ ╪ ▐╤╪ч▌╒ ▀▐шт╒. електронске и обичне поште.
░┌▐ °╒ ▀р▐╙р╨▄ ╪▌т╒р╨┌т╪╥╨▌, тр╒╤╨ ╘╨ ╪с▀╪су°╒ ┌р╨т┌▐ Ако је програм интерактиван, треба да исписује кратко
с╨▐▀шт╒·╒ с█╪ч▌▐ ▐╥▐▄ ▀р╪ ▀▐┌р╒т╨·у у ╪▌т╒р╨┌т╪╥▌▐▄ саопштење слично овом при покретању у интерактивном
р╒╓╪▄у: режиму:
│▌▐▄▐╥╪╫╪°╨ ╥╒р╫╪°╨ 69, ░ут▐рс┌╨ ▀р╨╥╨ (C) ╙▐╘╪▌╨ ╪▄╒ Гномовизија верзија 69, Ауторска права (C) година име
╨ут▐р╨ │▌▐▄▐╥╪╫╪°╨ с╒ ╪с▀▐ручу°╒ ▒╡╖ ╕║░║▓╡ │░└░╜╞╕и╡; аутора Гномовизија се испоручује БЕЗ ИКАКВЕ ГАРАНЦИЈЕ;
╫╨ ╘╒т╨∙╒ ▐т┌уц╨°т╒ `▀р╪┌╨╓╪ ╙'. ╛╥▐ °╒ с█▐╤▐╘▌╪ за детаље откуцајте `прикажи г'. Ово је слободни
с▐фт╥╒р, ╨ ╥╪ ст╒ ▀▐╫╥╨▌╪ ╘╨ ╙╨ р╨с▀▐╘╒█╪т╒ ▀▐╘ софтвер, а ви сте позвани да га расподелите под
╪╫╥╒с▌╪▄ ус█▐╥╪▄╨; ▐т┌уц╨°т╒ `▀р╪┌╨╓╪ у' ╫╨ ╘╒т╨∙╒. извесним условима; откуцајте `прикажи у' за детаље.
┼╪▀▐т╒т╪ч┌╒ ┌▐▄╨▌╘╒ `▀р╪┌╨╓╪ ╙' ╪ `▀р╪┌╨╓╪ у' ╤╪ тр╒╤╨█▐ Хипотетичке команде `прикажи г' и `прикажи у' би требало
╘╨ ▀р╪┌╨╓у ▐╘╙▐╥╨р╨°у√╒ ╘╒█▐╥╒ ╛▀шт╒ °╨╥▌╒ █╪ц╒▌ц╒. да прикажу одговарајуће делове Опште јавне лиценце.
╜╨р╨╥▌▐, ┌▐▄╨▌╘╒ ┌▐°╒ ╥╪ ┌▐р╪ст╪т╒ ▄▐╙у с╒ р╨╫█╪┌▐╥╨т╪ ▐╘ Наравно, команде које ви користите могу се разликовати од
`▀р╪┌╨╓╪ ╙' ╪ `▀р╪┌╨╓╪ у'; т▐ ч╨┌ ▄▐╙у ╤╪т╪ ╪ ┌█╪┌▐╥╪ `прикажи г' и `прикажи у'; то чак могу бити и кликови
▄╪ш╒▄ ╪█╪ ст╨╥┌╒ ▄╒▌╪°╨ ╪█╪ ▌╒шт▐ шт▐ ▌╨°╥╪ш╒ ▐╘╙▐╥╨р╨ мишем или ставке менија или нешто што највише одговара
╥╨ш╒▄ ▀р▐╙р╨▄у. вашем програму.
┬╨┌▐Є╒ ╤╪ тр╒╤╨█▐ ╘╨ ╫╨тр╨╓╪т╒ ▐╘ ╥╨ш╒╙ ▀▐с█▐╘╨╥ц╨ (╨┌▐ Такође би требало да затражите од вашег послодавца (ако
ст╒ ╫╨▀▐с█╒▌╪ ┌╨▐ ▀р▐╙р╨▄╒р) ╪█╪ ╥╨ш╒ ш┌▐█╒ (╨┌▐ ст╒ у сте запослени као програмер) или ваше школе (ако сте у
ш┌▐█╪) ╘╨ ▀▐т▀╪ш╒ ,,▐╤°╨ш·╒·╒ ╨ут▐рс┌╪х ▀р╨╥╨`` ╫╨ школи) да потпише ,,објашњење ауторских права`` за
▀р▐╙р╨▄, у с█уч╨°у ╘╨ °╒ т▐ ▀▐тр╒╤▌▐. ╜╨ ▀р╪▄╒р (╪╫▄╒▌╪т╒ програм, у случају да је то потребно. На пример (измените
╪▄╒▌╨): имена):
и▐°▐╘╪▌, ╘.╘., с╒ ▐╥╪▄ ▐╘р╪ч╒ с╥╪х ╨ут▐рс┌╪х ▀р╨╥╨ ╫╨ Јојодин, д.д., се овим одриче свих ауторских права за
▀р▐╙р╨▄ `│▌▐▄▐╥╪╫╪°╨' (┌▐°╪ ▀р▐█╨╫╪ ┌р▐╫ ▀р╒╥▐╘╪▐ц╒) програм `Гномовизија' (који пролази кроз преводиоце)
┌▐°╪ °╒ ▌╨▀╪с╨▐ ┐╒т╨р ┼╨┌╒р. који је написао Петар Хакер.
<▀▐т▀╪с ┬╨° ║у▌╨>, 1. ╨▀р╪█ 1989. <потпис Тај Куна>, 1. април 1989.
┬╨° ║у▌, ▀р╒╘с╒╘▌╪┌ ▀▐╘╨ Тај Кун, председник пода
╛╥╨ ▐▀шт╨ °╨╥▌╨ █╪ц╒▌ц╨ ▌╒ ╘▐╫╥▐∙╨╥╨ у┌∙уч╒·╒ ╥╨ш╒╙ Ова општа јавна лиценца не дозвољава укључење вашег
▀р▐╙р╨▄╨ у ▀р▐╙р╨▄╒ у ▀р╪╥╨т▌▐▄ ╥█╨с▌╪шт╥у. ░┌▐ °╒ ╥╨ш програма у програме у приватном власништву. Ако је ваш
▀р▐╙р╨▄ ╤╪╤█╪▐т╒┌╨ рут╪▌╨, ▄▐╓╒ ╥╨▄ ╤╪т╪ ┌▐р╪с▌╪°╒ ╘╨ програм библиотека рутина, може вам бити корисније да
╘▐╫╥▐█╪т╒ ▀▐╥╒╫╪╥╨·╒ ╥█╨с▌╪ч┌╪х ╨▀█╪┌╨ц╪°╨ с╨ ╤╪╤█╪▐т╒┌▐▄. дозволите повезивање власничких апликација са библиотеком.
░┌▐ °╒ т▐ ▐▌▐ шт▐ ╓╒█╪т╒, ┌▐р╪ст╪т╒ │╜├-▐╥у ╤╪╤█╪▐т╒ч┌у Ако је то оно што желите, користите ГНУ-ову библиотечку
▐▀шту °╨╥▌у █╪ц╒▌цу (**) у▄╒ст▐ ▐╥╒ █╪ц╒▌ц╒. општу јавну лиценцу (**) уместо ове лиценце.
╜╨▀▐▄╒▌╒ у т╒┌сту Напомене у тексту
(*) ║▐▌╨ч▌╨ ср▀с┌╨ ╥╒р╫╪°╨ │╜├-▐╥╒ ╛и╗ °╒ у▐╤█╪ч╒▌╨ 6. (*) Коначна српска верзија ГНУ-ове ОЈЛ је уобличена 6.
╨╥╙уст╨ 2001. ╙▐╘╪▌╒ у ▒╒▐╙р╨╘у, у╫ ▄╨·╒ ╪с▀р╨╥┌╒ 20. августа 2001. године у Београду, уз мање исправке 20.
с╒▀т╒▄╤р╨ 2002., 3. ╪ 16. ф╒╤ру╨р╨ 2003., 5. ╪ 10. септембра 2002., 3. и 16. фебруара 2003., 5. и 10.
▄╨°╨ 2003. ╪ 1. ╪ 6. с╒▀т╒▄╤р╨ 2003. маја 2003. и 1. и 6. септембра 2003.
(**) │╜├-▐╥╨ ╤╪╤█╪▐т╒ч┌╨ ▐▀шт╨ °╨╥▌╨ █╪ц╒▌ц╨ (▒╛и╗, ╒▌╙. (**) ГНУ-ова библиотечка општа јавна лиценца (БОЈЛ, енг.
LGPL/Library General Public License) с╒ с╨╘╨ ╫▐╥╒ LGPL/Library General Public License) се сада зове
│╜├-▐╥╨ ▄╨·╨ ▐▀шт╨ °╨╥▌╨ █╪ц╒▌ц╨ (╝╛и╗, ╒▌╙. ГНУ-ова мања општа јавна лиценца (МОЈЛ, енг.
LGPL/Lesser 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/>. <http://uliks.sourceforge.net/>.
[QueryBox] [QueryBox]
┐р▐╫▐р╪ у▀╪т╨ Прозори упита
├ ╘╪°╨█▐╫╪▄╨ у▀╪т╨ ▄▐╓╒т╒ ╘╨ ┌▐р╪ст╪т╒ т╨ст╒р╒ с╨ У дијалозима упита можете да користите тастере са
стр╒█╪ц╨▄╨ ╪█╪ ▀р╥▐ с█▐╥▐ ╘╨ ╤╪ст╒ ╪╫╨╤р╨█╪ ст╨╥┌у ╪█╪ стрелицама или прво слово да бисте изабрали ставку или
▄▐╓╒т╒ ╘╨ ▀р╪т╪с▌╒т╒ ╘у╙▄╒ ▄╪ш╨ ┌╨╘╨ с╒ ▀▐┌╨╫╪╥╨ч ▌╨█╨╫╪ можете да притиснете дугме миша када се показивач налази
╪╫▌╨╘ ╘у╙▄╒т╨ ▌╨ ╒┌р╨▌у. изнад дугмета на екрану.
[How to use help] [How to use help]
║╨┌▐ ┌▐р╪ст╪т╪ ▀▐▄▐√ Како користити помоћ
╝▐╓╒т╒ ╘╨ ┌▐р╪ст╪т╒ ┌урс▐рс┌╒ т╨ст╒р╒ ╘╨ ╤╪ст╒ с╒ ┌р╒т╨█╪ Можете да користите курсорске тастере да бисте се кретали
у ▐┌╥╪ру ▀р╒╙█╒╘╨ч╨ ▀▐▄▐√╪. ┐р╪т╪с▌╪т╒ стр╒█╪цу ▌╨╘▐█╒ у оквиру прегледача помоћи. Притисните стрелицу надоле
╘╨ ╤╪ст╒ с╒ ▀▐▄╒р╪█╪ ▌╨ с█╒╘╒√у ст╨╥┌у ╪█╪ ┌█╪╫╨█╪ ▌╨╘▐█╒. да бисте се померили на следећу ставку или клизали надоле.
┐р╪т╪с▌╪т╒ стр╒█╪цу ▌╨╙▐р╒ ╘╨ ╤╪ст╒ с╒ ▀▐▄╒р╪█╪ ▌╨ Притисните стрелицу нагоре да бисте се померили на
▀р╒тх▐╘▌у ст╨╥┌у ╪█╪ ┌█╪╫╨█╪ ▌╨╙▐р╒. ┐р╪т╪с▌╪т╒ стр╒█╪цу претходну ставку или клизали нагоре. Притисните стрелицу
▌╨╘╒с▌▐ ╘╨ ╤╪ст╒ ▀р╨т╪█╪ т╒┌у√у ╥╒╫у. ┐р╪т╪с▌╪т╒ надесно да бисте пратили текућу везу. Притисните
стр╒█╪цу ▌╨█╒╥▐ ╘╨ ╤╪ст╒ с╒ ╥р╨т╪█╪ у▌╨╫╨╘ у ▐┌╥╪ру стрелицу налево да бисте се вратили уназад у оквиру
╪ст▐р╪°╒ ▀▐с╒√╒▌╪х ч╥▐р▐╥╨. историје посећених чворова.
░┌▐ ╥╨ш т╒р▄╪▌╨█ ▌╒ ▀▐╘р╓╨╥╨ ┌урс▐рс┌╒ т╨ст╒р╒, ▄▐╓╒т╒ ╘╨ Ако ваш терминал не подржава курсорске тастере, можете да
┌▐р╪ст╪т╒ р╨╫▄╨┌▌╪цу ╘╨ ╤╪ст╒ ┌█╪╫╨█╪ у▌╨▀р╒╘ ╪ b користите размакницу да бисте клизали унапред и b
(█╨т╪▌╪ч▌▐ ╤) ╘╨ ╤╪ст╒ ┌█╪╫╨█╪ у▌╨╫╨╘. ║▐р╪ст╪т╒ т╨ст╒р (латинично б) да бисте клизали уназад. Користите тастер
TAB ╘╨ ╤╪ст╒ ▀р╒ш█╪ ▌╨ с█╒╘╒√у ст╨╥┌у ╨ ENTER ╘╨ TAB да бисте прешли на следећу ставку а ENTER да
╤╪ст╒ ▀р╨т╪█╪ т╒┌у√у ╥╒╫у. ┬╨ст╒р l (█╨т╪▌╪ч▌▐ █) с╒ бисте пратили текућу везу. Тастер l (латинично л) се
▄▐╓╒ ┌▐р╪ст╪т╪ ╫╨ ╥р╨√╨·╒ у▌╨╫╨╘ у ╪ст▐р╪°╪ ч╥▐р▐╥╨ ┌▐°╒ може користити за враћање уназад у историји чворова које
ст╒ ▀▐с╒т╪█╪. ┐р╪т╪с▌╪т╒ т╨ст╒р ESC ╘╨ ╤╪ст╒ ╪╫╨ш█╪ ╪╫ сте посетили. Притисните тастер ESC да бисте изашли из
▀р╒╙█╒╘╨ч╨ ▀▐▄▐√╪. прегледача помоћи.
┐р╪т╪с┌▐▄ ▌╨ █╒╥▐ ╘у╙▄╒ ▄╪ш╨ √╒т╒ ▀р╨т╪т╪ ╥╒╫у ╪█╪ Притиском на лево дугме миша ћете пратити везу или
┌█╪╫╨т╪. ┐р╪т╪с┌▐▄ ▌╨ ╘╒с▌▐ ╘у╙▄╒ ▄╪ш╨ √╒т╒ с╒ ╥р╨√╨т╪ клизати. Притиском на десно дугме миша ћете се враћати
у▌╨╫╨╘ у ╪ст▐р╪°╪ ч╥▐р▐╥╨. уназад у историји чворова.
┐▐т▀у▌ с▀╪с╨┌ т╨ст╒р╨ ▀р╒╙█╒╘╨ч╨ ▀▐▄▐√╪: Потпун списак тастера прегледача помоћи:
┤▐╫╥▐∙╒▌╒ су ▐▀шт╒ ▀р╒ч╪ц╒ ╫╨ ┌р╒т╨·╒General Movement Keys. Дозвољене су опште пречице за кретањеGeneral Movement Keys.
tab ┐▐▄╒р╪ с╒ ▌╨ с█╒╘╒√у ст╨╥┌у. tab Помери се на следећу ставку.
M-tab ┐▐▄╒р╪ с╒ ▌╨ ▀р╒тх▐╘▌у ст╨╥┌у. M-tab Помери се на претходну ставку.
╘▐█╒ ┐▐▄╒р╪ с╒ ▌╨ с█╒╘. ст╨╥┌у ╪█╪ ┌█╪╫╨° 1 р╒╘ ▌╨╘▐█╒. доле Помери се на след. ставку или клизај 1 ред надоле.
╙▐р╒ ┐▐▄╒р╪ с╒ ▌╨ ▀р╒т. ст╨╥┌у ╪█╪ ┌█╪╫╨° 1 р╒╘ ▌╨╙▐р╒. горе Помери се на прет. ставку или клизај 1 ред нагоре.
╘╒с▌▐ , enter ┐р╨т╪ т╒┌у√у ╥╒╫у. десно , enter Прати текућу везу.
█╒╥▐ , l ▓р╨т╪ с╒ у▌╨╫╨╘ у ╪ст▐р╪°╪ ▀▐с╒√╒▌╪х ч╥▐р▐╥╨. лево , l Врати се уназад у историји посећених чворова.
F1 ┐р╪┌╨╓╪ ▀▐▄▐√ ▐┌▐ ▀р╒╙█╒╘╨ч╨ ▀▐▄▐√╪. F1 Прикажи помоћ око прегледача помоћи.
n ╕╘╪ ▌╨ с█╒╘╒√╪ ч╥▐р. n Иди на следећи чвор.
p ╕╘╪ ▌╨ ▀р╒тх▐╘▌╪ ч╥▐р. p Иди на претходни чвор.
c ╕╘╪ ▌╨ ч╥▐р `с╨╘р╓╨°'. c Иди на чвор `садржај'.
F10 , esc ╕╫█╨╫ ╪╫ ▀р╒╙█╒╘╨ч╨ ▀▐▄▐√╪. F10 , esc Излаз из прегледача помоћи.
 
Local variables: Local variables:
fill-column: 58 fill-column: 58

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

@ -1,45 +1,45 @@
Ayudita: C-x t pone los archivos marcados 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 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 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-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: 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: Para introducir un carácter especial: C-q y el caracter.
Ayudita: Harto de mensajitos? Se quitan en el men· Opciones/Presentaciєn. 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: 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: Si no funcionan las teclas de función, ESC+mero sirve.
Ayudita: El web del Midnight Commander estс en http://www.midnight-commander.org/ 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: El sitio oficial del Midnight Commander es http://www.midnight-commander.org/
Ayudita: Comunique cualquier defecto a mc-devel@gnome.org Ayudita: Comunique cualquier defecto a mc-devel@gnome.org
Ayudita: El tabulador cambia de panel. 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: El Midnight Commander tiene manual: "man mc"
Ayudita: Desea navegar con las flechas al estilo lynx? Estс en Configuraciєn. 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: 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: 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: El formato del listado se puede personalizar; "man mc" para ver pistas.
Ayudita: %D/%T representa los archivos seleccionados en el panel opuesto. 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: Con C-o se puede ir y volver a la shell de siempre.
Ayudita: La variable CDPATH ahorra teclas al cambiar de directorios. 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 .* basta indicarlo en Configuración.
Ayudita: Para ver los archivos de seguridad tipo *~ ir a 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: 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: En terminales lentos la opción -s puede ayudar.
Ayudita: Puede "Llevar al panel" los resultados de "Buscar archivos" y usarlos. Ayudita: Puede "Llevar al panel" los resultados de "Buscar archivos" y usarlos.
Ayudita: Puede hacer y guardar b·squedas complejas con "squedas externas". Ayudita: Puede hacer y guardar búsquedas complejas con "squedas externas".
Ayudita: Con M-c cambiar de directorio es un poco mсs modo. Ayudita: Con M-c cambiar de directorio es un poco más modo.
Nota: Las instrucciones de la Shell no funcionan fuera del sistema local. Nota: Las instrucciones de la Shell no funcionan fuera del sistema local.
Ayudita: Con C-y puede recuperar texto eliminado. 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: 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: F4 puede usar cualquier editor que indiquemos en la variable EDITOR.
Ayudita: Se puede usar un visor externo indicado en la variable PAGER. 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: Para deshabilitar los mensajes de Confirmación vaya al menú Opciones.
Ayudita: Apunte los directorios y sitios mсs usados en "Favoritos". 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: 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: FTP está integrado en Midnight Commander, en "conexión por FTP..."
Ayudita: M-t permite cambiar rсpidamente entre varios modos de listado. 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 hacer un FTP no-anónimo: 'cd /#ftp:usuario@maquina.dominio'
Ayudita: Para examinar un archivo RPM basta pulsar <intro> sobre щl. Ayudita: Para examinar un archivo RPM basta pulsar <intro> sobre él.
Ayudita: Para copiar y pegar con ratєn mantener presionada la tecla MAYSCULAS. Ayudita: Para copiar y pegar con ratón mantener presionada la tecla MAYÚSCULAS.
Ayudita: Los ftp habituales se pueden guardar en "Favoritos". Ayudita: Los ftp habituales se pueden guardar en "Favoritos".

Просмотреть файл

@ -1,44 +1,44 @@
Tipp: A kijelЎlt fсjlnevek parancssorba valє mсsolсsa: C-x t 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: 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: 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: 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: 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: 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: 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: 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: 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: Hibabejelentéseket a következő címre lehet küldeni: mc-devel@gnome.org
Tipp: A Tab billenty√vel lehet panelt vсltani. Tipp: A Tab billentyűvel lehet panelt váltani.
Tipp: VFS-funkciє: egy Tar-fсjlon Entert nyomva megjelenik annak tartalma. Tipp: VFS-funkció: egy Tar-fájlon Entert nyomva megjelenik annak tartalma.
Tipp: A Midnight Commandernek van "man" (kщzikЎnyv) lapja is. 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: 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: 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: 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 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 %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 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: 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 .* 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: 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: 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: 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: 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: 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). 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. 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: 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: 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: 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 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: 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: 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: 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: 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: "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: 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: 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: 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: 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: 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: 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: A gyakran látogatott FTP-helyek betehetők a gyorslistába: C-\

Просмотреть файл

@ -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: stanco di questi messaggi? Disattivali dal menu Opzioni/Aspetto.
Dritta: selezione directory: inserisci uno slash alla fine della selezione. Dritta: selezione directory: inserisci uno slash alla fine della selezione.
Dritta: se al tuo terminale mancano i tasti funzione usa ESC+numero tasto. 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: la home page del Midnight Commander: http://www.midnight-commander.org/
Dritta: prego spedire i bug report a mc-devel@gnome.org Dritta: prego spedire i bug report a mc-devel@gnome.org
Dritta: tab cambia il pannello corrente. Dritta: tab cambia il pannello corrente.
Dritta: magico VFS; premi invio su un file tar per esaminarne il contenuto. 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: navigazione stile lynx? Impostala in finestra di configurazione.
Dritta: le macro % funzionano anche sulla linea di comando! Dritta: le macro % funzionano anche sulla linea di comando!
Dritta: M-! permette di eseguire programmi e vedere il risultato nel viewer. 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: %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: 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: se vuoi vedere i tuoi file .* impostalo nella Configurazione.
Dritta: vuoi vedere i tuoi *~ file di backup? 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: 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: trova file: puoi elaborare i file trovati usando il bottone Pannellizza.
Dritta: vuoi fare ricerche complesse? Usa il comando Pannellizza. Dritta: vuoi fare ricerche complesse? Usa il comando Pannellizza.
Dritta: per cambiare directory mentre batti un comando, usa M-c (cd rapido). 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: puoi disabilitare tutte le richieste di conferma in Opzioni/Conferme.
Dritta: salta nelle directory usate frequentemente in un colpo con C-\. Dritta: salta nelle directory usate frequentemente in un colpo con C-\.
Dritta: puoi fare FTP anonimo con mc battendo 'cd /#ftp:macchina.edu' 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: M-t cambia velocemente il modo listato.
Dritta: puoi dare il nome utente facendo ftp: 'cd /#ftp:utente@macchina.edu' 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. Dritta: puoi navigare attraverso i file RPM battendo invio su di essi.

Просмотреть файл

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

Просмотреть файл

@ -1,44 +1,44 @@
є╧╫┼╘: щ╙╨╧╠╪┌╒╩╘┼ C-x t ─╠╤ ╦╧╨╔╥╧╫┴╬╔╤ ╨╧═┼▐┼╬╬┘╚ ╞┴╩╠╧╫ ╫ ╦╧═┴╬─╬╒└ ╙╘╥╧╦╒. Совет: Используйте C-x t для копирования помеченных файлов в командную строку.
є╧╫┼╘: щ╙╨╧╠╪┌╒╩╘┼ C-x p ─╠╤ ╦╧╨╔╥╧╫┴╬╔╤ ╘┼╦╒▌┼╟╧ ╨╒╘╔ ╫ ╦╧═┴╬─╬╒└ ╙╘╥╧╦╒. Совет: Используйте C-x p для копирования текущего пути в командную строку.
є╧╫┼╘: с╫╘╧─╧╨╧╠╬┼╬╔┼: M-Tab (╔╠╔ Esc+Tab). ф╠╤ ╨╧╠╒▐┼╬╔╤ ╙╨╔╙╦┴ ╬┴╓┴╘╪ ─╫┴╓─┘. Совет: Автодополнение: M-Tab (или Esc+Tab). Для получения списка нажать дважды.
є╧╫┼╘: щ╙╨╧╠╪┌╒╩╘┼ M-p ╔ M-n ─╠╤ ─╧╙╘╒╨┴ ╦ ╔╙╘╧╥╔╔ ╦╧═┴╬─. Совет: Используйте M-p и M-n для доступа к истории команд.
є╧╫┼╘: Ї╥┼┬╒┼╘╙╤ ╫╙╘┴╫╔╘╪ ╠╔╘┼╥┴╠? ю┴╓═╔╘┼ Control-q ╔ ╠╔╘┼╥┴╠. Совет: Требуется вставить литерал? Нажмите Control-q и литерал.
є╧╫┼╘: ї╙╘┴╠╔ ╧╘ ▄╘╔╚ ╙╧╧┬▌┼╬╔╩? я╘╦╠└▐╔╘┼ ╔╚ ╫ ═┼╬└ ю┴╙╘╥╧╩╦╔/ў╬┼█╬╔╩ ╫╔─. Совет: Устали от этих сообщений? Отключите их в меню Настройки/Внешний вид.
є╧╫┼╘: я╘═┼╘╦┴ ╦┴╘┴╠╧╟╧╫: ─╧┬┴╫╪╘┼ ╦╧╙╒└ ▐┼╥╘╒ ╫ ╦╧╬┼├ ╙╧╧╘╫┼╘╙╘╫╒└▌┼╟╧ █┴┬╠╧╬┴. Совет: Отметка каталогов: добавьте косую черту в конец соответствующего шаблона.
є╧╫┼╘: х╙╠╔ ╫┴█ ╘┼╥═╔╬┴╠ ┬┼┌ ╞╒╬╦├. ╦╠┴╫╔█, ╫┴═ ╨╧═╧╓┼╘ ESC + ├╔╞╥┴. Совет: Если ваш терминал без функц. клавиш, вам поможет ESC + цифра.
є╧╫┼╘: ф╧═┴█╬╤╤ ╙╘╥┴╬╔├┴ Midnight Commander: http://www.midnight-commander.org/ Совет: Домашняя страница Midnight Commander: http://www.midnight-commander.org/
є╧╫┼╘: Ё╧╓┴╠╒╩╙╘┴, █╠╔╘┼ ╠└┬┘┼ ╙╧╧┬▌┼╬╔╤ ╧┬ ╧█╔┬╦┴╚ ╬┴ mc-devel@gnome.org Совет: Пожалуйста, шлите любые сообщения об ошибках на mc-devel@gnome.org
є╧╫┼╘: Tab ╙═┼╬╤┼╘ ╘┼╦╒▌╒└ ╨┴╬┼╠╪. Совет: Tab сменяет текущую панель.
є╧╫┼╘: ї─╧┬╙╘╫╧ ўцє: ╬┴╓┴╘╪ Enter ╬┴ ╞┴╩╠┼ TAR ─╠╤ ╨╧╠╒▐┼╬╔╤ ┼╟╧ ╙╧─┼╥╓╔═╧╟╧. Совет: Удобство ВФС: нажать Enter на файле TAR для получения его содержимого.
є╧╫┼╘: ї ╬┴╙ ╘┴╦╓┼ ╔═┼┼╘╙╤ ╘╧╠╦╧╫┴╤ ╙╘╥┴╬╔├┴ ╥╒╦╧╫╧─╙╘╫┴. Совет: У нас также имеется толковая страница руководства.
є╧╫┼╘: ў┘ ╚╧╘╔╘┼ ╬┴╫╔╟┴├╔└ ╫ ╙╘╔╠┼ lynx? ї╙╘┴╬╧╫╔╘┼ ▄╘╧ ╫ ─╔┴╠╧╟┼ ы╧╬╞╔╟╒╥┴├╔╤. Совет: Вы хотите навигацию в стиле lynx? Установите это в диалоге Конфигурация.
є╧╫┼╘: э┴╦╥╧╙┘ % ╥┴┬╧╘┴└╘ ─┴╓┼ ╫ ╦╧═┴╬─╬╧╩ ╙╘╥╧╦┼. Совет: Макросы % работают даже в командной строке.
є╧╫┼╘: M-! ╨╧┌╫╧╠╔╘ ╫┴═ ╫┘╨╧╠╬╤╘╪ ╨╥╧╟╥┴══┘ ╔ ╫╔─┼╘╪ ╫┘╫╧─ ╫ ╨╥╧╙═╧╘╥▌╔╦┼. Совет: M-! позволит вам выполнять программы и видеть вывод в просмотрщике.
є╧╫┼╘: ц╧╥═┴╘ ╙╨╔╙╦┴ ╞┴╩╠╧╫ ═╧╓┼╘ ┬┘╘╪ ╔┌═┼╬┼╬; ╬┴┬┼╥╔╘┼ "man mc" ─╠╤ ─┼╘┴╠┼╩. Совет: Формат списка файлов может быть изменен; наберите "man mc" для деталей.
є╧╫┼╘: %D/%T expands to the tagged files in the opposite directory. Совет: %D/%T expands to the tagged files in the opposite directory.
є╧╫┼╘: ш╧╘╔╘┼ ╨╥╧╙╘╒└ ╧┬╧╠╧▐╦╒? ю┴╓═╔╘┼ C-o, ╔ ╙╬╧╫┴ C-o ─╠╤ ╫╧┌╫╥┴╘┴ ╫ эє. Совет: Хотите простую оболочку? Нажмите C-o, и снова C-o для возврата в МС.
є╧╫┼╘: ї╙╘┴╬╧╫╔╫ ╨┼╥┼═┼╬╬╒└ CDPATH, ╫┘ ╙┬┼╥┼╓┼╘┼ ╒╙╔╠╔╤ ╨╥╔ ╬┴┬╧╥┼ ╦╧═┴╬─┘ cd. Совет: Установив переменную CDPATH, вы сбережете усилия при наборе команды cd.
є╧╫┼╘: ў┘ ╙═╧╓┼╘┼ ╫╔─┼╘╪ ╙╦╥┘╘┘┼ ╞┴╩╠┘ .*, ╒╙╘┴╬╧╫╔╫ ╧╨├╔└ ╫ ═┼╬└ ы╧╬╞╔╟╒╥┴├╔╤. Совет: Вы сможете видеть скрытые файлы .*, установив опцию в меню Конфигурация.
є╧╫┼╘: ш╧╘╔╘┼ ╫╔─┼╘╪ ╥┼┌┼╥╫╬┘┼ ╞┴╩╠┘ .~ - ╒╙╘┴╬╧╫╔╘┼ ╧╨├╔└ ╫ ═┼╬└ ы╧╬╞╔╟╒╥┴├╔╤. Совет: Хотите видеть резервные файлы .~ - установите опцию в меню Конфигурация.
є╧╫┼╘: с╫╘╧─╧╨╧╠╬┼╬╔┼ ╥┴┬╧╘┴┼╘ ╫╧ ╫╙┼╚ ╙╘╥╧╦┴╚ ╫╫╧─┴. Ё╥╧╙╘╧ ╬┴╓═╔╘┼ M-Tab. Совет: Автодополнение работает во всех строках ввода. Просто нажмите M-Tab.
є╧╫┼╘: ю┴ ═┼─╠┼╬╬┘╚ ╘┼╥═╔╬┴╠┴╚ ═╧╓┼╘ ╨╧═╧▐╪ ╞╠┴╟ -s. Совет: На медленных терминалах может помочь флаг -s.
є╧╫┼╘: Ё╧╔╙╦ ╞┴╩╠┴: ╫┘ ═╧╓┼╘┼ ╥┴┬╧╘┴╘╪ ╙ ╬┴╩─┼╬╬┘═╔ ╞┴╩╠┴═╔ ╨╥╔ Ё┴╬┼╠╔┌┴├╔╔. Совет: Поиск файла: вы можете работать с найденными файлами при Панелизации.
є╧╫┼╘: Want to do complex searches? Use the External Panelize command. Совет: Want to do complex searches? Use the External Panelize command.
є╧╫┼╘: ф╠╤ ╙═┼╬┘ ╦┴╘┴╠╧╟┴ ╫╧ ╫╥┼═╤ ╬┴┬╧╥┴ ╦╧═┴╬─┘, ╬┴╓═╔╘┼ M-c (┬┘╙╘╥┴╤ ╙═┼╬┴). Совет: Для смены каталога во время набора команды, нажмите M-c (быстрая смена).
·┴═┼╘╦┴: ы╧═┴╬─┘ ╧┬╧╠╧▐╦╔ ╬┼ ╫┘╨╧╠╬╤└╘╙╤, ┼╙╠╔ ╫┘ ╬┼ ╫ ╠╧╦┴╠╪╬╧╩ ╞┴╩╠. ╙╔╙╘┼═┼. Заметка: Команды оболочки не выполняются, если вы не в локальной файл. системе.
є╧╫┼╘: ї─┴╠┼╬╬┘╩ ╘┼╦╙╘ ═╧╓╬╧ ╫┼╥╬╒╘╪ ╙ ╨╧═╧▌╪└ C-y. Совет: Удаленный текст можно вернуть с помощью C-y.
є╧╫┼╘: ю┼╦╧╘╧╥┘┼ ╦╠┴╫╔█╔ ╬┼ ╥┴┬╧╘┴└╘? ·┴╩─╔╘┼ ╫ ю┴╙╘╥╧╩╦╔/Є┴╙╨╧┌╬┴╫┴╬╔┼ ╦╠┴╫╔█. Совет: Некоторые клавиши не работают? Зайдите в Настройки/Распознавание клавиш.
є╧╫┼╘: ф╠╤ ╨╧╠╒▐┼╬╔╤ ╫┘╫╧─┴ ╦╧═┴╬─┘ ╫ ╧╦╬┼ ╨╥╧╙═╧╘╥┴, ╬┴┬┼╥╔╘┼ M-! Совет: Для получения вывода команды в окне просмотра, наберите M-!
є╧╫┼╘: F13 (╔╠╔ Shift-F3) ╫┘┌┘╫┴└╘ ╨╥╧╙═╧╘╥▌╔╦ ╫ ╥┼╓╔═┼ ╬┼╧┬╥┴┬╧╘┴╬╬┘╚ ─┴╬╬┘╚. Совет: F13 (или Shift-F3) вызывают просмотрщик в режиме необработанных данных.
є╧╫┼╘: ў┘ ═╧╓┼╘┼ ╫┘┬╥┴╘╪ ╥┼─┴╦╘╧╥ ─╠╤ F4 ╙ ╨╧═╧▌╪└ ╨┼╥┼═┼╬╬╧╩ ╧┬╧╠╧▐╦╔ EDITOR. Совет: Вы можете выбрать редактор для F4 с помощью переменной оболочки EDITOR.
є╧╫┼╘: ў╬┼█╬╔╩ ╨╥╧╙═╧╘╥▌╔╦ ═╧╓╬╧ ╫┘┬╥┴╘╪ ╙ ╨╧═╧▌╪└ ╨┼╥┼═┼╬╬╧╩ ╧┬╧╠╧▐╦╔ PAGER. Совет: Внешний просмотрщик можно выбрать с помощью переменной оболочки PAGER.
є╧╫┼╘: ў┘ ═╧╓┼╘┼ ╧╘═┼╬╔╘╪ ┌┴╨╥╧╙┘ ╬┴ ╨╧─╘╫┼╥╓─┼╬╔┼ ╫ ю┴╙╘╥╧╩╦╔/Ё╧─╘╫┼╥╓─┼╬╔┼. Совет: Вы можете отменить запросы на подтверждение в Настройки/Подтверждение.
є╧╫┼╘: Ё┼╥┼╚╧─╔╘┼ ╦ ▐┴╙╘╧ ╔╙╨╧╠╪┌╒┼═┘═ ╦┴╘┴╠╧╟┴═ ╔┌ ╙╨╥┴╫╧▐╬╔╦┴, ╬┴┬╥┴╫ C-\. Совет: Переходите к часто используемым каталогам из справочника, набрав C-\.
є╧╫┼╘: ў┘ ═╧╓┼╘┼ ╔╙╨╧╠╪┌╧╫┴╘╪ ┴╬╧╬╔═╬┘╩ FTP ╙ mc ╬┴┬╥┴╫ 'cd /#ftp:machine.edu' Совет: Вы можете использовать анонимный FTP с mc набрав 'cd /#ftp:machine.edu'
є╧╫┼╘: FTP ╫╙╘╥╧┼╬ ╫ Midnight Commander, ═┼╬└ Ё┴╬┼╠╪/FTP-╙╧┼─╔╬┼╬╔┼. Совет: FTP встроен в Midnight Commander, меню Панель/FTP-соединение.
є╧╫┼╘: M-t ┬┘╙╘╥╧ ╔┌═┼╬╤┼╘ ╞╧╥═┴╘ ╙╨╔╙╦┴ ╨┴╬┼╠╔. Совет: M-t быстро изменяет формат списка панели.
є╧╫┼╘: ў┘ ═╧╓┼╘┼ ┌┴─┴╘╪ ╔═╤ ╨╧╠╪┌╧╫┴╘┼╠╤ ╫ ╦╧═┴╬─┼: 'cd /#ftp:user@machine.edu'. Совет: Вы можете задать имя пользователя в команде: 'cd /#ftp:user@machine.edu'.
є╧╫┼╘: ў┘ ═╧╓┼╘┼ ╨╥╧╙═┴╘╥╔╫┴╘╪ ╞┴╩╠┘ RPM ╬┴╓┴╫ Enter ╬┴ ╞┴╩╠┼ RPM. Совет: Вы можете просматривать файлы RPM нажав Enter на файле RPM.
є╧╫┼╘: ф╠╤ ╧╘═┼╘╦╔ ╦┴╘┴╠╧╟╧╫ ╫ ─╔┴╠╧╟┼ ╫┘┬╧╥┴, ─╧┬┴╫╪╘┼ ╦╧╙╒└ ▐┼╥╘╒. Совет: Для отметки каталогов в диалоге выбора, добавьте косую черту.
є╧╫┼╘: ў┘╥┼┌┴╬╔┼ ╔ ╫╙╘┴╫╦┴ ╙ ╨╧═╧▌╪└ ═┘█╔ ═╧╓┼╘ ╘╥┼┬╧╫┴╘╪ ─┼╥╓┴╘╪ ╦╠┴╫╔█╒ Shift. Совет: Вырезание и вставка с помощью мыши может требовать держать клавишу Shift.
є╧╫┼╘: ш╥┴╬╔╘┼ ╙╨╔╙╧╦ ▐┴╙╘╧ ╨╧╙┼▌┴┼═┘╚ FTP ╫ ╙╨╥┴╫╧▐╬╔╦┼ ╦┴╘┴╠╧╟╧╫: ╬┴╓═╔╘┼ C-\. Совет: Храните список часто посещаемых FTP в справочнике каталогов: нажмите C-\.

Просмотреть файл

@ -1,44 +1,44 @@
┴╨╥╒т: ║▐р╪ст╪т╒ C-x t ╘╨ ╤╪ст╒ ▀р╒▌╒█╪ ╪╫╨╤р╨▌╒ ▌╨╫╪╥╒ ╘╨т▐т╒┌╨ у ▌╨р╒╘╤╒▌╪ р╒╘. Савет: Користите C-x t да бисте пренели изабране називе датотека у наредбени ред.
┴╨╥╒т: ║▐р╪ст╪т╒ C-x p ╘╨ ╤╪ст╒ ▀р╒▌╒█╪ т╒┌у√у ▀ут╨·у у ▌╨р╒╘╤╒▌╪ р╒╘. Савет: Користите C-x p да бисте пренели текућу путању у наредбени ред.
┴╨╥╒т: ┤▐▀у▌╨: ┌▐р╪ст╪т╒ M-Tab (╪█╪ Esc+Tab). ┐р╪т╪с▌╪т╒ ▐╥▐ ╘╥╨▀ут ╘╨ ╤╪ст╒ ╘▐╤╪█╪ с▀╪с╨┌. Савет: Допуна: користите M-Tab (или Esc+Tab). Притисните ово двапут да бисте добили списак.
┴╨╥╒т: ║▐р╪ст╪т╒ M-p ╪ M-n ╘╨ ╤╪ст╒ ╘▐╤╪█╪ ╪ст▐р╪°у ▌╨р╒╘╤╪. Савет: Користите M-p и M-n да бисте добили историју наредби.
┴╨╥╒т: ┼▐√╒т╒ ╘╨ ▌╨╥╒╘╒т╒ ╫▌╨┌? ║▐р╪ст╪т╒ Control-q ╪ ╘▐т╪ч▌╪ ╫▌╨┌. Савет: Хоћете да наведете знак? Користите Control-q и дотични знак.
┴╨╥╒т: ┴╪т╪ ст╒ ▐╥╪х ▀▐ру┌╨? ╕с┌∙уч╪т╒ ╪х ╪╫ ▄╒▌╪°╨ ╕╫╤▐р╪/┐▐╙█╒╘. Савет: Сити сте ових порука? Искључите их из менија Избори/Поглед.
┴╨╥╒т: ╛╫▌╨ч╨╥╨·╒ ╘╪р╒┌т▐р╪°у▄╨: ╘▐╘╨°т╒ ┌▐су црту ▌╨ ┌р╨° ▐╤р╨сц╨ ╫╨ ▀р╒тр╨╙у. Савет: Означавање директоријума: додајте косу црту на крај обрасца за претрагу.
┴╨╥╒т: ░┌▐ ╥╨ш т╒р▄╪▌╨█ ▌╒ ▀▐с╒╘у°╒ фу▌┌ц╪°с┌╒ т╨ст╒р╒, ┌▐р╪ст╪т╒ ┌▐▄╤╪▌╨ц╪°у ESC+╤р▐°. Савет: Ако ваш терминал не поседује функцијске тастере, користите комбинацију ESC+број.
┴╨╥╒т: ┤▐▄╨√╨ стр╨▌╪ц╨ │╜├-▐╥▐╙ ┐▐▌▐√▌▐╙ ▌╨р╒╘▌╪┌╨: http://www.midnight-commander.org/ Савет: Домаћа страница ГНУ-овог Поноћног наредника: http://www.midnight-commander.org/
┴╨╥╒т: ╝▐█╪▄▐ ╘╨ ▀▐ш╨∙╒т╒ ▀р╪°╨╥╒ ╙р╒ш╨┌╨ ▌╨ mc-devel@gnome.org Савет: Молимо да пошаљете пријаве грешака на mc-devel@gnome.org
┴╨╥╒т: ┬╨ст╒р `Tab' ▄╒·╨ т╒┌у√╒ ▐┌▌▐. Савет: Тастер `Tab' мења текуће окно.
┴╨╥╒т: ─╨╫▐▌ ▓┴┤-╨: ┌уц▌╪т╒ `enter' ▌╨╘ ╘╨т▐т╒┌▐▄ ╥рст╒ tar ╘╨ ╤╪ст╒ ▀р╒╙█╒╘╨█╪ ·╒▌ с╨╘р╓╨°. Савет: Фазон ВСД-а: куцните `enter' над датотеком врсте tar да бисте прегледали њен садржај.
┴╨╥╒т: ╕▄╨▄▐ ╪ ▀р╪ст▐°▌у стр╨▌╪цу у▀утст╥╨. Савет: Имамо и пристојну страницу упутства.
┴╨╥╒т: ╢╒█╪т╒ █╪ lynx-▐█╪┌▐ ┌р╒т╨·╒? ┐▐╘╒с╪т╒ ╙╨ у ╘╪°╨█▐╙у ┐▐╘╒ш╨╥╨·╨. Савет: Желите ли lynx-олико кретање? Подесите га у дијалогу Подешавања.
┴╨╥╒т: ╝╨┌р▐╪ `%' фу▌┌ц╪▐▌╪шу ч╨┌ ╪ у ▌╨р╒╘╤╒▌▐▄ р╒╘у. Савет: Макрои `%' функционишу чак и у наредбеном реду.
┴╨╥╒т: M-! √╒ ╥╨▄ ▐▄▐╙у√╪т╪ ╘╨ ╪╫╥рш╨╥╨т╒ ▀р▐╙р╨▄╒ ╪ ▀р╒╙█╒╘╨т╒ ╪╫█╨╫ у ▀р╒╙█╒╘╨чу. Савет: M-! ће вам омогућити да извршавате програме и прегледате излаз у прегледачу.
┴╨╥╒т: ─▐р▄╨т с▀╪с┌╨ ╘╨т▐т╒┌╨ с╒ ▄▐╓╒ ▀▐╘╒с╪т╪; ╪╫╥рш╪т╒ `man mc' ╫╨ ╘╒т╨∙╒. Савет: Формат списка датотека се може подесити; извршите `man mc' за детаље.
┴╨╥╒т: %D/%T с╒ ╫╨▄╒·у°╒ с▀╪с┌▐▄ ▐╫▌╨ч╒▌╪х ╘╨т▐т╒┌╨ у су▀р▐т▌▐▄ ╘╪р╒┌т▐р╪°у▄у. Савет: %D/%T се замењује списком означених датотека у супротном директоријуму.
┴╨╥╒т: ╢╒█╪т╒ █╪ ╥╨шу ▐╤╪ч▌у ∙ус┌у? ┐р╪т╪с▌╪т╒ C-o, ╨ ╥р╨т╪т╒ с╒ ▌╨╫╨╘ ▐▀╒т ▀р╒┌▐ C-o. Савет: Желите ли вашу обичну љуску? Притисните C-o, а вратите се назад опет преко C-o.
┴╨╥╒т: ┐▐ст╨╥∙╨·╒ ▀р▐▄╒▌∙╪╥╒ CDPATH ╥╨▄ ▄▐╓╒ ушт╒╘╒т╪ ┌уц╨·╒ у ▌╨р╒╘╤╨▄╨ `cd'. Савет: Постављање променљиве CDPATH вам може уштедети куцање у наредбама `cd'.
┴╨╥╒т: ░┌▐ ╓╒█╪т╒ ╘╨ ╥╪╘╪т╒ ╥╨ш╒ ╘╨т▐т╒┌╒ ╥рст╒ `.*', р╒ц╪т╒ т▐ у ╘╪°╨█▐╙у `┐▐╘╒ш╨╥╨·╒'. Савет: Ако желите да видите ваше датотеке врсте `.*', реците то у дијалогу `Подешавање'.
┴╨╥╒т: ╢╒█╪т╒ █╪ ╘╨ ╥╪╘╪т╒ ╥╨ш╒ р╒╫╒р╥▌╒ ╘╨т▐т╒┌╒ (*~)? ┐▐ст╨╥╪т╒ ▐╥▐ у ╘╪°╨█▐╙у `┐▐╘╒ш╨╥╨·╒'. Савет: Желите ли да видите ваше резервне датотеке (*~)? Поставите ово у дијалогу `Подешавање'.
┴╨╥╒т: ┤▐▀у▌╨ фу▌┌ц╪▐▌╪ш╒ у с╥╪▄ р╒╘▐╥╪▄╨ ╫╨ у▌▐с у с╥╪▄ ╘╪°╨█▐╫╪▄╨. ┴╨▄▐ ▀р╪т╪с▌╪т╒ M-Tab. Савет: Допуна функционише у свим редовима за унос у свим дијалозима. Само притисните M-Tab.
┴╨╥╒т: ▌╨ с▀▐р╪▄ т╒р▄╪▌╨█╪▄╨ ▄▐╓╒ ╥╨▄ ▀▐▄▐√╪ ▀р╒┌╪╘╨ч -s. Савет: на спорим терминалима може вам помоћи прекидач -s.
┴╨╥╒т: ┬р╨╓╒·╒ ╘╨т▐т╒┌╨: ▄▐╓╒т╒ р╨╘╪т╪ с╨ ▌╨Є╒▌╪▄ ╘╨т▐т╒┌╨▄╨ ▀р╒┌▐ ╘у╙▄╒т╨ `┐р╒т╥▐р╪ у ▐┌▌▐'. Савет: Тражење датотека: можете радити са нађеним датотекама преко дугмета `Претвори у окно'.
┴╨╥╒т: ╢╒█╪т╒ █╪ с█▐╓╒▌╒ ▀р╒тр╨╙╒? ║▐р╪ст╪т╒ ▌╨р╒╘╤у `║р╪т╒р╪°у▄ ▀▐▀у▌╒ ▐┌▌╨'. Савет: Желите ли сложене претраге? Користите наредбу `Критеријум попуне окна'.
┴╨╥╒т: ┤╨ ╤╪ст╒ ▀р▐▄╒▌╪█╪ ╘╪р╒┌т▐р╪°у▄ у ср╒╘ ┌уц╨·╨ ▌╨р╒╘╤╒, ┌▐р╪ст╪т╒ M-c (╤р╫╨ ▀р▐▄.╘╪р.). Савет: Да бисте променили директоријум у сред куцања наредбе, користите M-c (брза пром.дир.).
┐╨╓·╨: ╜╨р╒╘╤╒ ∙ус┌╒ ▌╒√╒ фу▌┌ц╪▐▌╪с╨т╪ ▌╨ ▌╒-█▐┌╨█▌▐▄ с╪ст╒▄у ╘╨т▐т╒┌╨. Пажња: Наредбе љуске неће функционисати на не-локалном систему датотека.
┴╨╥╒т: ▓╨с┌рс▌╪т╒ т╒┌ст ▀р╒┌▐ C-y. Савет: Васкрсните текст преко C-y.
┴╨╥╒т: ╜╒┌╪ ▐╘ ╥╨ш╪х т╨ст╒р╨ ▌╒ фу▌┌ц╪▐▌╪шу? ┐▐╙█╒╘╨°т╒ ╕╫╤▐р╪/╜╨уч╪ т╨ст╒р╒. Савет: Неки од ваших тастера не функционишу? Погледајте Избори/Научи тастере.
┴╨╥╒т: ┤╨ ╤╪ст╒ ▀▐╙█╒╘╨█╪ ╪╫█╨╫ ▌╨р╒╘╤╒ у ▀р╒╙█╒╘╨чу, ┌▐р╪ст╪т╒ M-! Савет: Да бисте погледали излаз наредбе у прегледачу, користите M-!
┴╨╥╒т: F13 (╪█╪ Shift-F3) ▀▐┌р╒√╒ ▀р╒╙█╒╘╨ч у с╪р▐╥▐▄ р╒╓╪▄у. Савет: F13 (или Shift-F3) покреће прегледач у сировом режиму.
┴╨╥╒т: ╝▐╓╒т╒ ╫╨╘╨т╪ ур╒Є╪╥╨ч ╫╨ F4 ▀р╒┌▐ ▀р▐▄╒▌∙╪╥╒ ∙ус┌╒ EDITOR. Савет: Можете задати уређивач за F4 преко променљиве љуске EDITOR.
┴╨╥╒т: ╝▐╓╒т╒ ╫╨╘╨т╪ с▀▐∙╨ш·╪ ур╒Є╪╥╨ч ▀р╒┌▐ ▀р▐▄╒▌∙╪╥╒ ∙ус┌╒ PAGER. Савет: Можете задати спољашњи уређивач преко променљиве љуске PAGER.
┴╨╥╒т: ╝▐╓╒т╒ ╪с┌∙уч╪т╪ с╥╒ ╫╨хт╒╥╒ ╫╨ ▀▐т╥р╘у ▀р╒┌▐ ст╨╥┌╒ ╕╫╤▐р╪/┐▐т╥р╘╨. Савет: Можете искључити све захтеве за потврду преко ставке Избори/Потврда.
┴╨╥╒т: ┴┌▐ч╪т╒ ▌╨ ч╒ст▐ ┌▐р╪ш√╒▌╒ ╘╪р╒┌т▐р╪°у▄╒ °╒╘▌╪▄ ┌▐р╨┌▐▄ ▀р╒┌▐ C-\. Савет: Скочите на често коришћене директоријуме једним кораком преко C-\.
┴╨╥╒т: ╝▐╓╒т╒ с╒ ╨▌▐▌╪▄▌▐ ▀р╪°╨╥╪т╪ ▌╨ FTP ┌уц╨°у√╪ `cd /#ftp:machine.edu' Савет: Можете се анонимно пријавити на FTP куцајући `cd /#ftp:machine.edu'
┴╨╥╒т: FTP °╒ у╙р╨Є╒▌ у ┐▐▌▐√▌▐╙ ▌╨р╒╘▌╪┌╨, ▀▐╙█╒╘╨°т╒ ▄╒▌╪ ╗╒╥▐/┐▐╥╒╫╪╥╨·╒ FTP-╨. Савет: FTP је уграђен у Поноћног наредника, погледајте мени Лево/Повезивање FTP-а.
┴╨╥╒т: M-t ╤р╫▐ ▄╒·╨ р╒╓╪▄ с▀╪с┌╨. Савет: M-t брзо мења режим списка.
┴╨╥╒т: ╝▐╓╒т╒ ╫╨╘╨т╪ ┌▐р╪с▌╪ч┌▐ ╪▄╒ ╫╨ ftps: `cd /#ftp:user@machine.edu' Савет: Можете задати корисничко име за ftps: `cd /#ftp:user@machine.edu'
┴╨╥╒т: ╝▐╓╒т╒ ▀р╒╙█╒╘╨т╪ ╘╨т▐т╒┌╒ ╥рст╒ RPM ┌уц▌у╥ш╪ `enter' ▌╨╘ ╘╨т▐т╒┌▐▄ ╥рст╒ `rpm'. Савет: Можете прегледати датотеке врсте RPM куцнувши `enter' над датотеком врсте `rpm'.
┴╨╥╒т: ┤╨ ╤╪ст╒ ▐╫▌╨ч╪█╪ ╘╪р╒┌т▐р╪°у▄╒ у ╘╪°╨█▐╙у ╫╨ ╪╫╤▐р, ╘▐╘╨°т╒ ┌▐су црту. Савет: Да бисте означили директоријуме у дијалогу за избор, додајте косу црту.
┴╨╥╒т: ┤╨ ╤╪ст╒ ╪с╒ц╨█╪ ╪ █╒▀╪█╪ ▀▐▄▐√у ▄╪ш╨, ▄▐╓╘╨ √╒ ╤╪т╪ ▀▐тр╒╤▌▐ ╘╨ ╘р╓╪т╒ т╨ст╒р `shift' Савет: Да бисте исецали и лепили помоћу миша, можда ће бити потребно да држите тастер `shift'
┴╨╥╒т: ├┌уц╨°т╒ ч╒ст▐ ▀▐с╒√╪╥╨▌╨ ▄╒ст╨ ftp-╨ у ╤р╫╪ с▀╪с╨┌: ▀р╪т╪с▌╪т╒ C-\. Савет: Укуцајте често посећивана места ftp-а у брзи списак: притисните C-\.

Просмотреть файл

@ -1,45 +1,45 @@
Ё╧╥┴─┴: ы╧╥╔╙╘╒╩╘┼╙╪ C-x t ─╠╤ ╦╧╨ж└╫┴╬╬╤ ╨╧┌╬┴▐┼╬╔╚ ╞┴╩╠ж╫ ╒ ╦╧═┴╬─╬╔╩ ╥╤─╧╦. Порада: Користуйтесь C-x t для копіювання позначених файлів у командний рядок.
Ё╧╥┴─┴: ы╧╥╔╙╘╒╩╘┼╙╪ C-x p ─╠╤ ╦╧╨ж└╫┴╬╬╤ ╨╧╘╧▐╬╧╟╧ █╠╤╚╒ ╫ ╦╧═┴╬─╬╔╩ ╥╤─╧╦. Порада: Користуйтесь C-x p для копіювання поточного шляху в командний рядок.
Ё╧╥┴─┴: с╫╘╧─╧╨╧╫╬┼╬╬╤: M-Tab (Esc+Tab). ф╠╤ ╧─┼╥╓┴╬╬╤ ╙╨╔╙╦╒ ╬┴╘╔╙╬ж╘╪ ─╫ж▐ж. Порада: Автодоповнення: M-Tab (Esc+Tab). Для одержання списку натисніть двічі.
Ё╧╥┴─┴: ы╧╥╔╙╘╒╩╘┼╙╪ M-p ж M-n ─╠╤ ─╧╙╘╒╨╒ ─╧ ж╙╘╧╥жз ╦╧═┴╬─. Порада: Користуйтесь M-p і M-n для доступу до історії команд.
Ё╧╥┴─┴: Ё╧╘╥ж┬╬╧ ╫╙╘┴╫╔╘╔ ╠ж╘┼╥┴╠? ю┴╘╔╙╬ж╘╪ Control-q ╘┴ ╠ж╘┼╥┴╠. Порада: Потрібно вставити літерал? Натисніть Control-q та літерал.
Ё╧╥┴─┴: ю┴┬╥╔─╠╔ ├ж ╨╧╥┴─╔? ўж─╦╠└▐ж╘╪ з╚ ╒ ═┼╬└ Options|Layout. Порада: Набридли ці поради? Відключіть їх у меню Options|Layout.
Ё╧╥┴─┴: ўж─═ж╘╦┴ ╦┴╘┴╠╧╟ж╫: ─╧─┴╩╘┼ ╨╧╚╔╠╒ ╥╔╙╦╒ ╫ ╦ж╬┼├╪ ╫ж─╨╧╫ж─╬╧╟╧ █┴┬╠╧╬╒. Порада: Відмітка каталогів: додайте похилу риску в кінець відповідного шаблону.
Ё╧╥┴─┴: ё╦▌╧ ╫┴█╧═╒ ╘┼╥═ж╬┴╠╒ ┬╥┴╦╒д ╞╒╬╦├. ╦╠┴╫ж█, ╫╔╦╧╥╔╙╘╧╫╒╩╘┼ ESC+├╔╞╥┴. Порада: Якщо вашому терміналу бракує функц. клавіш, використовуйте ESC+цифра.
Ё╧╥┴─┴: є┴╩╘ Midnight Commander ╫ ╢╬╘┼╥╬┼╘ж: http://www.midnight-commander.org/ Порада: Сайт Midnight Commander в Інтернеті: http://www.midnight-commander.org/
Ё╧╥┴─┴: ф╧═┴█╬╤ ╙╘╧╥ж╬╦┴ Midnight Commander: http://www.midnight-commander.org/ Порада: Домашня сторінка Midnight Commander: http://www.midnight-commander.org/
Ё╧╥┴─┴: т╒─╪ ╠┴╙╦┴, █╠ж╘╪ ╨╧╫ж─╧═╠┼╬╬╤ ╨╥╧ ╨╧═╔╠╦╔ ╬┴ mc-devel@gnome.org Порада: Будь ласка, шліть повідомлення про помилки на mc-devel@gnome.org
Ё╧╥┴─┴: Tab ┌═ж╬└д ╨╧╘╧▐╬╒ ╨┴╬┼╠╪. Порада: Tab змінює поточну панель.
Ё╧╥┴─┴: ·╥╒▐╬ж╙╘╪ ўцє: ╬┴╘╔╙╬ж╘╪ Enter ╬┴ ╞┴╩╠ж TAR ─╠╤ ╧─┼╥╓┴╬╬╤ ╩╧╟╧ ┌═ж╙╘╒. Порада: Зручність ВФС: натисніть Enter на файлі TAR для одержання його змісту.
Ё╧╥┴─┴: ї ╬┴╙ ╘┴╦╧╓ д ╬┼╨╧╟┴╬┴ ╙╘╧╥ж╬╦┴ ╨ж─╥╒▐╬╔╦┴. Порада: У нас також є непогана сторінка підручника.
Ё╧╥┴─┴: ў╔ ╚╧▐┼╘┼ ╬┴╫ж╟┴├ж└ ╫ ╙╘╔╠ж lynx? ў╙╘┴╬╧╫ж╘╪ ├┼ ╫ Options|Configuration. Порада: Ви хочете навігацію в стилі lynx? Встановіть це в Options|Configuration.
Ё╧╥┴─┴: э┴╦╥╧╙╔ % ╨╥┴├└└╘╪ ╬┴╫ж╘╪ ╒ ╦╧═┴╬─╬╧═╒ ╥╤─╦╒. Порада: Макроси % працюють навіть у командному рядку.
Ё╧╥┴─┴: M-! ─╧┌╫╧╠╔╘╪ ╫╔╦╧╬┴╘╔ ╨╥╧╟╥┴═╒ ж ┬┴▐╔╘╔ ╥┼┌╒╠╪╘┴╘ ╒ ╫ж╦╬ж ╨┼╥┼╟╠╤─╒. Порада: M-! дозволить виконати програму і бачити результат у вікні перегляду.
Ё╧╥┴─┴: ц╧╥═┴╘ ╙╨╔╙╦╒ ╞┴╩╠ж╫ ═╧╓┼ ┬╒╘╔ ┌═ж╬┼╬╔╩; ╬┴┬┼╥ж╘╪ "man mc" ─╠╤ ─┼╘┴╠┼╩. Порада: Формат списку файлів може бути змінений; наберіть "man mc" для деталей.
Ё╧╥┴─┴: %D/%T ╧┌╬┴▐┴д ╨╧┌╬┴▐┼╬ж ╞┴╩╠╔ ╬┴ ╨╥╧╘╔╠┼╓╬ж╩ ╨┴╬┼╠ж. Порада: %D/%T означає позначені файли на протилежній панелі.
Ё╧╥┴─┴: т┴╓┴д╘┼ ┌╫╔▐┴╩╬╔╩ shell? ю┴╘╔╙╬ж╘╪ C-o, ж ┌╬╧╫╒ C-o ─╠╤ ╨╧╫┼╥╬┼╬╬╤ ╫ эє. Порада: Бажаєте звичайний shell? Натисніть C-o, і знову C-o для повернення в МС.
Ё╧╥┴─┴: ў╙╘┴╬╧╫╔╫█╔ ┌═ж╬╬╒ CDPATH, ╫╔ ┌┬┼╥┼╓┼╘┼ ┌╒╙╔╠╠╤ ╨╥╔ ╬┴┬╧╥ж ╦╧═┴╬─╔ cd. Порада: Встановивши змінну CDPATH, ви збережете зусилля при наборі команди cd.
Ё╧╥┴─┴: ¤╧┬ ┬┴▐╔╘╔ ╨╥╔╚╧╫┴╬ж ╞┴╩╠╔ .*, ╫╙╘┴╬╧╫ж╘╪ ╧╨├ж└ ╫ Options|Configuration. Порада: Щоб бачити приховані файли .*, встановіть опцію в Options|Configuration.
Ё╧╥┴─┴: ¤╧┬ ┬┴▐╔╘╔ ╥┼┌┼╥╫╬ж ╞┴╩╠╔ .*~, ╫╙╘┴╬╧╫ж╘╪ ╧╨├ж└ ╫ Options|Configuration. Порада: Щоб бачити резервні файли .*~, встановіть опцію в Options|Configuration.
Ё╧╥┴─┴: с╫╘╧─╧╨╧╫╬┼╬╬╤ ╨╥┴├└д ╒ ╫╙ж╚ ╥╤─╦┴╚ ╒╫┼─┼╬╬╤. Ё╥╧╙╘╧ ╬┴╘╔╙╬ж╘╪ M-Tab. Порада: Автодоповнення працює у всіх рядках уведення. Просто натисніть M-Tab.
Ё╧╥┴─┴: ю┴ ╨╧╫ж╠╪╬╔╚ ╘┼╥═ж╬┴╠┴╚ ═╧╓┼ ─╧╨╧═╧╟╘╔ ╧╨├ж╤ -s. Порада: На повільних терміналах може допомогти опція -s.
Ё╧╥┴─┴: Ё╧█╒╦ ╞┴╩╠╒: ▌╧┬ ╨╥┴├└╫┴╘╔ ж┌ ┌╬┴╩─┼╬╔═╔ ╞┴╩╠┴═╔, ╬┴╘╔╙╬ж╘╪ Panelize. Порада: Пошук файлу: щоб працювати із знайденими файлами, натисніть Panelize.
Ё╧╥┴─┴: т┴╓┴д╘┼ ╫╔╦╧╬┴╘╔ ╙╦╠┴─╬╔╩ ╨╧█╒╦? є╦╧╥╔╙╘┴╩╘┼╙╤ Extermal Panelize. Порада: Бажаєте виконати складний пошук? Скористайтеся Extermal Panelize.
Ё╧╥┴─┴: ф╠╤ ┌═ж╬╔ ╦┴╘┴╠╧╟╒ ╨ж─ ▐┴╙ ╬┴┬╧╥╒ ╦╧═┴╬─╔, ╬┴╘╔╙╬ж╘╪ M-c (█╫╔─╦┴ ┌═ж╬┴). Порада: Для зміни каталогу під час набору команди, натисніть M-c (швидка зміна).
Ё╧╥┴─┴: ы╧═┴╬─╔ shell ╬┼ ╫╔╦╧╬╒└╘╪╙╤, ╤╦▌╧ ╫╔ ╬┼ ╫ ╠╧╦┴╠╪╬ж╩ ╞┴╩╠╧╫ж╩ ╙╔╙╘┼═ж. Порада: Команди shell не виконуються, якщо ви не в локальній файловій системі.
Ё╧╥┴─┴: ў╔╠╒▐┼╬╔╩ ╘┼╦╙╘ ═╧╓╬┴ ╨╧╫┼╥╬╒╘╔ ┌┴ ─╧╨╧═╧╟╧└ C-u. Порада: Вилучений текст можна повернути за допомогою C-u.
Ё╧╥┴─┴: ф┼╤╦ж ╦╠┴╫ж█ж ╬┼ ╨╥┴├└└╘╪? є╦╧╥╔╙╘┴╩╘┼╙╪ ═┼╬└ Options|Learn keys. Порада: Деякі клавіші не працюють? Скористайтесь меню Options|Learn keys.
Ё╧╥┴─┴: ф╠╤ ╧─┼╥╓┴╬╬╤ ╥┼┌╒╠╪╘┴╘╒ ╦╧═┴╬─╔ ╒ ╫ж╦╬ж ╨┼╥┼╟╠╤─╒, ╬┴┬┼╥ж╘╪ M-! Порада: Для одержання результату команди у вікні перегляду, наберіть M-!
Ё╧╥┴─┴: F13 (┴┬╧ Shift-F3) ╫╔╦╠╔╦┴└╘╪ ╨┼╥┼╟╠╤─┴▐ ╒ ╥┼╓╔═ж ╬┼╧┬╥╧┬╠┼╬╔╚ ─┴╬╔╚. Порада: F13 (або Shift-F3) викликають переглядач у режимі необроблених даних.
Ё╧╥┴─┴: ў╔ ═╧╓┼╘┼ ╫╔┬╥┴╘╔ ╥┼─┴╦╘╧╥ ─╠╤ F4 ┌┴ ─╧╨╧═╧╟╧└ ┌═ж╬╬╧з ╧┬╧╠╧╬╦╔ EDITOR. Порада: Ви можете вибрати редактор для F4 за допомогою змінної оболонки EDITOR.
Ё╧╥┴─┴: ·╧╫╬ж█╬ж╩ ╨┼╥┼╟╠╤─┴▐ ═╧╓╬┴ ╫╔┬╥┴╘╔ ┌┴ ─╧╨╧═╧╟╧└ ┌═ж╬╬╧з ╧┬╧╠╧╬╦╔ PAGER. Порада: Зовнішній переглядач можна вибрати за допомогою змінної оболонки PAGER.
Ё╧╥┴─┴: ў╔ ═╧╓┼╘┼ ╙╦┴╙╒╫┴╘╔ ┌┴╨╔╘╔ ╬┴ ╨ж─╘╫┼╥─╓┼╬╬╤ ╫ Options|Confirmation. Порада: Ви можете скасувати запити на підтвердження в Options|Confirmation.
Ё╧╥┴─┴: Ё┼╥┼╚╧─╪╘┼ ─╧ ▐┴╙╘╧ ╫╔╦╧╥╔╙╘╧╫╒╫┴╬╔╚ ╦┴╘┴╠╧╟ж╫ ╬┴┬╥┴╫█╔ C-\. Порада: Переходьте до часто використовуваних каталогів набравши C-\.
Ё╧╥┴─┴: с╬╧╬ж═╬╔╩ FTP ═╧╓╬┴ ╫╔╦╧╬┴╘╔ ┌ mc ╬┴┬╥┴╫█╔ 'cd /#ftp:machine.edu' Порада: Анонімний FTP можна виконати з mc набравши 'cd /#ftp:machine.edu'
Ё╧╥┴─┴: FTP ╫┬╒─╧╫┴╬╔╩ ╒ Midnight Commander, ═┼╬└ Ё┴╬┼╠╪/FTP-┌'д─╬┴╬╬╤. Порада: FTP вбудований у Midnight Commander, меню Панель/FTP-з'єднання.
Ё╧╥┴─┴: M-t █╫╔─╦╧ ┌═ж╬└д ╞╧╥═┴╘ ╙╨╔╙╦╒ ╨┴╬┼╠ж. Порада: M-t швидко змінює формат списку панелі.
Ё╧╥┴─┴: ў╔ ═╧╓┼╘┼ ┌┴─┴╘╔ ж═'╤ ╦╧╥╔╙╘╒╫┴▐┴ ftpfs: 'cd /#ftp:user@machine.edu'. Порада: Ви можете задати ім'я користувача ftpfs: 'cd /#ftp:user@machine.edu'.
Ё╧╥┴─┴: ц┴╩╠╔ RPM ═╧╓╬┴ ╨┼╥┼╟╠╤─┴╘╔ ╬┴╘╔╙╬╒╫█╔ Enter ╬┴ ╞┴╩╠ж RPM. Порада: Файли RPM можна переглядати натиснувши Enter на файлі RPM.
Ё╧╥┴─┴: ф╠╤ ╫ж─═ж╘╦╔ ╦┴╘┴╠╧╟ж╫ ╒ ─ж┴╠╧╟╧╫╧═╒ ╫ж╦╬ж ╫╔┬╧╥╒, ─╧─┴╩╘┼ ╨╧╚╔╠╒ ╥╔╙╦╒. Порада: Для відмітки каталогів у діалоговому вікні вибору, додайте похилу риску.
Ё╧╥┴─┴: ф╠╤ ╫╔╥ж┌┴╬╬╤ ж ╫╙╘┴╫╦╔ ┌┴ ─╧╨╧═╧╟╧└ ═╔█ж ╘╥╔═┴╩╘┼ ╦╠┴╫ж█╒ Shift. Порада: Для вирізання і вставки за допомогою миші тримайте клавішу Shift.
Ё╧╥┴─┴: ·┬┼╥ж╟┴╩╘┼ ▐┴╙╘╧ ╫ж─╫ж─╒╫┴╬ж FTP ╒ ╙╨╔╙╦╒ ╦┴╘┴╠╧╟ж╫: ╬┴╘╔╙╬ж╘╪ C-\. Порада: Зберігайте часто відвідувані FTP у списку каталогів: натисніть C-\.

Просмотреть файл

@ -1,45 +1,45 @@
┤ге▄бGи╧е╬ C-x t и╙╜╞╗sдw┐я╛▄к║└╔о╫жW║┘иьл№еOжCбC 提示:使用 C-x t 來複製已選擇的檔案名稱到指令列。
┤ге▄бGи╧е╬ C-x p и╙▒Nе╪лeк║╕Їо|жW║┘╜╞╗sиьл№еOжCбC 提示:使用 C-x p 來將目前的路徑名稱複製到指令列。
┤ге▄бG╕╔╗ЇбGи╧е╬ M-Tabб]й╬ Esc+Tabб^бCлЎитж╕м▌╛ун╙жCкэбC 提示:補齊:使用 M-Tab或 Esc+Tab。按兩次看整個列表。
┤ге▄бGи╧е╬ M-p йM M-n и╙жsи·л№еOи╧е╬мЎ┐¤бC 提示:使用 M-p 和 M-n 來存取指令使用紀錄。
┤ге▄бGнnи╧е╬╕їеXжrд╕б]escape cahracterб^бHеiи╧е╬ Control-q жAе[дWнn┐щдJк║жrд╕бC 提示要使用跳出字元escape cahracter可使用 Control-q 再加上要輸入的字元。
┤ге▄бGмOз_╣я│oи╟░Tоз╣╜н┬дFбHеiжbбu┐я╢╡/░t╕mбv┐я│цдд├Ў│межбC 提示:是否對這些訊息厭倦了?可在「選項/配置」選單中關閉它。
┤ге▄бG┐я╛▄е╪┐¤бGжbнnзф┤Mк║╝╦жблсе[дJ "/"бC 提示:選擇目錄:在要找尋的樣式後加入 "/"。
┤ге▄бGжpкGзAк║▓╫║▌╛ўиSж│е\пр┴фбAеiеHи╧е╬ ESC + ╝╞жrлЎ┴фбC 提示:如果你的終端機沒有功能鍵,可以使用 ESC + 數字按鍵。
┤ге▄бGMidnight Commander URLбGhttp://www.midnight-commander.org/ 提示Midnight Commander URLhttp://www.midnight-commander.org/
┤ге▄бGMidnight Commander ║Їн╢бGhttp://www.midnight-commander.org/ 提示Midnight Commander 網頁:http://www.midnight-commander.org/
┤ге▄бG╜╨░eеX┐∙╗~│°зiиь mc-devel@gnome.org 提示:請送出錯誤報告到 mc-devel@gnome.org
┤ге▄бGTab ╖|д┴┤ли╧е╬ддк║н▒кOбC 提示Tab 會切換使用中的面板。
┤ге▄бGVFS к║жn│BбGжb tar └╔о╫дWлЎ enter еiмdм▌ежк║д║оeбC 提示VFS 的好處:在 tar 檔案上按 enter 可查看它的內容。
┤ге▄бGз┌н╠ж│д@н╙дг┐∙к║дтеUн╢бC 提示:我們有一個不錯的手冊頁。
┤ге▄бGзAмOз_╖Qи╧е╬ lynx к║┬s─¤дшжббH╜╨иь│]йw╣я╕▄╡бдд│]йwбC 提示:你是否想使用 lynx 的瀏覽方式?請到設定對話窗中設定。
┤ге▄бG% еи╢░жbл№еOжCд]еiи╧е╬бC 提示:% 巨集在指令列也可使用。
┤ге▄бGM-! еi┼¤зA░їжцл№еOи├жb└╦╡°╛╣м▌иьежк║┐щеXбC 提示M-! 可讓你執行指令並在檢視器看到它的輸出。
┤ге▄бGзAеiж█нq└╔о╫жCкэк║оцжббF┐щдJ "man mc" еi└Є▒oзєжh▓╙╕`бC 提示:你可自訂檔案列表的格式;輸入 "man mc" 可獲得更多細節。
┤ге▄бG%D/%T ╖|┬Xоiжиеtд@├фн▒кOдддw╝╨░Oк║└╔о╫бC 提示:%D/%T 會擴展成另一邊面板中已標記的檔案。
┤ге▄бG╖Qи╧е╬ен▒`к║йRеO┤▀бHеiлЎ C-oбAжAлЎд@ж╕┤N╖|кЁж^ MCбC 提示:想使用平常的命令殼?可按 C-o再按一次就會返回 MC。
┤ге▄бG│]йw CDPATH └Ї╣╥┼▄╝╞еiеHеOи╧е╬ cd л№еOо╔м┘лoд@┬IлЎ┴фбC 提示:設定 CDPATH 環境變數可以令使用 cd 指令時省卻一點按鍵。
┤ге▄бGнY╖Qм▌зAк║ .* └╔о╫бA╜╨иь│]йw╣я╕▄╡бдд│]йwбC 提示:若想看你的 .* 檔案,請到設定對話窗中設定。
┤ге▄бG╖Qм▌зAк║ *~ │╞еў└╔бH╜╨иь│]йw╣я╕▄╡бдд│]йwбC 提示:想看你的 *~ 備份檔?請到設定對話窗中設定。
┤ге▄бG╕╔╗ЇеiжbеЇжє╣я╕▄╡бддк║еЇжє┐щдJ─цжьдди╧е╬бCеuнnлЎдU M-Tab ┤NеiеHдFбC 提示:補齊可在任何對話窗中的任何輸入欄位中使用。只要按下 M-Tab 就可以了。
┤ге▄бGжb╜w║Cк║▓╫║▌╛ў╕╠и╧е╬ -s ┐я╢╡й╬╖|ж│└░зUбC 提示:在緩慢的終端機裡使用 -s 選項或會有幫助。
┤ге▄бG╖j┤M└╔о╫бGзAеiеHи╧е╬бuн▒кOд╞бv┐я╢╡и╙│B▓z╖j┤Mиьк║└╔о╫бC 提示:搜尋檔案:你可以使用「面板化」選項來處理搜尋到的檔案。
┤ге▄бG╖Q│B▓z╕√╜╞┬°к║└╔о╫╖j┤MбHеiи╧е╬бuе~│бн▒кOд╞бvл№еOбC 提示:想處理較複雜的檔案搜尋?可使用「外部面板化」指令。
┤ге▄бGнnжb┐щдJл№еO│~жнзя┼▄е╪┐¤бAеiи╧е╬ M-cб]з╓│tд┴┤ле╪┐¤б^бC 提示:要在輸入指令途早改變目錄,可使用 M-c快速切換目錄
к`╖NбGжbлDе╗╛ўк║└╔о╫иt▓╬╕╠╡Lкkи╧е╬йRеO┤▀л№еOбC 注意:在非本機的檔案系統裡無法使用命令殼指令。
┤ге▄бGеiе╬ C-y ▒NдwзR░гк║дхжrнл╖s┼уе▄еXи╙бC 提示:可用 C-y 將已刪除的文字重新顯示出來。
┤ге▄бGмOз_ж│и╟лЎ┴ф╡Lкkи╧е╬бHеiм▌м▌бu┐я╢╡/╗{├╤лЎ┴фбvддк║лЎ┴фбC 提示:是否有些按鍵無法使用?可看看「選項/認識按鍵」中的按鍵。
┤ге▄бGнnжb└╦╡°╛╣╕╠м▌иьл№еOк║┐щеXбAи╧е╬ M-! 提示:要在檢視器裡看到指令的輸出,使用 M-!
┤ге▄бGF13б]й╬ Shift-F3б^╖|и╧е╬ньйl╝╥жб╢}▒╥└╦╡°╛╣бC 提示F13或 Shift-F3會使用原始模式開啟檢視器。
┤ге▄бGзAеiеHи╧е╬└Ї╣╥┼▄╝╞ EDITOR и╙л№йwлЎдU F4 лс╢}▒╥к║╜s┐ш╛╣бC 提示:你可以使用環境變數 EDITOR 來指定按下 F4 後開啟的編輯器。
┤ге▄бGзAеiеHи╧е╬└Ї╣╥┼▄╝╞ PAGER и╙л№йwе~│бк║└╦╡°╛╣бC 提示:你可以使用環境變數 PAGER 來指定外部的檢視器。
┤ге▄бGзAеiеHжbбu┐я╢╡/╜T╗{бv╕╠├Ў│мй╥ж│╜T╗{к║нnиDбC 提示:你可以在「選項/確認」裡關閉所有確認的要求。
┤ге▄бGи╧е╬ C-\ еiеHзYо╔╕їиь╕g▒`и╧е╬к║е╪┐¤бC 提示:使用 C-\ 可以即時跳到經常使用的目錄。
┤ге▄бGзAеiеHжb mc и╧е╬╡LжWдє╝╥жб FTPбAдшкkмO┐щдJ 'cd /#ftp:machine.edu' 提示:你可以在 mc 使用無名氏模式 FTP方法是輸入 'cd /#ftp:machine.edu'
┤ге▄бGFTP мO Midnight Commander к║д║л╪е\прбA╜╨└╦мdбu└╔о╫/FTP │s╜uбv┐я│цбC 提示FTP 是 Midnight Commander 的內建功能,請檢查「檔案/FTP 連線」選單。
┤ге▄бGM-t еiз╓│tжaд┴┤лжCкэ╝╥жббC 提示M-t 可快速地切換列表模式。
┤ге▄бGзAеiеHжbи╧е╬ ftp о╔л№йwи╧е╬к╠жW║┘бAи╥жpбG'cd /#ftp:user@machine.edu' 提示:你可以在使用 ftp 時指定使用者名稱,例如:'cd /#ftp:user@machine.edu'
┤ге▄бGзAеiеHжb rpm └╔дWлЎ enter и╙┬s─¤ rpm ╕╠к║└╔о╫бC 提示:你可以在 rpm 檔上按 enter 來瀏覽 rpm 裡的檔案。
┤ге▄бGжb┐я╛▄╣я╕▄▓░дд┐яи·е╪┐¤о╔бAнnжbлсн▒е[д@ "/"бC 提示:在選擇對話盒中選取目錄時,要在後面加一 "/"。
┤ге▄бGнnи╧е╬╖╞╣л░┼╢Kе\пр╗▌нnзAлЎдU shift ┴ф 提示:要使用滑鼠剪貼功能需要你按下 shift 鍵
┤ге▄бGнn▒N▒`иьк║║Їп╕┐щдJ▒`е╬жCкэ╕╠бG┴фдJ C-\бC 提示:要將常到的網站輸入常用列表裡:鍵入 C-\。

Просмотреть файл

@ -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 \ 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 \ 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 \ 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 if CHARSET
mc_SOURCES = $(SRCS) $(CHARSET_SRC) mc_SOURCES = $(SRCS) $(CHARSET_SRC)

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

@ -36,6 +36,7 @@
#include "panel.h" /* do_file_mark() */ #include "panel.h" /* do_file_mark() */
#include "main.h" /* update_panels() */ #include "main.h" /* update_panels() */
#include "chmod.h" #include "chmod.h"
#include "strutil.h"
static int single_set; static int single_set;
@ -296,11 +297,11 @@ void chmod_cmd (void)
} }
/* Set the labels */ /* 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)); 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)); 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)); add_widget (ch_dlg, label_new (FY+8, FX+2, c_fgrp));
g_snprintf (buffer, sizeof (buffer), "%o", c_stat); g_snprintf (buffer, sizeof (buffer), "%o", c_stat);
statl = label_new (FY+4, FX+2, buffer); statl = label_new (FY+4, FX+2, buffer);

Просмотреть файл

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

Просмотреть файл

@ -62,6 +62,7 @@
#include "profile.h" /* PROFILE_NAME */ #include "profile.h" /* PROFILE_NAME */
#include "execute.h" /* toggle_panels() */ #include "execute.h" /* toggle_panels() */
#include "history.h" #include "history.h"
#include "strutil.h"
#ifndef MAP_FILE #ifndef MAP_FILE
# define MAP_FILE 0 # define MAP_FILE 0
@ -431,7 +432,7 @@ set_panel_filter (WPanel *p)
{ {
char *reg_exp; char *reg_exp;
const char *x; const char *x;
x = p->filter ? p->filter : easy_patterns ? "*" : "."; x = p->filter ? p->filter : easy_patterns ? "*" : ".";
reg_exp = input_dialog_help (_(" Filter "), reg_exp = input_dialog_help (_(" Filter "),
@ -916,7 +917,7 @@ do_link (int symbolic_link, const char *fname)
char *dest = NULL, *src = NULL; char *dest = NULL, *src = NULL;
if (!symbolic_link) { 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, ""); dest = input_expand_dialog (_(" Link "), src, MC_HISTORY_FM_LINK, "");
if (!dest || !*dest) if (!dest || !*dest)
goto cleanup; goto cleanup;
@ -981,7 +982,7 @@ void edit_symlink_cmd (void)
p = selection (current_panel)->fname; 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); i = readlink (p, buffer, MC_MAXPATHLEN - 1);
if (i > 0) { if (i > 0) {
@ -1062,11 +1063,13 @@ char *guess_message_value (void)
char * char *
get_random_hint (int force) get_random_hint (int force)
{ {
char *data, *result, *eol; char *data, *result = NULL, *eol;
int len; int len;
int start; int start;
static int last_sec; static int last_sec;
static struct timeval tv; static struct timeval tv;
str_conv_t conv;
struct str_buffer *buffer;
/* Do not change hints more often than one minute */ /* Do not change hints more often than one minute */
gettimeofday (&tv, NULL); gettimeofday (&tv, NULL);
@ -1092,7 +1095,20 @@ get_random_hint (int force)
eol = strchr (&data[start], '\n'); eol = strchr (&data[start], '\n');
if (eol) if (eol)
*eol = 0; *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); g_free (data);
return result; return result;
} }
@ -1369,3 +1385,60 @@ toggle_listing_cmd (void)
set_basic_panel_listing_to (current, (p->list_type + 1) % LIST_TYPES); 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);
}

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

@ -33,6 +33,7 @@
#include "layout.h" /* winch_flag */ #include "layout.h" /* winch_flag */
#include "execute.h" /* suspend_cmd() */ #include "execute.h" /* suspend_cmd() */
#include "main.h" /* slow_terminal */ #include "main.h" /* slow_terminal */
#include "strutil.h"
#define waddc(w,y1,x1,c) move (w->y+y1, w->x+x1); addch (c) #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) { if (h->title) {
attrset (DLG_HOT_NORMALC (h)); attrset (DLG_HOT_NORMALC (h));
dlg_move (h, space, (h->cols - strlen (h->title)) / 2); dlg_move (h, space, (h->cols - str_term_width1 (h->title)) / 2);
addstr (h->title); 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 (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; return 0;
} }
/* If it's an alt key, send the message */ /* If it's an alt key, send the message */
c = d_key & ~ALT (0); c = d_key & ~ALT (0);
if (d_key & ALT (0) && c < 255 && isalpha (c)) if (d_key & ALT (0) && g_ascii_isalpha (c))
d_key = tolower (c); d_key = g_ascii_tolower (c);
handled = 0; handled = 0;
if (h->current->options & W_WANT_HOTKEY) if (h->current->options & W_WANT_HOTKEY)

113
src/dir.c
Просмотреть файл

@ -29,6 +29,7 @@
#include "dir.h" #include "dir.h"
#include "wtools.h" #include "wtools.h"
#include "treestore.h" #include "treestore.h"
#include "strutil.h"
/* If true show files starting with a dot */ /* If true show files starting with a dot */
int show_dot_files = 1; int show_dot_files = 1;
@ -61,50 +62,9 @@ sort_orders_t sort_orders [SORT_TYPES_TOTAL] = {
{ N_("&Inode"), sort_inode }, { 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 int
unsorted (const file_entry *a, const file_entry *b) unsorted (file_entry *a, file_entry *b)
{ {
(void) a; (void) a;
(void) b; (void) b;
@ -112,28 +72,38 @@ unsorted (const file_entry *a, const file_entry *b)
} }
int 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 ad = MY_ISDIR (a);
int bd = MY_ISDIR (b); int bd = MY_ISDIR (b);
if (ad == bd || mix_all_files) if (ad == bd || mix_all_files) {
return string_sortcomp (a->fname, b->fname) * reverse; /* create key if does not exist, key will be freed after sorting */
return bd-ad; 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 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 r;
int ad = MY_ISDIR (a); int ad = MY_ISDIR (a);
int bd = MY_ISDIR (b); int bd = MY_ISDIR (b);
if (ad == bd || mix_all_files){ if (ad == bd || mix_all_files){
exta = extension (a->fname); if (a->second_sort_key == NULL)
extb = extension (b->fname); a->second_sort_key = str_create_key (extension (a->fname), case_sensitive);
r = string_sortcomp (exta, extb); 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) if (r)
return r * reverse; return r * reverse;
else else
@ -143,7 +113,7 @@ sort_ext (const file_entry *a, const file_entry *b)
} }
int 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 ad = MY_ISDIR (a);
int bd = MY_ISDIR (b); int bd = MY_ISDIR (b);
@ -161,7 +131,7 @@ sort_time (const file_entry *a, const file_entry *b)
} }
int 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 ad = MY_ISDIR (a);
int bd = MY_ISDIR (b); int bd = MY_ISDIR (b);
@ -179,7 +149,7 @@ sort_ctime (const file_entry *a, const file_entry *b)
} }
int 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 ad = MY_ISDIR (a);
int bd = MY_ISDIR (b); int bd = MY_ISDIR (b);
@ -197,7 +167,7 @@ sort_atime (const file_entry *a, const file_entry *b)
} }
int 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 ad = MY_ISDIR (a);
int bd = MY_ISDIR (b); int bd = MY_ISDIR (b);
@ -209,7 +179,7 @@ sort_inode (const file_entry *a, const file_entry *b)
} }
int 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 ad = MY_ISDIR (a);
int bd = MY_ISDIR (b); int bd = MY_ISDIR (b);
@ -226,6 +196,20 @@ sort_size (const file_entry *a, const file_entry *b)
return sort_name (a, 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 void
do_sort (dir_list *list, sortfn *sort, int top, int reverse_f, int case_sensitive_f, int exec_first_f) 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; exec_first = exec_first_f;
qsort (&(list->list) [dot_dot_found], qsort (&(list->list) [dot_dot_found],
top + 1 - dot_dot_found, sizeof (file_entry), sort); top + 1 - dot_dot_found, sizeof (file_entry), sort);
clean_sort_keys (list, dot_dot_found, top + 1 - dot_dot_found);
} }
void void
@ -254,7 +240,7 @@ clean_dir (dir_list *list, int count)
for (i = 0; i < count; i++){ for (i = 0; i < count; i++){
g_free (list->list [i].fname); 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.stale_link = stale_link;
list->list[next_free].f.dir_size_computed = 0; list->list[next_free].f.dir_size_computed = 0;
list->list[next_free].st = st; list->list[next_free].st = st;
list->list[next_free].sort_key = NULL;
list->list[next_free].second_sort_key = NULL;
next_free++; next_free++;
if (!(next_free % 32)) if (!(next_free % 32))
rotate_dash (); rotate_dash ();
@ -477,8 +465,11 @@ alloc_dir_copy (int size)
} }
dir_copy.list = g_new (file_entry, size); dir_copy.list = g_new (file_entry, size);
for (i = 0; i < size; i++) for (i = 0; i < size; i++) {
dir_copy.list [i].fname = 0; 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; 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; 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.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].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) { if (list->list[i].f.marked) {
g_hash_table_insert (marked_files, dir_copy.list[i].fname, g_hash_table_insert (marked_files, dir_copy.list[i].fname,
&dir_copy.list[i]); &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.stale_link = stale_link;
list->list[next_free].f.dir_size_computed = 0; list->list[next_free].f.dir_size_computed = 0;
list->list[next_free].st = st; list->list[next_free].st = st;
list->list[next_free].sort_key = NULL;
list->list[next_free].second_sort_key = NULL;
next_free++; next_free++;
if (!(next_free % 16)) if (!(next_free % 16))
rotate_dash (); rotate_dash ();

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

@ -72,6 +72,8 @@ typedef struct WPanel {
int searching; int searching;
char search_buffer [256]; 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;
WPanel *panel_new (const char *panel_name); WPanel *panel_new (const char *panel_name);

Просмотреть файл

@ -43,6 +43,7 @@
#include "main.h" /* repaint_screen */ #include "main.h" /* repaint_screen */
#include "panelize.h" #include "panelize.h"
#include "history.h" #include "history.h"
#include "strutil.h"
#define UX 5 #define UX 5
#define UY 2 #define UY 2
@ -128,7 +129,7 @@ init_panelize (void)
i = sizeof (panelize_but) / sizeof (panelize_but[0]); i = sizeof (panelize_but) / sizeof (panelize_but[0]);
while (i--) { while (i--) {
panelize_but[i].text = _(panelize_but[i].text); 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; maxlen += 10;
@ -137,11 +138,11 @@ init_panelize (void)
panelize_cols = max (panelize_cols, maxlen); panelize_cols = max (panelize_cols, maxlen);
panelize_but[2].x = 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[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_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 */ #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.stale_link = stale_link;
list->list [next_free].f.dir_size_computed = 0; list->list [next_free].f.dir_size_computed = 0;
list->list [next_free].st = st; list->list [next_free].st = st;
list->list[next_free].sort_key = NULL;
list->list[next_free].second_sort_key = NULL;
next_free++; next_free++;
if (!(next_free & 32)) if (!(next_free & 32))
rotate_dash (); rotate_dash ();

Просмотреть файл

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

Просмотреть файл

@ -50,21 +50,10 @@
#include "main.h" /* the_menubar */ #include "main.h" /* the_menubar */
#include "unixcompat.h" #include "unixcompat.h"
#include "mountlist.h" /* my_statfs */ #include "mountlist.h" /* my_statfs */
#include "strutil.h"
#define ELEMENTS(arr) ( sizeof(arr) / sizeof((arr)[0]) ) #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 NORMAL 0
#define SELECTED 1 #define SELECTED 1
#define MARKED 2 #define MARKED 2
@ -172,24 +161,8 @@ add_permission_string (char *dest, int width, file_entry *fe, int attr, int colo
static const char * static const char *
string_file_name (file_entry *fe, int len) string_file_name (file_entry *fe, int len)
{ {
static char buffer [MC_MAXPATHLEN + 1]; static char buffer [MC_MAXPATHLEN * MB_LEN_MAX + 1];
size_t i; g_strlcpy (buffer, fe->fname, sizeof(buffer));
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;
return buffer; return buffer;
} }
@ -451,42 +424,6 @@ static struct {
{ "dot", 1, 0, J_RIGHT, " ", 0, string_dot, NULL }, { "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 static int
file_compute_color (int attr, file_entry *fe) 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; int color, length, empty_line;
const char *txt; const char *txt;
char *old_pos;
char *cdest = dest;
format_e *format, *home; format_e *format, *home;
file_entry *fe; file_entry *fe;
@ -565,34 +500,38 @@ format_file (char *dest, int limit, WPanel *panel, int file_index, int width, in
break; break;
if (format->string_fn){ if (format->string_fn){
int len; int len, perm;
char *preperad_text;
if (empty_line) if (empty_line)
txt = " "; txt = " ";
else else
txt = (*format->string_fn)(fe, format->field_len); txt = (*format->string_fn)(fe, format->field_len);
old_pos = cdest;
len = format->field_len; len = format->field_len;
if (len + length > width) if (len + length > width)
len = width - length; len = width - length;
if (len + (cdest - dest) > limit)
len = limit - (cdest - dest);
if (len <= 0) if (len <= 0)
break; 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); attrset (color);
if (permission_mode && !strcmp(format->id, "perm")) preperad_text = (char*) str_fit_to_term(txt, len, format->just_mode);
add_permission_string (old_pos, format->field_len, fe, attr, color, 0); if (perm)
else if (permission_mode && !strcmp(format->id, "mode")) add_permission_string (preperad_text, format->field_len, fe,
add_permission_string (old_pos, format->field_len, fe, attr, color, 1); attr, color, perm - 1);
else else
addstr (old_pos); addstr (preperad_text);
length+= len;
} else { } else {
if (attr == SELECTED || attr == MARKED_SELECTED) if (attr == SELECTED || attr == MARKED_SELECTED)
attrset (SELECTED_COLOR); attrset (SELECTED_COLOR);
@ -663,11 +602,41 @@ display_mini_info (WPanel *panel)
if (panel->searching){ if (panel->searching){
attrset (INPUT_COLOR); 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); attrset (NORMAL_COLOR);
return; 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 */ /* Status resolves links and show them */
set_colors (panel); set_colors (panel);
@ -680,19 +649,18 @@ display_mini_info (WPanel *panel)
g_free (link); g_free (link);
if (len > 0){ if (len > 0){
link_target[len] = 0; link_target[len] = 0;
tty_printf ("-> %-*s", panel->widget.cols - 5, addstr ("-> ");
name_trunc (link_target, panel->widget.cols - 5)); addstr (str_fit_to_term (link_target, panel->widget.cols - 5,
J_LEFT_FIT));
} else } else
tty_printf ("%-*s", panel->widget.cols - 2, _("<readlink failed>")); addstr (str_fit_to_term (_("<readlink failed>"),
} else if (strcmp (panel->dir.list [panel->selected].fname, "..") == 0) { panel->widget.cols - 2, J_LEFT));
/* FIXME: return;
* 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 */ /* Default behavior */
tty_printf ("%-*s", panel->widget.cols - 2, _("UP--DIR")); repaint_file (panel, panel->selected, 0, STATUS, 1);
} else return;
/* Default behavior */
repaint_file (panel, panel->selected, 0, STATUS, 1);
} }
static void static void
@ -824,7 +792,7 @@ show_free_space (WPanel *panel)
static void static void
show_dir (WPanel *panel) show_dir (WPanel *panel)
{ {
char *tmp; int len;
set_colors (panel); set_colors (panel);
draw_double_box (panel->widget.parent, draw_double_box (panel->widget.parent,
@ -845,17 +813,12 @@ show_dir (WPanel *panel)
attrset (REVERSE_COLOR); attrset (REVERSE_COLOR);
widget_move (&panel->widget, 0, 3); 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 (' '); 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); widget_move (&panel->widget, 0, 1);
addstr ("<"); addstr ("<");
widget_move (&panel->widget, 0, panel->widget.cols - 2); widget_move (&panel->widget, 0, panel->widget.cols - 2);
@ -1172,7 +1135,6 @@ static void
paint_frame (WPanel *panel) paint_frame (WPanel *panel)
{ {
int header_len; int header_len;
int spaces, extra;
int side, width; int side, width;
const char *txt; const char *txt;
@ -1205,11 +1167,8 @@ paint_frame (WPanel *panel)
header_len = format->field_len; header_len = format->field_len;
attrset (MARKED_COLOR); attrset (MARKED_COLOR);
spaces = (format->field_len - header_len) / 2; addstr (str_fit_to_term (txt, format->field_len, J_CENTER_LEFT));
extra = (format->field_len - header_len) % 2; width -= format->field_len;
tty_printf ("%*s%.*s%*s", spaces, "",
header_len, txt, spaces+extra, "");
width -= 2 * spaces + extra + header_len;
} else { } else {
attrset (NORMAL_COLOR); attrset (NORMAL_COLOR);
one_vline (); one_vline ();
@ -1962,24 +1921,49 @@ mark_file (WPanel *panel)
static void static void
do_search (WPanel *panel, int c_code) do_search (WPanel *panel, int c_code)
{ {
size_t l; size_t l, max, buf_max;
int i; int i, sel;
int wrapped = 0; int wrapped = 0;
int found; char *act;
l = strlen (panel->search_buffer); l = strlen (panel->search_buffer);
if (c_code == KEY_BACKSPACE) { if (c_code == KEY_BACKSPACE) {
if (l) if (l != 0) {
panel->search_buffer[--l] = '\0'; act = panel->search_buffer + l;
str_prev_noncomb_char (&act, panel->search_buffer);
act[0] = '\0';
}
panel->search_chpoint = 0;
} else { } else {
if (c_code && l < sizeof (panel->search_buffer)) { if (c_code && panel->search_chpoint < sizeof (panel->search_char)) {
panel->search_buffer[l] = c_code; panel->search_char[panel->search_chpoint] = c_code;
panel->search_buffer[l + 1] = 0; panel->search_chpoint++;
l++; }
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++) { for (i = panel->selected; !wrapped || i != panel->selected; i++) {
if (i >= panel->count) { if (i >= panel->count) {
i = 0; i = 0;
@ -1987,20 +1971,28 @@ do_search (WPanel *panel, int c_code)
break; break;
wrapped = 1; wrapped = 1;
} }
if (panel-> l = panel->case_sensitive ?
case_sensitive str_prefix (panel->dir.list[i].fname, panel->search_buffer) :
? (strncmp (panel->dir.list[i].fname, panel->search_buffer, l) str_caseprefix (panel->dir.list[i].fname, panel->search_buffer);
== 0) : (g_strncasecmp (panel->dir.list[i].fname, if (l > max) {
panel->search_buffer, l) == 0)) { max = l;
unselect_item (panel); sel = i;
panel->selected = i; if (max == buf_max) break;
select_item (panel);
found = 1;
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); paint_panel (panel);
} }
@ -2016,7 +2008,9 @@ start_search (WPanel *panel)
do_search (panel, 0); do_search (panel, 0);
} else { } else {
panel->searching = 1; 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); display_mini_info (panel);
mc_refresh (); mc_refresh ();
} }

Просмотреть файл

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

813
src/strutil.c Обычный файл
Просмотреть файл

@ -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 Обычный файл
Просмотреть файл

@ -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 Обычный файл
Просмотреть файл

@ -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 Обычный файл
Просмотреть файл

@ -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 Обычный файл

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

@ -50,6 +50,7 @@
#include "treestore.h" #include "treestore.h"
#include "cmd.h" #include "cmd.h"
#include "history.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) #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)); attrset (DLG_FOCUSC (h));
addch (PATH_SEP); 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 (' '); addch (' ');
attrset (DLG_FOCUSC (h)); attrset (DLG_FOCUSC (h));
} else { } else {
/* Show full name of selected directory */ /* 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 */ /* 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{ } else{
/* Sub level directory */ /* Sub level directory */
@ -302,8 +305,8 @@ static void show_tree (WTree *tree)
/* Show sub-name */ /* Show sub-name */
addch (' '); addch (' ');
addstr ((char *) name_trunc (current->subname, addstr (str_fit_to_term (current->subname,
tree_cols - 2 - 4 - 3 * j)); tree_cols - 2 - 4 - 3 * j, J_LEFT_FIT));
} }
addch (' '); addch (' ');
@ -598,7 +601,7 @@ static void tree_copy (WTree *tree, const char *default_dest)
if (!tree->selected_ptr) if (!tree->selected_ptr)
return; return;
g_snprintf (cmd_buf, sizeof(cmd_buf), _("Copy \"%s\" directory to:"), 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); dest = input_expand_dialog (_(" Copy "), cmd_buf, MC_HISTORY_FM_TREE_COPY, default_dest);
if (!dest) if (!dest)
@ -641,7 +644,7 @@ static void tree_move (WTree *tree, const char *default_dest)
if (!tree->selected_ptr) if (!tree->selected_ptr)
return; return;
g_snprintf (cmd_buf, sizeof (cmd_buf), _("Move \"%s\" directory to:"), 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); dest = input_expand_dialog (_(" Move "), cmd_buf, MC_HISTORY_FM_TREE_MOVE, default_dest);
if (!dest) if (!dest)
return; return;

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

2004
src/view.c

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Просмотреть файл

@ -26,6 +26,26 @@ typedef enum {
/* button callback */ /* button callback */
typedef int (*bcback) (int); 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 { typedef struct WButton {
Widget widget; Widget widget;
int action; /* what to do when pressed */ int action; /* what to do when pressed */
@ -36,8 +56,7 @@ typedef struct WButton {
#define NORMAL_BUTTON 2 #define NORMAL_BUTTON 2
#define DEFPUSH_BUTTON 3 #define DEFPUSH_BUTTON 3
unsigned int flags; /* button flags */ unsigned int flags; /* button flags */
char *text; /* text of button */ struct hotkey_t text; /* text of button, contain hotkey too */
int hotkey; /* hot KEY */
int hotpos; /* offset hot KEY char in text */ int hotpos; /* offset hot KEY char in text */
bcback callback; /* Callback function */ bcback callback; /* Callback function */
} WButton; } WButton;
@ -47,7 +66,7 @@ typedef struct WRadio {
unsigned int state; /* radio button state */ unsigned int state; /* radio button state */
int pos, sel; int pos, sel;
int count; /* number of members */ int count; /* number of members */
const char **texts; /* texts of labels */ struct hotkey_t *texts; /* texts of labels */
} WRadio; } WRadio;
typedef struct WCheck { typedef struct WCheck {
@ -56,9 +75,7 @@ typedef struct WCheck {
#define C_BOOL 0x0001 #define C_BOOL 0x0001
#define C_CHANGE 0x0002 #define C_CHANGE 0x0002
unsigned int state; /* check button state */ unsigned int state; /* check button state */
char *text; /* text of check button */ struct hotkey_t text; /* text of check button */
int hotkey; /* hot KEY */
int hotpos; /* offset hot KEY char in text */
} WCheck; } WCheck;
typedef struct WGauge { typedef struct WGauge {
@ -74,11 +91,11 @@ char *show_hist (GList *history, int widget_y, int widget_x);
typedef struct { typedef struct {
Widget widget; Widget widget;
int point; /* cursor position in the input line */ int point; /* cursor position in the input line in characters */
int mark; /* The mark position */ int mark; /* The mark position in characters */
int first_shown; /* Index of the first shown character */ int term_first_shown; /* column of the first shown character */
int current_max_len; /* Maximum length of input line */ size_t current_max_size; /* Maximum length of input line (bytes) */
int field_len; /* Length of the editing field */ int field_width; /* width of the editing field */
int color; /* color used */ int color; /* color used */
int first; /* Is first keystroke? */ int first; /* Is first keystroke? */
int disable_update; /* Do we want to skip updates? */ int disable_update; /* Do we want to skip updates? */
@ -89,6 +106,8 @@ typedef struct {
char **completions; /* Possible completions array */ char **completions; /* Possible completions array */
INPUT_COMPLETE_FLAGS completion_flags; /* INPUT_COMPLETE* bitwise flags(complete.h) */ INPUT_COMPLETE_FLAGS completion_flags; /* INPUT_COMPLETE* bitwise flags(complete.h) */
char *history_name; /* name of history for loading and saving */ 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; } WInput;
/* For history load-save functions */ /* 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); WGroupbox *groupbox_new (int x, int y, int width, int height, const char *title);
/* Input lines */ /* 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); cb_ret_t handle_char (WInput *in, int c_code);
int is_in_input_map (WInput *in, int c_code); int is_in_input_map (WInput *in, int c_code);
void update_input (WInput *in, int clear_first); 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); void gauge_show (WGauge *g, int shown);
/* Buttons */ /* Buttons */
/* return copy of button text */
const char *button_get_text (WButton *b); const char *button_get_text (WButton *b);
void button_set_text (WButton *b, const char *text); void button_set_text (WButton *b, const char *text);

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

373
vfs/vfs.c
Просмотреть файл

@ -42,6 +42,7 @@
#include "../src/tty.h" /* enable/disable interrupt key */ #include "../src/tty.h" /* enable/disable interrupt key */
#include "../src/wtools.h" /* message() */ #include "../src/wtools.h" /* message() */
#include "../src/main.h" /* print_vfs_message */ #include "../src/main.h" /* print_vfs_message */
#include "../src/strutil.h"
#include "utilvfs.h" #include "utilvfs.h"
#include "gc.h" #include "gc.h"
@ -64,10 +65,32 @@ struct vfs_openfile {
void *fsinfo; void *fsinfo;
}; };
struct vfs_dirinfo{
DIR *info;
str_conv_t converter;
};
static GSList *vfs_openfiles; static GSList *vfs_openfiles;
#define VFS_FIRST_HANDLE 100 #define VFS_FIRST_HANDLE 100
static struct vfs_class *localfs_class; 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 */ /* Create new VFS handle and put it to the list */
static int static int
@ -309,6 +332,161 @@ vfs_get_class (const char *pathname)
return vfs; 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 static int
ferrno (struct vfs_class *vfs) ferrno (struct vfs_class *vfs)
{ {
@ -323,7 +501,8 @@ mc_open (const char *filename, int flags, ...)
void *info; void *info;
va_list ap; 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); struct vfs_class *vfs = vfs_get_class (file);
/* Get the mode flag */ /* Get the mode flag */
@ -348,6 +527,7 @@ mc_open (const char *filename, int flags, ...)
} }
return vfs_new_handle (vfs, info); return vfs_new_handle (vfs, info);
} else return -1;
} }
@ -356,13 +536,15 @@ int mc_##name inarg \
{ \ { \
struct vfs_class *vfs; \ struct vfs_class *vfs; \
int result; \ int result; \
char *mpath = vfs_canon (path); \ char *mpath = vfs_canon_and_translate (path); \
if (mpath != NULL) { \
vfs = vfs_get_class (mpath); \ vfs = vfs_get_class (mpath); \
result = vfs->name ? (*vfs->name)callarg : -1; \ result = vfs->name ? (*vfs->name)callarg : -1; \
g_free (mpath); \ g_free (mpath); \
if (result == -1) \ if (result == -1) \
errno = vfs->name ? ferrno (vfs) : E_NOTSUPP; \ errno = vfs->name ? ferrno (vfs) : E_NOTSUPP; \
return result; \ return result; \
} else return -1; \
} }
MC_NAMEOP (chmod, (const char *path, mode_t mode), (vfs, mpath, mode)) 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 (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 (readlink, (const char *path, char *buf, int bufsiz), (vfs, mpath, buf, bufsiz))
MC_NAMEOP (unlink, (const char *path), (vfs, mpath)) 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 (mkdir, (const char *path, mode_t mode), (vfs, mpath, mode))
MC_NAMEOP (rmdir, (const char *path), (vfs, mpath)) MC_NAMEOP (rmdir, (const char *path), (vfs, mpath))
MC_NAMEOP (mknod, (const char *path, mode_t mode, dev_t dev), (vfs, mpath, mode, dev)) 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) \ #define MC_HANDLEOP(name, inarg, callarg) \
ssize_t mc_##name inarg \ ssize_t mc_##name inarg \
@ -399,9 +608,12 @@ int mc_##name (const char *fname1, const char *fname2) \
{ \ { \
struct vfs_class *vfs; \ struct vfs_class *vfs; \
int result; \ 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); \ vfs = vfs_get_class (name1); \
name2 = vfs_canon (fname2); \
if (vfs != vfs_get_class (name2)){ \ if (vfs != vfs_get_class (name2)){ \
errno = EXDEV; \ errno = EXDEV; \
g_free (name1); \ g_free (name1); \
@ -414,6 +626,11 @@ int mc_##name (const char *fname1, const char *fname2) \
if (result == -1) \ if (result == -1) \
errno = vfs->name ? ferrno (vfs) : E_NOTSUPP; \ errno = vfs->name ? ferrno (vfs) : E_NOTSUPP; \
return result; \ return result; \
} else { \
g_free (name1); \
return -1; \
} \
} else return -1; \
} }
MC_RENAMEOP (link) MC_RENAMEOP (link)
@ -438,11 +655,13 @@ mc_setctl (const char *path, int ctlop, void *arg)
if (!path) if (!path)
vfs_die("You don't want to pass NULL to mc_setctl."); 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); vfs = vfs_get_class (mpath);
result = vfs->setctl ? (*vfs->setctl)(vfs, mpath, ctlop, arg) : 0; result = vfs->setctl ? (*vfs->setctl)(vfs, mpath, ctlop, arg) : 0;
g_free (mpath); g_free (mpath);
return result; return result;
} else return -1;
} }
int int
@ -474,22 +693,43 @@ mc_opendir (const char *dirname)
int handle, *handlep; int handle, *handlep;
void *info; void *info;
struct vfs_class *vfs; struct vfs_class *vfs;
char *canon;
char *dname; char *dname;
struct vfs_dirinfo *dirinfo;
const char *encoding;
dname = vfs_canon (dirname); canon = vfs_canon (dirname);
vfs = vfs_get_class (dname); dname = vfs_translate_path_n (canon);
if (dname != NULL) {
vfs = vfs_get_class (dname);
info = vfs->opendir ? (*vfs->opendir)(vfs, dname) : NULL; info = vfs->opendir ? (*vfs->opendir)(vfs, dname) : NULL;
g_free (dname); g_free (dname);
if (!info){ if (!info){
errno = vfs->opendir ? ferrno (vfs) : E_NOTSUPP; errno = vfs->opendir ? ferrno (vfs) : E_NOTSUPP;
g_free (canon);
return NULL; 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 = g_new (int, 1);
*handlep = handle; *handlep = handle;
return (DIR *) handlep; return (DIR *) handlep;
} else {
g_free (canon);
return NULL;
}
} }
struct dirent * struct dirent *
@ -497,7 +737,10 @@ mc_readdir (DIR *dirp)
{ {
int handle; int handle;
struct vfs_class *vfs; struct vfs_class *vfs;
struct dirent *result = NULL; static struct dirent result;
struct dirent *entry = NULL;
struct vfs_dirinfo *dirinfo;
int state;
if (!dirp) { if (!dirp) {
errno = EFAULT; errno = EFAULT;
@ -505,11 +748,21 @@ mc_readdir (DIR *dirp)
} }
handle = *(int *) dirp; handle = *(int *) dirp;
vfs = vfs_op (handle); vfs = vfs_op (handle);
if (vfs->readdir) dirinfo = vfs_info (handle);
result = (*vfs->readdir) (vfs_info (handle)); if (vfs->readdir) {
if (!result) do {
errno = vfs->readdir ? ferrno (vfs) : E_NOTSUPP; entry = (*vfs->readdir) (dirinfo->info);
return result; 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 int
@ -518,9 +771,14 @@ mc_closedir (DIR *dirp)
int handle = *(int *) dirp; int handle = *(int *) dirp;
struct vfs_class *vfs = vfs_op (handle); struct vfs_class *vfs = vfs_op (handle);
int result; 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); vfs_free_handle (handle);
g_free (dirinfo);
g_free (dirp); g_free (dirp);
return result; return result;
} }
@ -529,24 +787,37 @@ int mc_stat (const char *filename, struct stat *buf) {
struct vfs_class *vfs; struct vfs_class *vfs;
int result; int result;
char *path; 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; result = vfs->stat ? (*vfs->stat) (vfs, path, buf) : -1;
g_free (path); g_free (path);
if (result == -1) if (result == -1)
errno = vfs->name ? ferrno (vfs) : E_NOTSUPP; errno = vfs->name ? ferrno (vfs) : E_NOTSUPP;
return result; return result;
} else return -1;
} }
int mc_lstat (const char *filename, struct stat *buf) { int mc_lstat (const char *filename, struct stat *buf) {
struct vfs_class *vfs; struct vfs_class *vfs;
int result; int result;
char *path; 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; result = vfs->lstat ? (*vfs->lstat) (vfs, path, buf) : -1;
g_free (path); g_free (path);
if (result == -1) if (result == -1)
errno = vfs->name ? ferrno (vfs) : E_NOTSUPP; errno = vfs->name ? ferrno (vfs) : E_NOTSUPP;
return result; return result;
} else return -1;
} }
int mc_fstat (int handle, struct stat *buf) { int mc_fstat (int handle, struct stat *buf) {
@ -569,25 +840,40 @@ int mc_fstat (int handle, struct stat *buf) {
static const char * static const char *
_vfs_get_cwd (void) _vfs_get_cwd (void)
{ {
char *p; char *sys_cwd;
char *trans;
const char *encoding;
char *tmp;
int state;
struct stat my_stat, my_stat2; struct stat my_stat, my_stat2;
if (!_vfs_get_class (current_dir)) { trans = vfs_translate_path_n (current_dir); //add check if NULL
p = g_get_current_dir ();
if (!p) /* One of the directories in the path is not readable */ 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; return current_dir;
/* Otherwise check if it is O.K. to use the 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) || mc_stat (current_dir, &my_stat2)
|| my_stat.st_ino != my_stat2.st_ino || my_stat.st_ino != my_stat2.st_ino
|| my_stat.st_dev != my_stat2.st_dev) { || my_stat.st_dev != my_stat2.st_dev) {
g_free (current_dir); g_free (current_dir);
current_dir = p; current_dir = sys_cwd;
return p; return sys_cwd;
} /* Otherwise we return current_dir below */ }/* Otherwise we return current_dir below */
g_free (p); }
} }
}
g_free (trans);
return current_dir; return current_dir;
} }
@ -682,22 +968,27 @@ int
mc_chdir (const char *path) mc_chdir (const char *path)
{ {
char *new_dir; char *new_dir;
char *trans_dir;
struct vfs_class *old_vfs, *new_vfs; struct vfs_class *old_vfs, *new_vfs;
vfsid old_vfsid; vfsid old_vfsid;
int result; int result;
new_dir = vfs_canon (path); 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) { if (!new_vfs->chdir) {
g_free (new_dir); g_free (new_dir);
g_free (trans_dir);
return -1; return -1;
} }
result = (*new_vfs->chdir) (new_vfs, new_dir); result = (*new_vfs->chdir) (new_vfs, trans_dir);
if (result == -1) { if (result == -1) {
errno = ferrno (new_vfs); errno = ferrno (new_vfs);
g_free (new_dir); g_free (new_dir);
g_free (trans_dir);
return -1; return -1;
} }
@ -720,7 +1011,12 @@ mc_chdir (const char *path)
*p = 0; *p = 0;
} }
g_free (trans_dir);
return 0; return 0;
} else {
g_free (new_dir);
return -1;
}
} }
/* Return 1 is the current VFS class is local */ /* Return 1 is the current VFS class is local */
@ -737,10 +1033,12 @@ vfs_file_class_flags (const char *filename)
struct vfs_class *vfs; struct vfs_class *vfs;
char *fname; char *fname;
fname = vfs_canon (filename); fname = vfs_canon_and_translate (filename);
if (fname != NULL) {
vfs = vfs_get_class (fname); vfs = vfs_get_class (fname);
g_free (fname); g_free (fname);
return vfs->flags; return vfs->flags;
} else return -1;
} }
static char * static char *
@ -792,7 +1090,10 @@ char *
mc_getlocalcopy (const char *pathname) mc_getlocalcopy (const char *pathname)
{ {
char *result; 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); struct vfs_class *vfs = vfs_get_class (path);
result = vfs->getlocalcopy ? (*vfs->getlocalcopy)(vfs, path) : result = vfs->getlocalcopy ? (*vfs->getlocalcopy)(vfs, path) :
@ -801,6 +1102,7 @@ mc_getlocalcopy (const char *pathname)
if (!result) if (!result)
errno = ferrno (vfs); errno = ferrno (vfs);
return result; return result;
} else return NULL;
} }
static int static int
@ -854,7 +1156,10 @@ int
mc_ungetlocalcopy (const char *pathname, const char *local, int has_changed) mc_ungetlocalcopy (const char *pathname, const char *local, int has_changed)
{ {
int return_value = 0; 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); struct vfs_class *vfs = vfs_get_class (path);
return_value = vfs->ungetlocalcopy ? 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); mc_def_ungetlocalcopy (vfs, path, local, has_changed);
g_free (path); g_free (path);
return return_value; return return_value;
} else return -1;
} }
void void
vfs_init (void) vfs_init (void)
{ {
vfs_str_buffer = str_get_buffer ();
/* localfs needs to be the first one */ /* localfs needs to be the first one */
init_localfs(); init_localfs();
/* fallback value for vfs_get_class() */ /* fallback value for vfs_get_class() */
@ -911,6 +1218,8 @@ vfs_shut (void)
(*vfs->done) (vfs); (*vfs->done) (vfs);
g_slist_free (vfs_openfiles); g_slist_free (vfs_openfiles);
str_release_buffer (vfs_str_buffer);
} }
/* /*

Просмотреть файл

@ -10,6 +10,17 @@ char *mc_get_current_wd (char *buffer, int bufsize);
char *vfs_get_current_dir (void); char *vfs_get_current_dir (void);
int vfs_current_is_local (void); int vfs_current_is_local (void);
int vfs_file_is_local (const char *filename); 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 */ /* Only the routines outside of the VFS module need the emulation macros */