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
Этот коммит содержится в:
Коммит
3b5e2c052f
55
acinclude.m4
55
acinclude.m4
@ -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
|
||||||
;;
|
;;
|
||||||
|
2240
doc/es/mc.1.in
2240
doc/es/mc.1.in
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
460
doc/es/xnc.hlp
460
doc/es/xnc.hlp
@ -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
|
||||||
qqqqqqCommanderqj
|
qqqqqqCommanderqj
|
||||||
|
|
||||||
╔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 GARANT═A
|
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 T╔RMINOS Y CONDICIONES
|
FIN DE TÉRMINOS Y CONDICIONES
|
||||||
|
|
||||||
Apщndice: Cєmo aplicar estos tщrminos a sus nuevos programas.
|
Apéndice: Cómo aplicar estos términos a sus nuevos programas.
|
||||||
|
|
||||||
Si usted desarrolla un nuevo Programa, y quiere que sea del
|
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:
|
||||||
|
3654
doc/hu/mc.1.in
3654
doc/hu/mc.1.in
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
@ -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
|
||||||
qqqqqqCommanderqj
|
qqqqqqCommanderqj
|
||||||
|
|
||||||
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
|
||||||
|
1022
doc/it/mc.1.in
1022
doc/it/mc.1.in
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
@ -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
|
||||||
qqqqqqCommanderqj
|
qqqqqqCommanderqj
|
||||||
|
|
||||||
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.
|
||||||
|
2834
doc/pl/mc.1.in
2834
doc/pl/mc.1.in
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
758
doc/pl/xnc.hlp
758
doc/pl/xnc.hlp
@ -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
|
||||||
qqqqqqCommanderqj
|
qqqqqqCommanderqj
|
||||||
|
|
||||||
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
|
||||||
tre╢ciContents 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 t│umaczenie
|
GNU General Public LicenseLicense (jej nieoficjalne tłumaczenie
|
||||||
znajdziesz tutajLicense-pl).
|
znajdziesz tutajLicense-pl).
|
||||||
|
|
||||||
[License]
|
[License]
|
||||||
Licencja
|
Licencja
|
||||||
|
|
||||||
Nieoficjalne polskie t│umacznie 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 t│umaczenie licencji
|
Nieoficjalne tłumaczenie licencji
|
||||||
|
|
||||||
Uwaga: To jest nieoficjalne t│umaczenie 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 stosuj▒cego 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. T│umaczenie 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.
|
||||||
|
|
||||||
Preambu│a
|
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: ka┐demu 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, nadaj▒c 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 u┐ytku 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
|
||||||
pochodz▒cej 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ą,
|
||||||
zale┐y 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) Je┐eli 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 podwa┐anie 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 no╢nika 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 wyj▒tek 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ż
|
||||||
otrzyma│y 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, je┐eli 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 ka┐dym 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 wnios│o
|
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, maj▒c 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 po╢rednictwem innego
|
rozprowadzania oprogramowania za pośrednictwem innego
|
||||||
systemu i licencjobiorca nie mo┐e 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 u┐ywanie 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, odnosz▒cy
|
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.
|
||||||
|
|
||||||
|
|
||||||
WYR╙B 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
|
||||||
NIEZB╩DNEGO 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 OG╙LNE, 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 WARUNK╙W
|
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; ka┐dy 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); je╢li 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łą.
|
||||||
|
|
||||||
Je╢li 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 okre╢lonych 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".
|
||||||
|
|
||||||
Powy┐sze 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. Poni┐ej
|
"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
|
||||||
odno╢nik. 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
|
||||||
przegl▒darki pomocy.
|
przeglądarki pomocy.
|
||||||
|
|
||||||
Lewy przycisk myszy uaktywnia odno╢nik 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 tak┐e
|
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 odno╢nik.
|
prawo, enter Uaktywnia odnośnik.
|
||||||
lewo, l Poprzedni wъze│ w historii.
|
lewo, l Poprzedni węzeł w historii.
|
||||||
F1 Pomoc dla przegl▒darki 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
Обычный файл
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) многобайтные
|
||||||
|
|
||||||
|
ИМХО бред. Нужно, чтобы не было различий между кодировками.
|
||||||
|
подумаю ещё как...
|
||||||
|
|
4644
doc/ru/mc.1.in
4644
doc/ru/mc.1.in
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
866
doc/ru/xnc.hlp
866
doc/ru/xnc.hlp
@ -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
|
||||||
qqqqqqCommanderqj
|
qqqqqqCommanderqj
|
||||||
|
|
||||||
ў┘ ╙┼╩▐┴╙ ╫╔─╔╘┼ ╟╠┴╫╬╧┼ ╧╦╬╧ ╔╬╘┼╥┴╦╘╔╫╬╧╩ ╨╧─╙╦┴┌╦╔
|
Вы сейчас видите главное окно интерактивной подсказки
|
||||||
╨╥╧╟╥┴══┘ 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 Выход из окна просмотра подсказки.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
4112
doc/sr/mc.1.in
4112
doc/sr/mc.1.in
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
828
doc/sr/xnc.hlp
828
doc/sr/xnc.hlp
@ -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
|
||||||
|
180
edit/editmenu.c
180
edit/editmenu.c
@ -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э pou╛ijte 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: Pou╛itэ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)? Pou╛ijte 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, pou╛ijte 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-! m∙╛ete 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 m∙╛e b¤t upraveno. Z 'man mc' se dozvэte vэce.
|
Tip: Zobrazení v panelech může být upraveno. Z 'man mc' se dozvíte více.
|
||||||
Tip: %D/%T se rozvine na soubory oznaшenщ v druhщm panelu.
|
Tip: %D/%T se rozvine na soubory označené v druhém panelu.
|
||||||
Tip: Chcete opьt vс╣ shell? Stisknьte C-o. Do MC se vrсtэte opьt p°es C-o.
|
Tip: Chcete opět váš shell? Stiskněte C-o. Do MC se vrátíte opět přes C-o.
|
||||||
Tip: Nastavenэm promьnnщ CDPATH m∙╛ete ╣et°it klсvesnici.
|
Tip: 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шэ ~). Pou╛ijte Nastavenэ.
|
Tip: Chcete vidět zálohy svých souborů (končí ~). Použijte Nastavení.
|
||||||
Tip: DoplЄovсnэ funguje ve vstupnэch °сdkсch v╣ech dialog∙. Pou╛ijte M-Tab.
|
Tip: 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 m∙╛ete pracovat. Stisknьte tlaшэtko Panelizace.
|
Tip: S nalezenými soubory můžete pracovat. Stiskněte tlačítko Panelizace.
|
||||||
Tip: Pro opravdu slo╛itщ operace zkuste p°эkaz P°эkaz/Externэ panelizace.
|
Tip: 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э, pou╛ijte 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э╛eш urшэte promьnnou PAGER.
|
Tip: Externí prohlížeč určíte proměnnou PAGER.
|
||||||
Tip: V╣echny ╛сdosti o potvrzenэ m∙╛ete 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 m∙╛ete dostat i p°es C-\.
|
Tip: K seznam často používaných adresářů se můžete dostat i přes C-\.
|
||||||
Tip: Na anonymnэ FTP se p°ipojэte pomocэ 'cd /#ftp:stroj.domena.cz'
|
Tip: 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э m∙╛ete 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 vlo╛enэ 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с°∙ m∙╛ete mэt i шasto nav╣tь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+nú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 "B·squedas externas".
|
Ayudita: Puede hacer y guardar búsquedas complejas con "Búsquedas externas".
|
||||||
Ayudita: Con M-c cambiar de directorio es un poco mсs cєmodo.
|
Ayudita: Con M-c cambiar de directorio es un poco más cómodo.
|
||||||
Nota: Las instrucciones de la Shell no funcionan fuera del sistema local.
|
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 MAY┌SCULAS.
|
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ъ bie┐▒cej ╢cie┐ki do wiersza poleceё.
|
Porada: Za pomocą C-x p kopiuje się nazwę bieżącej ścieżki do wiersza poleceń.
|
||||||
Porada: Uzupe│nianie: M-Tab (lub Esc+Tab). Podwєjne wci╢niъcie wywo│uje listъ.
|
Porada: 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 mo┐na uzyskaц naciskaj▒c Contrl-q i odpowiedni znak.
|
Porada: Cytowanie znaku można uzyskać naciskając Contrl-q i odpowiedni znak.
|
||||||
Porada: Zmъczony poradami? Wy│▒cz je w menu Opcje|Uk│ad...
|
Porada: Zmęczony poradami? Wyłącz je w menu Opcje|Układ...
|
||||||
Porada: Wybieranie katalogєw: dodaj uko╢nik na koёcu wzorca dopasowania.
|
Porada: Wybieranie katalogów: dodaj ukośnik na końcu wzorca dopasowania.
|
||||||
Porada: Je╢li w twoim terminalu brak klawiszy funkcyjnych, u┐yj Esc+numer.
|
Porada: 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) wysy│aj 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ъ bie┐▒cy panel.
|
Porada: Za pomocą klawisza Tab zmienia się bieżący panel.
|
||||||
Porada: VFS: naci╢nij 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 % dzia│aj▒ nawet w wierszu poleceё.
|
Porada: Makra % działają nawet w wierszu poleceń.
|
||||||
Porada: M-! pozwala na podgl▒d wyj╢cia uruchamianych programєw w przegl▒darce.
|
Porada: M-! pozwala na podgląd wyjścia uruchamianych programów w przeglądarce.
|
||||||
Porada: Tryb wy╢wietlania listy plikєw mo┐na dostosowywaц: zobacz "man mc".
|
Porada: 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 zwyk│ej pow│oki 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 mo┐e ci zaoszczъdziц pisania.
|
Porada: Ustawienie zmiennej CDPATH może ci zaoszczędzić pisania.
|
||||||
Porada: Je╢li chcesz zobaczyц pliki .*, zmieё ustawienie w menu Konfiguracja...
|
Porada: Jeśli chcesz zobaczyć pliki .*, zmień ustawienie w menu Konfiguracja...
|
||||||
Porada: Je╢li chcesz zobaczyц pliki .*~, zmieё ustawienie w menu Konfiguracja...
|
Porada: Jeśli chcesz zobaczyć pliki .*~, zmień ustawienie w menu Konfiguracja...
|
||||||
Porada: Uzupe│nianie dzia│a wszъdzie. Po prostu naci╢nij M-Tab.
|
Porada: Uzupełnianie działa wszędzie. Po prostu naciśnij M-Tab.
|
||||||
Porada: Je╢li masz powolny terminal, sprєbuj u┐yц opcji -s.
|
Porada: 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┐yц z│o┐onego wyszukiwania? U┐yj polecenia Filtr zewnъtrzny.
|
Porada: Chcesz użyć złożonego wyszukiwania? Użyj polecenia Filtr zewnętrzny.
|
||||||
Porada: Je╢li chcesz szybciej zmieniaц ╢cie┐kъ, u┐yj M-c (szybka zmiana katalogu).
|
Porada: Jeśli chcesz szybciej zmieniać ścieżkę, użyj M-c (szybka zmiana katalogu).
|
||||||
Porada: Polecenia pow│oki dzia│aj▒ tylko w lokalnym systemie plikєw.
|
Porada: 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 dzia│aj▒? Patrz menu Opcje|Definiuj klawisze...
|
Porada: Niektóre klawisze nie działają? Patrz menu Opcje|Definiuj klawisze...
|
||||||
Porada: Aby obejrzeц wyj╢cie polecenia w przegl▒darce u┐yj M-!
|
Porada: Aby obejrzeć wyjście polecenia w przeglądarce użyj M-!
|
||||||
Porada: F13 (lub Shift-F3) wywo│uje przegl▒darkъ w trybie surowym.
|
Porada: F13 (lub Shift-F3) wywołuje przeglądarkę w trybie surowym.
|
||||||
Porada: Mo┐esz okre╢liц edytor pod F4 przez zmienn▒ pow│oki EDITOR.
|
Porada: Możesz określić edytor pod F4 przez zmienną powłoki EDITOR.
|
||||||
Porada: Mo┐esz okre╢liц zewnъtrzn▒ przegl▒darkъ przez zmienn▒ pow│oki PAGER.
|
Porada: Możesz określić zewnętrzną przeglądarkę przez zmienną powłoki PAGER.
|
||||||
Porada: Mo┐esz wy│▒czyц ┐▒dania potwierdzenia przez menu Opcje|Potwierdzanie...
|
Porada: Możesz wyłączyć żądania potwierdzenia przez menu Opcje|Potwierdzanie...
|
||||||
Porada: Przejd╝ do listy najczъ╢ciej u┐ywanych katalogєw przez C-\.
|
Porada: Przejdź do listy najczęściej używanych katalogów przez C-\.
|
||||||
Porada: Z anonimowego FTP korzystamy pisz▒c 'cd /#ftp:machine.edu'
|
Porada: Z anonimowego FTP korzystamy pisząc 'cd /#ftp:machine.edu'
|
||||||
Porada: MC ma wbudowan▒ obs│ugъ FTP; patrz menu Plik, Po│▒czenie FTP...
|
Porada: MC ma wbudowaną obsługę FTP; patrz menu Plik, Połączenie FTP...
|
||||||
Porada: M-t prze│▒cza tryby wy╢wietlania listy plikєw.
|
Porada: M-t przełącza tryby wyświetlania listy plików.
|
||||||
Porada: U┐ytkownika FTP okre╢lamy przez: 'cd /#ftp:user@machine.edu'
|
Porada: Użytkownika FTP określamy przez: 'cd /#ftp:user@machine.edu'
|
||||||
Porada: Pakiety RPM przegl▒damy naciskaj▒c na nich Enter.
|
Porada: Pakiety RPM przeglądamy naciskając na nich Enter.
|
||||||
Porada: Aby zazanaczyц katalogi w oknie dialogowym zaznaczania dodaj uko╢nik.
|
Porada: Aby zazanaczyć katalogi w oknie dialogowym zaznaczania dodaj ukośnik.
|
||||||
Porada: U┐ywanie kopiowania i wklejania za pomoc▒ myszy mo┐e wymagaц Shifta.
|
Porada: 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 URL:http://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)
|
||||||
|
15
src/achown.c
15
src/achown.c
@ -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 */
|
||||||
|
55
src/boxes.c
55
src/boxes.c
@ -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));
|
||||||
|
83
src/cmd.c
83
src/cmd.c
@ -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
|
||||||
|
414
src/complete.c
414
src/complete.c
@ -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
|
||||||
|
13
src/dialog.c
13
src/dialog.c
@ -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
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 ();
|
||||||
|
23
src/dir.h
23
src/dir.h
@ -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 {
|
||||||
|
150
src/file.c
150
src/file.c
@ -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);
|
||||||
|
38
src/find.c
38
src/find.c
@ -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);
|
||||||
|
86
src/help.c
86
src/help.c
@ -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;
|
||||||
|
|
||||||
|
113
src/hotlist.c
113
src/hotlist.c
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
37
src/info.c
37
src/info.c
@ -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;
|
||||||
|
48
src/layout.c
48
src/layout.c
@ -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;
|
||||||
|
186
src/main.c
186
src/main.c
@ -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);
|
||||||
|
|
||||||
|
131
src/menu.c
131
src/menu.c
@ -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;
|
||||||
|
21
src/option.c
21
src/option.c
@ -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;
|
||||||
}
|
}
|
||||||
|
258
src/screen.c
258
src/screen.c
@ -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
Обычный файл
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
Обычный файл
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
Обычный файл
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
Обычный файл
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
Обычный файл
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 */
|
||||||
|
17
src/tree.c
17
src/tree.c
@ -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);
|
||||||
|
31
src/user.c
31
src/user.c
@ -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;
|
||||||
|
128
src/util.c
128
src/util.c
@ -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
2004
src/view.c
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
594
src/widget.c
594
src/widget.c
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
44
src/widget.h
44
src/widget.h
@ -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;
|
||||||
}
|
}
|
||||||
|
17
src/wtools.c
17
src/wtools.c
@ -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
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
11
vfs/vfs.h
11
vfs/vfs.h
@ -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 */
|
||||||
|
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user