mirror of
https://github.com/MidnightCommander/mc
synced 2024-12-22 12:32:40 +03:00
Merge branch 'utf-8' into master
resolve conflicts: configure.ac src/complete.c src/file.c src/layout.c src/main.c src/menu.c src/screen.c src/util.c src/widget.c src/widget.h
This commit is contained in:
commit
3b5e2c052f
55
acinclude.m4
55
acinclude.m4
@ -428,13 +428,20 @@ dnl
|
||||
AC_DEFUN([MC_WITH_NCURSES], [
|
||||
dnl has_colors() is specific to ncurses, it's not in the old curses
|
||||
save_LIBS="$LIBS"
|
||||
ncursesw_found=
|
||||
LIBS=
|
||||
AC_SEARCH_LIBS([addwstr], [ncursesw ncurses curses], [MCLIBS="$MCLIBS $LIBS";ncursesw_found=yes],
|
||||
[AC_MSG_WARN([Cannot find ncurses library, that support wide characters])])
|
||||
|
||||
if test -z "$ncursesw_found"; then
|
||||
LIBS=
|
||||
AC_SEARCH_LIBS([has_colors], [ncurses curses], [MCLIBS="$MCLIBS $LIBS"],
|
||||
[AC_MSG_ERROR([Cannot find ncurses library])])
|
||||
fi
|
||||
|
||||
dnl Check the header
|
||||
ncurses_h_found=
|
||||
AC_CHECK_HEADERS([ncurses/curses.h ncurses.h curses.h],
|
||||
AC_CHECK_HEADERS([ncursesw/curses.h ncurses/curses.h ncurses.h curses.h],
|
||||
[ncurses_h_found=yes; break])
|
||||
|
||||
if test -z "$ncurses_h_found"; then
|
||||
@ -464,6 +471,52 @@ AC_DEFUN([MC_WITH_NCURSES], [
|
||||
LIBS="$save_LIBS"
|
||||
])
|
||||
|
||||
dnl
|
||||
dnl Use the ncurses library. It can only be requested explicitly,
|
||||
dnl so just fail if anything goes wrong.
|
||||
dnl
|
||||
dnl If ncurses exports the ESCDELAY variable it should be set to 0
|
||||
dnl or you'll have to press Esc three times to dismiss a dialog box.
|
||||
dnl
|
||||
AC_DEFUN([MC_WITH_NCURSESW], [
|
||||
dnl has_colors() is specific to ncurses, it's not in the old curses
|
||||
save_LIBS="$LIBS"
|
||||
LIBS=
|
||||
AC_SEARCH_LIBS([has_colors], [ncursesw], [MCLIBS="$MCLIBS $LIBS"],
|
||||
[AC_MSG_ERROR([Cannot find ncursesw library])])
|
||||
|
||||
dnl Check the header
|
||||
ncurses_h_found=
|
||||
AC_CHECK_HEADERS([ncursesw/curses.h],
|
||||
[ncursesw_h_found=yes; break])
|
||||
|
||||
if test -z "$ncursesw_h_found"; then
|
||||
AC_MSG_ERROR([Cannot find ncursesw header file])
|
||||
fi
|
||||
|
||||
screen_type=ncursesw
|
||||
screen_msg="ncursesw library"
|
||||
AC_DEFINE(USE_NCURSESW, 1,
|
||||
[Define to use ncursesw for screen management])
|
||||
|
||||
AC_CACHE_CHECK([for ESCDELAY variable],
|
||||
[mc_cv_ncursesw_escdelay],
|
||||
[AC_TRY_LINK([], [
|
||||
extern int ESCDELAY;
|
||||
ESCDELAY = 0;
|
||||
],
|
||||
[mc_cv_ncursesw_escdelay=yes],
|
||||
[mc_cv_ncursesw_escdelay=no])
|
||||
])
|
||||
if test "$mc_cv_ncursesw_escdelay" = yes; then
|
||||
AC_DEFINE(HAVE_ESCDELAY, 1,
|
||||
[Define if ncursesw has ESCDELAY variable])
|
||||
fi
|
||||
|
||||
AC_CHECK_FUNCS(resizeterm)
|
||||
LIBS="$save_LIBS"
|
||||
])
|
||||
|
||||
|
||||
dnl
|
||||
dnl Check for ext2fs recovery code
|
||||
|
@ -459,6 +459,9 @@ xslang)
|
||||
xncurses)
|
||||
MC_WITH_NCURSES
|
||||
;;
|
||||
xncursesw)
|
||||
MC_WITH_NCURSESW
|
||||
;;
|
||||
x)
|
||||
MC_WITH_SLANG
|
||||
;;
|
||||
|
2240
doc/es/mc.1.in
2240
doc/es/mc.1.in
File diff suppressed because it is too large
Load Diff
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
|
||||
qqqqqqCommanderqj
|
||||
|
||||
Ésta es la pantalla de inicio de la ayuda de
|
||||
Ésta es la pantalla de inicio de la ayuda de
|
||||
GNU Midnight Commander.
|
||||
|
||||
Puede pulsar la tecla IntroHow to use help para aprender a navegar por el
|
||||
@ -15,11 +15,11 @@ sistema de ayuda, o acceder directamente a los contenidosContents.
|
||||
|
||||
GNU Midnight Commander es obra de sus numerosos autoresAUTHORS.
|
||||
|
||||
GNU Midnight Commander NO INCLUYE NINGÚN TIPO DE GARANTÍAWarranty,
|
||||
es software libre, y se alienta su redistribución en los
|
||||
terminos y condiciones que están contenidos en la Licencia
|
||||
Pública General de GNU (GPL)Licencia GNU, de la que existe una
|
||||
traducción no oficial al españolLicencia GNU (Español).[Licencia GNU]
|
||||
GNU Midnight Commander NO INCLUYE NINGÚN TIPO DE GARANTÍAWarranty,
|
||||
es software libre, y se alienta su redistribución en los
|
||||
terminos y condiciones que están contenidos en la Licencia
|
||||
Pública General de GNU (GPL)Licencia GNU, de la que existe una
|
||||
traducción no oficial al españolLicencia GNU (Español).[Licencia GNU]
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
@ -430,26 +430,26 @@ to permit linking proprietary applications with the
|
||||
library. If this is what you want to do, use the GNU
|
||||
Library General Public License instead of this License.
|
||||
|
||||
[Licencia GNU (Español)]
|
||||
[Licencia GNU (Español)]
|
||||
|
||||
Licencia Pública GNU
|
||||
Licencia Pública GNU
|
||||
|
||||
Esta es la conocida como GNU Public License (GPL), versión 2
|
||||
Esta es la conocida como GNU Public License (GPL), versión 2
|
||||
(de junio de 1.991), que cubre la mayor parte del software de
|
||||
la Free Software Foundation, y muchos más programas.
|
||||
la Free Software Foundation, y muchos más programas.
|
||||
|
||||
---
|
||||
|
||||
NOTA IMPORTANTE:
|
||||
|
||||
Esta es una traducción no oficial al español de la GNU General
|
||||
Esta es una traducción no oficial al español de la GNU General
|
||||
Public LicenseLicencia GNU.
|
||||
|
||||
No ha sido publicada por la Free Software Foundation, y no
|
||||
establece legalmente las condiciones de distribución para el
|
||||
establece legalmente las condiciones de distribución para el
|
||||
software que usa la GNU GPL. Estas condiciones se establecen
|
||||
solamente por el texto original, en inglés, de la GNU GPL. Sin
|
||||
embargo, esperamos que esta traducción ayude a los
|
||||
solamente por el texto original, en inglés, de la GNU GPL. Sin
|
||||
embargo, esperamos que esta traducción ayude a los
|
||||
hispanohablantes a entender mejor la GNU GPL.
|
||||
|
||||
|
||||
@ -468,31 +468,31 @@ understand the GNU GPL better.
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51
|
||||
Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Se permite la copia y distribución de copias literales de este
|
||||
documento, pero no se permite su modificación.
|
||||
Se permite la copia y distribución de copias literales de este
|
||||
documento, pero no se permite su modificación.
|
||||
|
||||
Preámbulo
|
||||
Preámbulo
|
||||
|
||||
Las licencias que cubren la mayor parte del software están
|
||||
diseñadas para quitarle a usted la libertad de compartirlo y
|
||||
modificarlo. Por el contrario, la Licencia Pública General de
|
||||
Las licencias que cubren la mayor parte del software están
|
||||
diseñadas para quitarle a usted la libertad de compartirlo y
|
||||
modificarlo. Por el contrario, la Licencia Pública General de
|
||||
GNU pretende garantizarle la libertad de compartir y modificar
|
||||
software libre, para asegurar que el software es libre para
|
||||
todos sus usuarios. Esta Licencia Pública General se aplica a
|
||||
todos sus usuarios. Esta Licencia Pública General se aplica a
|
||||
la mayor parte del software de la Free Software Foundation y a
|
||||
cualquier otro programa si sus autores se comprometen a
|
||||
utilizarla. (Existe otro software de la Free Software
|
||||
Foundation que está cubierto por la Licencia Pública General
|
||||
de GNU para Bibliotecas). Si quiere, también puede aplicarla a
|
||||
Foundation que está cubierto por la Licencia Pública General
|
||||
de GNU para Bibliotecas). Si quiere, también puede aplicarla a
|
||||
sus propios programas.
|
||||
|
||||
Cuando hablamos de software libre, estamos refiriéndonos a
|
||||
libertad, no a precio. Nuestras Licencias Públicas Generales
|
||||
están diseñadas para asegurarnos de que tenga la libertad de
|
||||
Cuando hablamos de software libre, estamos refiriéndonos a
|
||||
libertad, no a precio. Nuestras Licencias Públicas Generales
|
||||
están diseñadas para asegurarnos de que tenga la libertad de
|
||||
distribuir copias de software libre (y cobrar por ese servicio
|
||||
si quiere), de que reciba el código fuente o que pueda
|
||||
si quiere), de que reciba el código fuente o que pueda
|
||||
conseguirlo si lo quiere, de que pueda modificar el software o
|
||||
usar fragmentos de él en nuevos programas libres, y de que
|
||||
usar fragmentos de él en nuevos programas libres, y de que
|
||||
sepa que puede hacer todas estas cosas.
|
||||
|
||||
Para proteger sus derechos necesitamos algunas restricciones
|
||||
@ -502,29 +502,29 @@ en ciertas obligaciones que le afectan si distribuye copias
|
||||
del software, o si lo modifica.
|
||||
|
||||
Por ejemplo, si distribuye copias de uno de estos programas,
|
||||
sea gratuitamente, o a cambio de una contraprestación, debe
|
||||
sea gratuitamente, o a cambio de una contraprestación, debe
|
||||
dar a los receptores todos los derechos que tiene. Debe
|
||||
asegurarse de que ellos también reciben, o pueden conseguir,
|
||||
el código fuente. Y debe mostrarles estas condiciones de forma
|
||||
asegurarse de que ellos también reciben, o pueden conseguir,
|
||||
el código fuente. Y debe mostrarles estas condiciones de forma
|
||||
que conozcan sus derechos.
|
||||
|
||||
Protegemos sus derechos con la combinación de dos medidas:
|
||||
Protegemos sus derechos con la combinación de dos medidas:
|
||||
|
||||
1. Ponemos el software bajo copyright y
|
||||
|
||||
2. le ofrecemos esta licencia, que le da permiso legal para
|
||||
copiar, distribuir y/o modificar el software.
|
||||
|
||||
También, para la protección de cada autor y la nuestra propia,
|
||||
También, para la protección de cada autor y la nuestra propia,
|
||||
queremos asegurarnos de que todo el mundo comprende que no se
|
||||
proporciona ninguna garantía para este software libre. Si el
|
||||
software se modifica por cualquiera y éste a su vez lo
|
||||
proporciona ninguna garantía para este software libre. Si el
|
||||
software se modifica por cualquiera y éste a su vez lo
|
||||
distribuye, queremos que sus receptores sepan que lo que
|
||||
tienen no es el original, de forma que cualquier problema
|
||||
introducido por otros no afecte a la reputación de los autores
|
||||
introducido por otros no afecte a la reputación de los autores
|
||||
originales.
|
||||
|
||||
Por último, cualquier programa libre está constantemente
|
||||
Por último, cualquier programa libre está constantemente
|
||||
amenazado por patentes sobre el software. Queremos evitar el
|
||||
peligro de que los redistribuidores de un programa libre
|
||||
obtengan patentes por su cuenta, convirtiendo de facto el
|
||||
@ -532,52 +532,52 @@ programa en propietario. Para evitar esto, hemos dejado claro
|
||||
que cualquier patente debe ser pedida para el uso libre de
|
||||
cualquiera, o no ser pedida.
|
||||
|
||||
Los términos exactos y las condiciones para la copia,
|
||||
distribución y modificación se exponen a continuación.
|
||||
Los términos exactos y las condiciones para la copia,
|
||||
distribución y modificación se exponen a continuación.
|
||||
|
||||
Términos y condiciones para la copia, distribución y
|
||||
modificación
|
||||
Términos y condiciones para la copia, distribución y
|
||||
modificación
|
||||
|
||||
1. Esta Licencia se aplica a cualquier programa u otro tipo de
|
||||
trabajo que contenga una nota colocada por el tenedor del
|
||||
copyright diciendo que puede ser distribuido bajo los términos
|
||||
de esta Licencia Pública General. En adelante, «Programa» se
|
||||
referirá a cualquier programa o trabajo que cumpla esa
|
||||
condición y «trabajo basado en el Programa» se referirá bien
|
||||
al Programa o a cualquier trabajo derivado de él según la ley
|
||||
copyright diciendo que puede ser distribuido bajo los términos
|
||||
de esta Licencia Pública General. En adelante, «Programa» se
|
||||
referirá a cualquier programa o trabajo que cumpla esa
|
||||
condición y «trabajo basado en el Programa» se referirá bien
|
||||
al Programa o a cualquier trabajo derivado de él según la ley
|
||||
de copyright. Esto es, un trabajo que contenga el programa o
|
||||
una porción de él, bien en forma literal o con modificaciones
|
||||
y/o traducido en otro lenguaje. Por lo tanto, la traducción
|
||||
está incluida sin limitaciones en el término «modificación».
|
||||
Cada concesionario (licenciatario) será denominado «usted».
|
||||
una porción de él, bien en forma literal o con modificaciones
|
||||
y/o traducido en otro lenguaje. Por lo tanto, la traducción
|
||||
está incluida sin limitaciones en el término «modificación».
|
||||
Cada concesionario (licenciatario) será denominado «usted».
|
||||
|
||||
Cualquier otra actividad que no sea la copia, distribución o
|
||||
modificación no está cubierta por esta Licencia, está fuera de
|
||||
su ámbito. El acto de ejecutar el Programa no está
|
||||
restringido, y los resultados del Programa están cubiertos
|
||||
únicamente si sus contenidos constituyen un trabajo basado en
|
||||
Cualquier otra actividad que no sea la copia, distribución o
|
||||
modificación no está cubierta por esta Licencia, está fuera de
|
||||
su ámbito. El acto de ejecutar el Programa no está
|
||||
restringido, y los resultados del Programa están cubiertos
|
||||
únicamente si sus contenidos constituyen un trabajo basado en
|
||||
el Programa, independientemente de haberlo producido mediante
|
||||
la ejecución del programa. El que esto se cumpla, depende de
|
||||
la ejecución del programa. El que esto se cumpla, depende de
|
||||
lo que haga el programa.
|
||||
|
||||
2. Usted puede copiar y distribuir copias literales del código
|
||||
fuente del Programa, según lo has recibido, en cualquier
|
||||
2. Usted puede copiar y distribuir copias literales del código
|
||||
fuente del Programa, según lo has recibido, en cualquier
|
||||
medio, supuesto que de forma adecuada y bien visible publique
|
||||
en cada copia un anuncio de copyright adecuado y un repudio de
|
||||
garantía, mantenga intactos todos los anuncios que se refieran
|
||||
a esta Licencia y a la ausencia de garantía, y proporcione a
|
||||
garantía, mantenga intactos todos los anuncios que se refieran
|
||||
a esta Licencia y a la ausencia de garantía, y proporcione a
|
||||
cualquier otro receptor del programa una copia de esta
|
||||
Licencia junto con el Programa.
|
||||
|
||||
Puede cobrar un precio por el acto físico de transferir una
|
||||
copia, y puede, según su libre albedrío, ofrecer garantía a
|
||||
Puede cobrar un precio por el acto físico de transferir una
|
||||
copia, y puede, según su libre albedrío, ofrecer garantía a
|
||||
cambio de unos honorarios.
|
||||
|
||||
3. Puede modificar su copia o copias del Programa o de
|
||||
cualquier porción de él, formando de esta manera un trabajo
|
||||
basado en el Programa, y copiar y distribuir esa modificación
|
||||
o trabajo bajo los términos del apartado 1, antedicho,
|
||||
supuesto que además cumpla las siguientes condiciones:
|
||||
cualquier porción de él, formando de esta manera un trabajo
|
||||
basado en el Programa, y copiar y distribuir esa modificación
|
||||
o trabajo bajo los términos del apartado 1, antedicho,
|
||||
supuesto que además cumpla las siguientes condiciones:
|
||||
|
||||
a. Debe hacer que los ficheros modificados lleven anuncios
|
||||
prominentes indicando que los ha cambiado y la fecha de
|
||||
@ -585,342 +585,342 @@ cualquier cambio.
|
||||
|
||||
b. Debe hacer que cualquier trabajo que distribuya o publique
|
||||
y que en todo o en parte contenga o sea derivado del Programa
|
||||
o de cualquier parte de él sea licenciada como un todo, sin
|
||||
carga alguna, a todas las terceras partes y bajo los términos
|
||||
o de cualquier parte de él sea licenciada como un todo, sin
|
||||
carga alguna, a todas las terceras partes y bajo los términos
|
||||
de esta Licencia.
|
||||
|
||||
c. Si el programa modificado lee normalmente órdenes
|
||||
c. Si el programa modificado lee normalmente órdenes
|
||||
interactivamente cuando es ejecutado, debe hacer que, cuando
|
||||
comience su ejecución para ese uso interactivo de la forma más
|
||||
comience su ejecución para ese uso interactivo de la forma más
|
||||
habitual, muestre o escriba un mensaje que incluya un anuncio
|
||||
de copyright y un anuncio de que no se ofrece ninguna garantía
|
||||
(o por el contrario que sí se ofrece garantía) y que los
|
||||
de copyright y un anuncio de que no se ofrece ninguna garantía
|
||||
(o por el contrario que sí se ofrece garantía) y que los
|
||||
usuarios pueden redistribuir el programa bajo estas
|
||||
condiciones, e indicando al usuario cómo ver una copia de esta
|
||||
licencia. (Excepción: si el propio programa es interactivo
|
||||
condiciones, e indicando al usuario cómo ver una copia de esta
|
||||
licencia. (Excepción: si el propio programa es interactivo
|
||||
pero normalmente no muestra ese anuncio, no se requiere que su
|
||||
trabajo basado en el Programa muestre ningún anuncio).
|
||||
trabajo basado en el Programa muestre ningún anuncio).
|
||||
|
||||
Estos requisitos se aplican al trabajo modificado como un
|
||||
todo. Si partes identificables de ese trabajo no son derivadas
|
||||
del Programa, y pueden, razonablemente, ser consideradas
|
||||
trabajos independientes y separados por ellos mismos, entonces
|
||||
esta Licencia y sus términos no se aplican a esas partes
|
||||
esta Licencia y sus términos no se aplican a esas partes
|
||||
cuando sean distribuidas como trabajos separados. Pero cuando
|
||||
distribuya esas mismas secciones como partes de un todo que es
|
||||
un trabajo basado en el Programa, la distribución del todo
|
||||
debe ser según los términos de esta licencia, cuyos permisos
|
||||
un trabajo basado en el Programa, la distribución del todo
|
||||
debe ser según los términos de esta licencia, cuyos permisos
|
||||
para otros licenciatarios se extienden al todo completo, y por
|
||||
lo tanto a todas y cada una de sus partes, con independencia
|
||||
de quién la escribió.
|
||||
de quién la escribió.
|
||||
|
||||
Por lo tanto, no es la intención de este apartado reclamar
|
||||
Por lo tanto, no es la intención de este apartado reclamar
|
||||
derechos o desafiar sus derechos sobre trabajos escritos
|
||||
totalmente por usted mismo. El intento es ejercer el derecho a
|
||||
controlar la distribución de trabajos derivados o colectivos
|
||||
controlar la distribución de trabajos derivados o colectivos
|
||||
basados en el Programa.
|
||||
|
||||
Además, el simple hecho de reunir un trabajo no basado en el
|
||||
Además, el simple hecho de reunir un trabajo no basado en el
|
||||
Programa con el Programa (o con un trabajo basado en el
|
||||
Programa) en un volumen de almacenamiento o en un medio de
|
||||
distribución no hace que dicho trabajo entre dentro del ámbito
|
||||
distribución no hace que dicho trabajo entre dentro del ámbito
|
||||
cubierto por esta Licencia.
|
||||
|
||||
4. Puede copiar y distribuir el Programa (o un trabajo basado
|
||||
en él, según se especifica en el apartado 2, como código
|
||||
objeto o en formato ejecutable según los términos de los
|
||||
apartados 1 y 2, supuesto que además cumpla una de las
|
||||
en él, según se especifica en el apartado 2, como código
|
||||
objeto o en formato ejecutable según los términos de los
|
||||
apartados 1 y 2, supuesto que además cumpla una de las
|
||||
siguientes condiciones:
|
||||
|
||||
a. Acompañarlo con el código fuente completo correspondiente,
|
||||
en formato electrónico, que debe ser distribuido según se
|
||||
a. Acompañarlo con el código fuente completo correspondiente,
|
||||
en formato electrónico, que debe ser distribuido según se
|
||||
especifica en los apartados 1 y 2 de esta Licencia en un medio
|
||||
habitualmente utilizado para el intercambio de programas, o
|
||||
|
||||
b. Acompañarlo con una oferta por escrito, válida durante al
|
||||
menos tres años, de proporcionar a cualquier tercera parte una
|
||||
copia completa en formato electrónico del código fuente
|
||||
b. Acompañarlo con una oferta por escrito, válida durante al
|
||||
menos tres años, de proporcionar a cualquier tercera parte una
|
||||
copia completa en formato electrónico del código fuente
|
||||
correspondiente, a un coste no mayor que el de realizar
|
||||
físicamente la distribución del fuente, que será distribuido
|
||||
físicamente la distribución del fuente, que será distribuido
|
||||
bajo las condiciones descritas en los apartados 1 y 2
|
||||
anteriores, en un medio habitualmente utilizado para el
|
||||
intercambio de programas, o
|
||||
|
||||
c. Acompañarlo con la información que recibiste ofreciendo
|
||||
distribuir el código fuente correspondiente. (Esta opción se
|
||||
permite sólo para distribución no comercial y sólo si usted
|
||||
recibió el programa como código objeto o en formato ejecutable
|
||||
c. Acompañarlo con la información que recibiste ofreciendo
|
||||
distribuir el código fuente correspondiente. (Esta opción se
|
||||
permite sólo para distribución no comercial y sólo si usted
|
||||
recibió el programa como código objeto o en formato ejecutable
|
||||
con tal oferta, de acuerdo con el apartado b anterior).
|
||||
|
||||
Por código fuente de un trabajo se entiende la forma preferida
|
||||
Por código fuente de un trabajo se entiende la forma preferida
|
||||
del trabajo cuando se le hacen modificaciones. Para un trabajo
|
||||
ejecutable, se entiende por código fuente completo todo el
|
||||
código fuente para todos los módulos que contiene, más
|
||||
cualquier fichero asociado de definición de interfaces, más
|
||||
los guiones utilizados para controlar la compilación e
|
||||
instalación del ejecutable. Como excepción especial el código
|
||||
ejecutable, se entiende por código fuente completo todo el
|
||||
código fuente para todos los módulos que contiene, más
|
||||
cualquier fichero asociado de definición de interfaces, más
|
||||
los guiones utilizados para controlar la compilación e
|
||||
instalación del ejecutable. Como excepción especial el código
|
||||
fuente distribuido no necesita incluir nada que sea
|
||||
distribuido normalmente (bien como fuente, bien en forma
|
||||
binaria) con los componentes principales (compilador, kernel y
|
||||
similares) del sistema operativo en el cual funciona el
|
||||
ejecutable, a no ser que el propio componente acompañe al
|
||||
ejecutable, a no ser que el propio componente acompañe al
|
||||
ejecutable.
|
||||
|
||||
Si la distribución del ejecutable o del código objeto se hace
|
||||
Si la distribución del ejecutable o del código objeto se hace
|
||||
mediante la oferta acceso para copiarlo de un cierto lugar,
|
||||
entonces se considera la oferta de acceso para copiar el
|
||||
código fuente del mismo lugar como distribución del código
|
||||
fuente, incluso aunque terceras partes no estén forzadas a
|
||||
copiar el fuente junto con el código objeto.
|
||||
código fuente del mismo lugar como distribución del código
|
||||
fuente, incluso aunque terceras partes no estén forzadas a
|
||||
copiar el fuente junto con el código objeto.
|
||||
|
||||
5. No puede copiar, modificar, sublicenciar o distribuir el
|
||||
Programa excepto como prevé expresamente esta Licencia.
|
||||
Programa excepto como prevé expresamente esta Licencia.
|
||||
Cualquier intento de copiar, modificar sublicenciar o
|
||||
distribuir el Programa de otra forma es inválida, y hará que
|
||||
cesen automáticamente los derechos que te proporciona esta
|
||||
distribuir el Programa de otra forma es inválida, y hará que
|
||||
cesen automáticamente los derechos que te proporciona esta
|
||||
Licencia. En cualquier caso, las partes que hayan recibido
|
||||
copias o derechos de usted bajo esta Licencia no cesarán en
|
||||
sus derechos mientras esas partes continúen cumpliéndola.
|
||||
copias o derechos de usted bajo esta Licencia no cesarán en
|
||||
sus derechos mientras esas partes continúen cumpliéndola.
|
||||
|
||||
6. No está obligado a aceptar esta licencia, ya que no la ha
|
||||
firmado. Sin embargo, no hay hada más que le proporcione
|
||||
6. No está obligado a aceptar esta licencia, ya que no la ha
|
||||
firmado. Sin embargo, no hay hada más que le proporcione
|
||||
permiso para modificar o distribuir el Programa o sus trabajos
|
||||
derivados. Estas acciones están prohibidas por la ley si no
|
||||
derivados. Estas acciones están prohibidas por la ley si no
|
||||
acepta esta Licencia. Por lo tanto, si modifica o distribuye
|
||||
el Programa (o cualquier trabajo basado en el Programa), está
|
||||
el Programa (o cualquier trabajo basado en el Programa), está
|
||||
indicando que acepta esta Licencia para poder hacerlo, y todos
|
||||
sus términos y condiciones para copiar, distribuir o modificar
|
||||
el Programa o trabajos basados en él.
|
||||
sus términos y condiciones para copiar, distribuir o modificar
|
||||
el Programa o trabajos basados en él.
|
||||
|
||||
7. Cada vez que redistribuya el Programa (o cualquier trabajo
|
||||
basado en el Programa), el receptor recibe automáticamente una
|
||||
basado en el Programa), el receptor recibe automáticamente una
|
||||
licencia del licenciatario original para copiar, distribuir o
|
||||
modificar el Programa, de forma sujeta a estos términos y
|
||||
condiciones. No puede imponer al receptor ninguna restricción
|
||||
más sobre el ejercicio de los derechos aquí garantizados. No
|
||||
modificar el Programa, de forma sujeta a estos términos y
|
||||
condiciones. No puede imponer al receptor ninguna restricción
|
||||
más sobre el ejercicio de los derechos aquí garantizados. No
|
||||
es usted responsable de hacer cumplir esta licencia por
|
||||
terceras partes.
|
||||
|
||||
8. Si como consecuencia de una resolución judicial o de una
|
||||
alegación de infracción de patente o por cualquier otra razón
|
||||
8. Si como consecuencia de una resolución judicial o de una
|
||||
alegación de infracción de patente o por cualquier otra razón
|
||||
(no limitada a asuntos relacionados con patentes) se le
|
||||
imponen condiciones (ya sea por mandato judicial, por acuerdo
|
||||
o por cualquier otra causa) que contradigan las condiciones de
|
||||
esta Licencia, ello no le exime de cumplir las condiciones de
|
||||
esta Licencia. Si no puede realizar distribuciones de forma
|
||||
que se satisfagan simultáneamente sus obligaciones bajo esta
|
||||
licencia y cualquier otra obligación pertinente entonces, como
|
||||
que se satisfagan simultáneamente sus obligaciones bajo esta
|
||||
licencia y cualquier otra obligación pertinente entonces, como
|
||||
consecuencia, no puede distribuir el Programa de ninguna
|
||||
forma. Por ejemplo, si una patente no permite la
|
||||
redistribución libre de derechos de autor del Programa por
|
||||
redistribución libre de derechos de autor del Programa por
|
||||
parte de todos aquellos que reciban copias directa o
|
||||
indirectamente a través de usted, entonces la única forma en
|
||||
que podría satisfacer tanto esa condición como esta Licencia
|
||||
sería evitar completamente la distribución del Programa.
|
||||
indirectamente a través de usted, entonces la única forma en
|
||||
que podría satisfacer tanto esa condición como esta Licencia
|
||||
sería evitar completamente la distribución del Programa.
|
||||
|
||||
Si cualquier porción de este apartado se considera inválida o
|
||||
Si cualquier porción de este apartado se considera inválida o
|
||||
imposible de cumplir bajo cualquier circunstancia particular
|
||||
ha de cumplirse el resto y la sección por entero ha de
|
||||
ha de cumplirse el resto y la sección por entero ha de
|
||||
cumplirse en cualquier otra circunstancia.
|
||||
|
||||
No es el propósito de este apartado inducirle a infringir
|
||||
ninguna reivindicación de patente ni de ningún otro derecho de
|
||||
No es el propósito de este apartado inducirle a infringir
|
||||
ninguna reivindicación de patente ni de ningún otro derecho de
|
||||
propiedad o impugnar la validez de ninguna de dichas
|
||||
reivindicaciones. Este apartado tiene el único propósito de
|
||||
proteger la integridad del sistema de distribución de software
|
||||
libre, que se realiza mediante prácticas de licencia pública.
|
||||
reivindicaciones. Este apartado tiene el único propósito de
|
||||
proteger la integridad del sistema de distribución de software
|
||||
libre, que se realiza mediante prácticas de licencia pública.
|
||||
Mucha gente ha hecho contribuciones generosas a la gran
|
||||
variedad de software distribuido mediante ese sistema con la
|
||||
confianza de que el sistema se aplicará consistentemente. Será
|
||||
confianza de que el sistema se aplicará consistentemente. Será
|
||||
el autor/donante quien decida si quiere distribuir software
|
||||
mediante cualquier otro sistema y una licencia no puede
|
||||
imponer esa elección.
|
||||
imponer esa elección.
|
||||
|
||||
Este apartado pretende dejar completamente claro lo que se
|
||||
cree que es una consecuencia del resto de esta Licencia.
|
||||
|
||||
9. Si la distribución y/o uso de el Programa está restringida
|
||||
en ciertos países, bien por patentes o por interfaces bajo
|
||||
9. Si la distribución y/o uso de el Programa está restringida
|
||||
en ciertos países, bien por patentes o por interfaces bajo
|
||||
copyright, el tenedor del copyright que coloca este Programa
|
||||
bajo esta Licencia puede añadir una limitación explícita de
|
||||
distribución geográfica excluyendo esos países, de forma que
|
||||
la distribución se permita sólo en o entre los países no
|
||||
bajo esta Licencia puede añadir una limitación explícita de
|
||||
distribución geográfica excluyendo esos países, de forma que
|
||||
la distribución se permita sólo en o entre los países no
|
||||
excluidos de esta manera. En ese caso, esta Licencia
|
||||
incorporará la limitación como si estuviese escrita en el
|
||||
incorporará la limitación como si estuviese escrita en el
|
||||
cuerpo de esta Licencia.
|
||||
|
||||
10. La Free Software Foundation puede publicar versiones
|
||||
revisadas y/o nuevas de la Licencia Pública General de tiempo
|
||||
en tiempo. Dichas nuevas versiones serán similares en espíritu
|
||||
a la presente versión, pero pueden ser diferentes en detalles
|
||||
revisadas y/o nuevas de la Licencia Pública General de tiempo
|
||||
en tiempo. Dichas nuevas versiones serán similares en espíritu
|
||||
a la presente versión, pero pueden ser diferentes en detalles
|
||||
para considerar nuevos problemas o situaciones.
|
||||
|
||||
Cada versión recibe un número de versión que la distingue de
|
||||
otras. Si el Programa especifica un número de versión de esta
|
||||
Licencia que se refiere a ella y a «cualquier versión
|
||||
posterior», tienes la opción de seguir los términos y
|
||||
condiciones, bien de esa versión, bien de cualquier versión
|
||||
Cada versión recibe un número de versión que la distingue de
|
||||
otras. Si el Programa especifica un número de versión de esta
|
||||
Licencia que se refiere a ella y a «cualquier versión
|
||||
posterior», tienes la opción de seguir los términos y
|
||||
condiciones, bien de esa versión, bien de cualquier versión
|
||||
posterior publicada por la Free Software Foundation. Si el
|
||||
Programa no especifica un número de versión de esta Licencia,
|
||||
puedes escoger cualquier versión publicada por la Free
|
||||
Programa no especifica un número de versión de esta Licencia,
|
||||
puedes escoger cualquier versión publicada por la Free
|
||||
Software Foundation.
|
||||
|
||||
11. Si quiere incorporar partes del Programa en otros
|
||||
programas libres cuyas condiciones de distribución son
|
||||
programas libres cuyas condiciones de distribución son
|
||||
diferentes, escribe al autor para pedirle permiso. Si el
|
||||
software tiene copyright de la Free Software Foundation,
|
||||
escribe a la Free Software Foundation: algunas veces hacemos
|
||||
excepciones en estos casos. Nuestra decisión estará guiada por
|
||||
excepciones en estos casos. Nuestra decisión estará guiada por
|
||||
el doble objetivo de de preservar la libertad de todos los
|
||||
derivados de nuestro software libre y promover el que se
|
||||
comparta y reutilice el software en general.
|
||||
|
||||
AUSENCIA DE GARANTÍA
|
||||
AUSENCIA DE GARANTÍA
|
||||
|
||||
12. Como el programa se licencia libre de cargas, no se ofrece
|
||||
ninguna garantía sobre el programa, en todas la extensión
|
||||
permitida por la legislación aplicable. Excepto cuando se
|
||||
ninguna garantía sobre el programa, en todas la extensión
|
||||
permitida por la legislación aplicable. Excepto cuando se
|
||||
indique de otra forma por escrito, los tenedores del copyright
|
||||
y/u otras partes proporcionan el programa «tal cual», sin
|
||||
garantía de ninguna clase, bien expresa o implícita, con
|
||||
inclusión, pero sin limitación a las garantías mercantiles
|
||||
implícitas o a la conveniencia para un propósito particular.
|
||||
y/u otras partes proporcionan el programa «tal cual», sin
|
||||
garantía de ninguna clase, bien expresa o implícita, con
|
||||
inclusión, pero sin limitación a las garantías mercantiles
|
||||
implícitas o a la conveniencia para un propósito particular.
|
||||
Cualquier riesgo referente a la calidad y prestaciones del
|
||||
programa es asumido por usted. Si se probase que el Programa
|
||||
es defectuoso, asume el coste de cualquier servicio,
|
||||
reparación o corrección.
|
||||
reparación o corrección.
|
||||
|
||||
13. En ningún caso, salvo que lo requiera la legislación
|
||||
aplicable o haya sido acordado por escrito, ningún tenedor del
|
||||
13. En ningún caso, salvo que lo requiera la legislación
|
||||
aplicable o haya sido acordado por escrito, ningún tenedor del
|
||||
copyright ni ninguna otra parte que modifique y/o redistribuya
|
||||
el Programa según se permite en esta Licencia será responsable
|
||||
ante usted por daños, incluyendo cualquier daño general,
|
||||
el Programa según se permite en esta Licencia será responsable
|
||||
ante usted por daños, incluyendo cualquier daño general,
|
||||
especial, incidental o resultante producido por el uso o la
|
||||
imposibilidad de uso del Programa (con inclusión, pero sin
|
||||
limitación a la pérdida de datos o a la generación incorrecta
|
||||
de datos o a pérdidas sufridas por usted o por terceras partes
|
||||
o a un fallo del Programa al funcionar en combinación con
|
||||
imposibilidad de uso del Programa (con inclusión, pero sin
|
||||
limitación a la pérdida de datos o a la generación incorrecta
|
||||
de datos o a pérdidas sufridas por usted o por terceras partes
|
||||
o a un fallo del Programa al funcionar en combinación con
|
||||
cualquier otro programa), incluso si dicho tenedor u otra
|
||||
parte ha sido advertido de la posibilidad de dichos daños.
|
||||
parte ha sido advertido de la posibilidad de dichos daños.
|
||||
|
||||
FIN DE TÉRMINOS Y CONDICIONES
|
||||
FIN DE TÉRMINOS Y CONDICIONES
|
||||
|
||||
Apéndice: Cómo aplicar estos términos a sus nuevos programas.
|
||||
Apéndice: Cómo aplicar estos términos a sus nuevos programas.
|
||||
|
||||
Si usted desarrolla un nuevo Programa, y quiere que sea del
|
||||
mayor uso posible para el público en general, la mejor forma
|
||||
de conseguirlo es convirtiéndolo en software libre que
|
||||
cualquiera pueda redistribuir y cambiar bajo estos términos.
|
||||
mayor uso posible para el público en general, la mejor forma
|
||||
de conseguirlo es convirtiéndolo en software libre que
|
||||
cualquiera pueda redistribuir y cambiar bajo estos términos.
|
||||
|
||||
Para hacerlo, añada los siguientes anuncios al programa. Lo
|
||||
más seguro es añadirlos al principio de cada fichero fuente
|
||||
para transmitir lo más efectivamente posible la ausencia de
|
||||
garantía. Además cada fichero debería tener al menos la línea
|
||||
de «copyright» y un indicador a dónde puede encontrarse el
|
||||
Para hacerlo, añada los siguientes anuncios al programa. Lo
|
||||
más seguro es añadirlos al principio de cada fichero fuente
|
||||
para transmitir lo más efectivamente posible la ausencia de
|
||||
garantía. Además cada fichero debería tener al menos la línea
|
||||
de «copyright» y un indicador a dónde puede encontrarse el
|
||||
anuncio completo.
|
||||
|
||||
<una línea para indicar el nombre del programa y una rápida
|
||||
idea de qué hace.>
|
||||
<una línea para indicar el nombre del programa y una rápida
|
||||
idea de qué hace.>
|
||||
|
||||
Copyright (C) <año> <nombre del autor>
|
||||
Copyright (C) <año> <nombre del autor>
|
||||
|
||||
Este programa es software libre. Puede redistribuirlo y/o
|
||||
modificarlo bajo los términos de la Licencia Pública General
|
||||
de GNU según es publicada por la Free Software Foundation,
|
||||
bien de la versión 2 de dicha Licencia o bien (según su
|
||||
elección) de cualquier versión posterior.
|
||||
modificarlo bajo los términos de la Licencia Pública General
|
||||
de GNU según es publicada por la Free Software Foundation,
|
||||
bien de la versión 2 de dicha Licencia o bien (según su
|
||||
elección) de cualquier versión posterior.
|
||||
|
||||
Este programa se distribuye con la esperanza de que sea útil,
|
||||
pero SIN NINGUNA GARANTÍA, incluso sin la garantía MERCANTIL
|
||||
implícita o sin garantizar la CONVENIENCIA PARA UN PROPÓSITO
|
||||
PARTICULAR. Véase la Licencia Pública General de GNU para más
|
||||
Este programa se distribuye con la esperanza de que sea útil,
|
||||
pero SIN NINGUNA GARANTÍA, incluso sin la garantía MERCANTIL
|
||||
implícita o sin garantizar la CONVENIENCIA PARA UN PROPÓSITO
|
||||
PARTICULAR. Véase la Licencia Pública General de GNU para más
|
||||
detalles.
|
||||
|
||||
Debería haber recibido una copia de la Licencia Pública
|
||||
General junto con este programa. Si no ha sido así, escriba a
|
||||
Debería haber recibido una copia de la Licencia Pública
|
||||
General junto con este programa. Si no ha sido así, escriba a
|
||||
la Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||
Boston, MA 02110-1301 USA. Añada también información sobre
|
||||
cómo contactar con usted mediante correo electrónico y postal.
|
||||
Boston, MA 02110-1301 USA. Añada también información sobre
|
||||
cómo contactar con usted mediante correo electrónico y postal.
|
||||
|
||||
Si el programa es interactivo, haga que muestre un pequeño
|
||||
Si el programa es interactivo, haga que muestre un pequeño
|
||||
anuncio como el siguiente, cuando comienza a funcionar en modo
|
||||
interactivo:
|
||||
|
||||
Gnomovision versión 69, Copyright (C) año nombre del autor
|
||||
Gnomovision no ofrece ABSOLUTAMENTE NINGUNA GARANTÍA. Para más
|
||||
detalles escriba «show w».
|
||||
Gnomovision versión 69, Copyright (C) año nombre del autor
|
||||
Gnomovision no ofrece ABSOLUTAMENTE NINGUNA GARANTÍA. Para más
|
||||
detalles escriba «show w».
|
||||
|
||||
Los comandos hipotéticos «show w» y «show c» deberían mostrar
|
||||
las partes adecuadas de la Licencia Pública General. Por
|
||||
Los comandos hipotéticos «show w» y «show c» deberían mostrar
|
||||
las partes adecuadas de la Licencia Pública General. Por
|
||||
supuesto, los comandos que use pueden llamarse de cualquier
|
||||
otra manera. Podrían incluso ser pulsaciones del ratón o
|
||||
elementos de un menú (lo que sea apropiado para su programa).
|
||||
otra manera. Podrían incluso ser pulsaciones del ratón o
|
||||
elementos de un menú (lo que sea apropiado para su programa).
|
||||
|
||||
También debería conseguir que su empleador (si trabaja como
|
||||
También debería conseguir que su empleador (si trabaja como
|
||||
programador) o su Universidad (si es el caso) firme una
|
||||
«renuncia de copyright» para el programa, si es necesario. A
|
||||
continuación se ofrece un ejemplo, altere los nombres según
|
||||
«renuncia de copyright» para el programa, si es necesario. A
|
||||
continuación se ofrece un ejemplo, altere los nombres según
|
||||
sea conveniente:
|
||||
|
||||
Yoyodyne, Inc. mediante este documento renuncia a cualquier
|
||||
interés de derechos de copyright con respecto al programa
|
||||
interés de derechos de copyright con respecto al programa
|
||||
Gnomovision (que hace pasadas a compiladores) escrito por Pepe
|
||||
Programador.
|
||||
|
||||
<firma de Pepito Grillo>, 20 de diciembre de 1996 Pepito
|
||||
Grillo, Presidente de Asuntillos Varios.
|
||||
|
||||
Esta Licencia Pública General no permite que incluya sus
|
||||
Esta Licencia Pública General no permite que incluya sus
|
||||
programas en programas propietarios. Si su programa es una
|
||||
biblioteca de subrutinas, puede considerar más útil el
|
||||
biblioteca de subrutinas, puede considerar más útil el
|
||||
permitir el enlazado de aplicaciones propietarias con la
|
||||
biblioteca. Si este es el caso, use la Licencia Pública
|
||||
biblioteca. Si este es el caso, use la Licencia Pública
|
||||
General de GNU para Bibliotecas en lugar de esta Licencia.
|
||||
|
||||
[QueryBox]
|
||||
Cuadros de diálogo
|
||||
Cuadros de diálogo
|
||||
|
||||
En los cuadros de diálogo puede desplazarse con el teclado
|
||||
En los cuadros de diálogo puede desplazarse con el teclado
|
||||
usando las flechas o las teclas de las letras resaltadas.
|
||||
|
||||
También se pueden pulsar los botones con el ratón.
|
||||
También se pueden pulsar los botones con el ratón.
|
||||
|
||||
[How to use help]
|
||||
Uso de la ayuda
|
||||
|
||||
Se pueden utilizar las flechas o el ratón para navegar
|
||||
Se pueden utilizar las flechas o el ratón para navegar
|
||||
por el sistema de ayuda.
|
||||
|
||||
La flecha de abajo cambia al siguiente elemento o baja.
|
||||
La tecla de arriba vuelve al elemento anterior o sube.
|
||||
La tecla derecha sigue el enlace activo.
|
||||
La tecla izquierda vuelve a la última página visitada.
|
||||
La tecla izquierda vuelve a la última página visitada.
|
||||
|
||||
Si el terminal no es compatible con las flechas de cursor
|
||||
se puede avanzar con la barra espaciadora y retroceder con
|
||||
la tecla b (back). El tabulador activa el elemento siguiente y
|
||||
con INTRO se puede entrar al enlace correspondiente.
|
||||
La tecla l (last) permite volver a la última página.
|
||||
La tecla l (last) permite volver a la última página.
|
||||
|
||||
ESC pulsada dos veces permite salir de la ayuda.
|
||||
|
||||
El botón izquierdo del ratón avanza o sigue enlaces y el
|
||||
botón derecho retrocede o vuelve a la última página.
|
||||
El botón izquierdo del ratón avanza o sigue enlaces y el
|
||||
botón derecho retrocede o vuelve a la última página.
|
||||
|
||||
La función de todas las teclas en la ayuda:
|
||||
La función de todas las teclas en la ayuda:
|
||||
|
||||
Las teclas de desplazamiento genéricasGeneral Movement Keys son válidas.
|
||||
Las teclas de desplazamiento genéricasGeneral Movement Keys son válidas.
|
||||
|
||||
tabulador Avanzar al elemento posterior.
|
||||
Alt-tabulador Retroceder al elemento anterior.
|
||||
abajo Avanzar elemento o bajar una línea.
|
||||
arriba Retroceder elemento o subir una línea.
|
||||
abajo Avanzar elemento o bajar una línea.
|
||||
arriba Retroceder elemento o subir una línea.
|
||||
derecha, INTRO Seguir enlace.
|
||||
izquierda, l Volver a la última página visitada.
|
||||
izquierda, l Volver a la última página visitada.
|
||||
F1 Mostrar la ayuda del sistema de ayuda.
|
||||
n Pasar a la página siguiente.
|
||||
p Pasar a la página anterior.
|
||||
c Pasar a la página de contenidos.
|
||||
n Pasar a la página siguiente.
|
||||
p Pasar a la página anterior.
|
||||
c Pasar a la página de contenidos.
|
||||
F10, ESC Salir de la ayuda.
|
||||
|
||||
Local variables:
|
||||
|
3654
doc/hu/mc.1.in
3654
doc/hu/mc.1.in
File diff suppressed because it is too large
Load Diff
@ -6,23 +6,23 @@
|
||||
v v v mqv v v v mqu v v mj
|
||||
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
|
||||
egy entertHow to use help. Itt közvetlenül a súgó tartalomjegyzékébeContents
|
||||
Az interaktív súgó használatának megismeréséhez csak üss
|
||||
egy entertHow to use help. Itt közvetlenül a súgó tartalomjegyzékébeContents
|
||||
juthatsz.
|
||||
|
||||
A Midnight Commander-t a következő szerzőkAUTHORS készítették.
|
||||
A Midnight Commander-t a következő szerzőkAUTHORS készítették.
|
||||
|
||||
A Midnight Commander mindenféle garanciaWarranty nélkül kerül
|
||||
kiadásra. Ez szabad szoftver, így továbbadhatod azt a
|
||||
Felhasználási engedélybenLicense meghatározott feltételekkel.
|
||||
A Midnight Commander mindenféle garanciaWarranty nélkül kerül
|
||||
kiadásra. Ez szabad szoftver, így továbbadhatod azt a
|
||||
Felhasználási engedélybenLicense meghatározott feltételekkel.
|
||||
|
||||
[License]
|
||||
Engedélyek
|
||||
Engedélyek
|
||||
|
||||
Ez a rész a GNU általános felhasználási
|
||||
engedélyét tartalmazza.
|
||||
Ez a rész a GNU általános felhasználási
|
||||
engedélyét tartalmazza.
|
||||
- Ennek hivatalos nyelve angol. -
|
||||
|
||||
|
||||
@ -436,54 +436,54 @@ library. If this is what you want to do, use the GNU
|
||||
Library General Public License instead of this License.
|
||||
|
||||
[QueryBox]
|
||||
Lekérdező box
|
||||
Lekérdező box
|
||||
|
||||
A lekérdező boxban kezeléséhez a nyíl billentyűket, a
|
||||
szövegrész elejének magadásást, vagy a gombokra történő
|
||||
egérkattintást használhatod.
|
||||
A lekérdező boxban kezeléséhez a nyíl billentyűket, a
|
||||
szövegrész elejének magadásást, vagy a gombokra történő
|
||||
egérkattintást használhatod.
|
||||
|
||||
[How to use help]
|
||||
Hogyan használjuk a súgót
|
||||
Hogyan használjuk a súgót
|
||||
|
||||
A súgóban a navigációhoz a billentyűzet gombjait és az
|
||||
egér gombjait is használhatod. A lefelé mutató nyíl
|
||||
lenyomására a következő bejegyzésre ugorhatsz, vagy
|
||||
legördítheted azt. A felfelé mutató nyíl lenyomására
|
||||
ez előző bejegyzésre ugorhatsz, vagy felhúzhatod azt.
|
||||
A jobbra mutató nyíl lenyomására a linknek megfelelő
|
||||
címre lép. A balra mutató nyíl lenyomására az előzőleg
|
||||
meglátogatott címre lépsz vissza.
|
||||
A súgóban a navigációhoz a billentyűzet gombjait és az
|
||||
egér gombjait is használhatod. A lefelé mutató nyíl
|
||||
lenyomására a következő bejegyzésre ugorhatsz, vagy
|
||||
legördítheted azt. A felfelé mutató nyíl lenyomására
|
||||
ez előző bejegyzésre ugorhatsz, vagy felhúzhatod azt.
|
||||
A jobbra mutató nyíl lenyomására a linknek megfelelő
|
||||
címre lép. A balra mutató nyíl lenyomására az előzőleg
|
||||
meglátogatott címre lépsz vissza.
|
||||
|
||||
Ha az általad használt terminál nem támogatja a kurzor
|
||||
gombok használatát, használd a szóköz billentyűt az
|
||||
előre lépésre, a 'b' gombot a visszalépésre. Használd a
|
||||
TAB gombot a következő bejegyzésre való ugráshoz és az
|
||||
ENTER-t a jelenlegi link által megadott címre történő
|
||||
lépéshez. Az 'l' (last=utolsó) gombot az előzőleg
|
||||
látogatott oldalra való visszalépésre használhatod. Az
|
||||
ESC lenyomásával kiléphetsz a Súgóból.
|
||||
Ha az általad használt terminál nem támogatja a kurzor
|
||||
gombok használatát, használd a szóköz billentyűt az
|
||||
előre lépésre, a 'b' gombot a visszalépésre. Használd a
|
||||
TAB gombot a következő bejegyzésre való ugráshoz és az
|
||||
ENTER-t a jelenlegi link által megadott címre történő
|
||||
lépéshez. Az 'l' (last=utolsó) gombot az előzőleg
|
||||
látogatott oldalra való visszalépésre használhatod. Az
|
||||
ESC lenyomásával kiléphetsz a Súgóból.
|
||||
|
||||
A bal egérgomb lenyomásával követheted a linket, vagy
|
||||
gördíthetsz. A jobb gomb lenyomásával visszatérhetsz az
|
||||
előzőleg látogatott pontra.
|
||||
A bal egérgomb lenyomásával követheted a linket, vagy
|
||||
gördíthetsz. A jobb gomb lenyomásával visszatérhetsz az
|
||||
előzőleg látogatott pontra.
|
||||
|
||||
A Súgóban használható összes gomb listája:
|
||||
A Súgóban használható összes gomb listája:
|
||||
|
||||
Általános mozgási lehetőségek billentyűzettelGeneral Movement Keys.
|
||||
Általános mozgási lehetőségek billentyűzettelGeneral Movement Keys.
|
||||
|
||||
tab Mozgás a következő elemre.
|
||||
M-tab Mozgás az előző elemre.
|
||||
down Mozgás a következő elemre; a sorokat lefelé
|
||||
gördíti.
|
||||
up Mozgás az előző elemre; a sorokat felfelé
|
||||
gördíti.
|
||||
right, enter Követi a jelenlegi linket.
|
||||
left, l Visszalép az előzőleg meglátogatott pontra.
|
||||
F1 Megjeleníti a Súgót a Súgó nézővel.
|
||||
n Átlép a következő pontra.
|
||||
p Átlép az előző pontra.
|
||||
c A Tartalomjegyzékhez ugrik.
|
||||
F10, esc Kilép a Súgóból.
|
||||
tab Mozgás a következő elemre.
|
||||
M-tab Mozgás az előző elemre.
|
||||
down Mozgás a következő elemre; a sorokat lefelé
|
||||
gördíti.
|
||||
up Mozgás az előző elemre; a sorokat felfelé
|
||||
gördíti.
|
||||
right, enter Követi a jelenlegi linket.
|
||||
left, l Visszalép az előzőleg meglátogatott pontra.
|
||||
F1 Megjeleníti a Súgót a Súgó nézővel.
|
||||
n Átlép a következő pontra.
|
||||
p Átlép az előző pontra.
|
||||
c A Tartalomjegyzékhez ugrik.
|
||||
F10, esc Kilép a Súgóból.
|
||||
|
||||
Local variables:
|
||||
fill-column: 58
|
||||
|
1022
doc/it/mc.1.in
1022
doc/it/mc.1.in
File diff suppressed because it is too large
Load Diff
@ -7,17 +7,17 @@
|
||||
v v v mqv v v v mqu v v mj
|
||||
qqqqqqCommanderqj
|
||||
|
||||
Questa è la principale schermata della guida interattiva
|
||||
Questa è la principale schermata della guida interattiva
|
||||
del GNU Midnight Commander.
|
||||
|
||||
Per saperne di più su come usare la guida interattiva, premere
|
||||
semplicemente invioHow to use help. Se lo si desidera, è possibile
|
||||
Per saperne di più su come usare la guida interattiva, premere
|
||||
semplicemente invioHow to use help. Se lo si desidera, è possibile
|
||||
consultare direttamente il sommarioContents della guida.
|
||||
|
||||
Il Midnight Commander è stato scritto dai suoi autoriAUTHORS.
|
||||
Il Midnight Commander è stato scritto dai suoi autoriAUTHORS.
|
||||
|
||||
Il Midnight Commander NON E' COPERTO DA ALCUNA GARANZIAWarranty.
|
||||
Questo è software libero, lo si può ridistribuire sotto
|
||||
Questo è software libero, lo si può ridistribuire sotto
|
||||
certe condizioniLicenza.[Licenza]
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
@ -432,7 +432,7 @@ Library General Public License instead of this License.
|
||||
[QueryBox]
|
||||
Finestre di dialogo di richiesta dati
|
||||
|
||||
Nelle finestre di dialogo di richiesta dati è possibile
|
||||
Nelle finestre di dialogo di richiesta dati è possibile
|
||||
usare i tasti freccia o la prima lettera per selezionare
|
||||
una voce o cliccare con il mouse sul bottone.
|
||||
|
||||
@ -442,7 +442,7 @@ Come usare la guida interattiva
|
||||
Usare i tasti del cursore o il mouse per navigare
|
||||
nel visualizzatore della guida.
|
||||
|
||||
Premere freccia in giù per spostarsi alla voce
|
||||
Premere freccia in giù per spostarsi alla voce
|
||||
successiva o per spostarsi in basso.
|
||||
Premere freccia in su per spostarsi alla voce
|
||||
precedente o per spostarsi in alto.
|
||||
@ -451,7 +451,7 @@ corrente.
|
||||
Premere freccia a sinistra per tornare indietro nello
|
||||
storico dei nodi visitati.
|
||||
|
||||
Se il terminale non supporta i tasti del cursore si può
|
||||
Se il terminale non supporta i tasti del cursore si può
|
||||
usare la barra spaziatrice per spostarsi in avanti
|
||||
ed il tasto 'b' per tornare indietro. Usare il tasto
|
||||
TAB per spostarsi sulla prossima voce e premere
|
||||
@ -471,7 +471,7 @@ Sono accettati i tasti generali di movimentoGeneral Movement Keys.
|
||||
|
||||
tab Va alla voce successiva.
|
||||
M-tab Va alla voce precedente.
|
||||
giù Va alla voce successiva o una riga in basso.
|
||||
giù Va alla voce successiva o una riga in basso.
|
||||
su Va alla voce precedente o una riga in alto.
|
||||
destra, invio Segue il collegamento corrente.
|
||||
sinistra, l Torna indietro nello storico dei nodi visitati.
|
||||
|
2834
doc/pl/mc.1.in
2834
doc/pl/mc.1.in
File diff suppressed because it is too large
Load Diff
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
|
||||
qqqqqqCommanderqj
|
||||
|
||||
To główny ekran pomocy Midnight Commandera.
|
||||
To główny ekran pomocy Midnight Commandera.
|
||||
|
||||
Aby dowiedzieć się, jak korzystać z interaktywnej pomocy
|
||||
naciśnij EnterHow to use help. Możesz też przejść bezpośrednio do spisu
|
||||
treściContents pomocy.
|
||||
Aby dowiedzieć się, jak korzystać z interaktywnej pomocy
|
||||
naciśnij EnterHow to use help. Możesz też przejść bezpośrednio do spisu
|
||||
treściContents pomocy.
|
||||
|
||||
GNU Midnight Commander został napisany przez autorówAUTHORS.
|
||||
GNU Midnight Commander został napisany przez autorówAUTHORS.
|
||||
|
||||
GNU Midnight Commander jest dostarczany ABSOLUTNIE BEZ
|
||||
ŻADNEJ GWARANCJIWarranty. Jest on wolnym oprogramowaniem,
|
||||
więc dozwolona jest jego redystrybucja na zasadach
|
||||
GNU General Public LicenseLicense (jej nieoficjalne tłumaczenie
|
||||
ŻADNEJ GWARANCJIWarranty. Jest on wolnym oprogramowaniem,
|
||||
więc dozwolona jest jego redystrybucja na zasadach
|
||||
GNU General Public LicenseLicense (jej nieoficjalne tłumaczenie
|
||||
znajdziesz tutajLicense-pl).
|
||||
|
||||
[License]
|
||||
Licencja
|
||||
|
||||
Nieoficjalne polskie tłumacznie znajdziesz tutajLicense-pl.
|
||||
Nieoficjalne polskie tłumacznie znajdziesz tutajLicense-pl.
|
||||
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
@ -437,15 +437,15 @@ library. If this is what you want to do, use the GNU
|
||||
Library General Public License instead of this License.
|
||||
|
||||
[License-pl]
|
||||
Nieoficjalne tłumaczenie licencji
|
||||
Nieoficjalne tłumaczenie licencji
|
||||
|
||||
Uwaga: To jest nieoficjalne tłumaczenie Powszechnej
|
||||
Licencji Publicznej GNU na język polski. Nie zostało
|
||||
opublikowane przez Free Software Foundation i pod względem
|
||||
prawnym nie stanowi warunków rozpowszechniania
|
||||
oprogramowania stosującego GNU GPL -- ustanawia je
|
||||
wyłącznie oryginalny angielski tekst licencji GNU
|
||||
GPLLicense. Tłumaczenie pochodzi ze strony
|
||||
Uwaga: To jest nieoficjalne tłumaczenie Powszechnej
|
||||
Licencji Publicznej GNU na język polski. Nie zostało
|
||||
opublikowane przez Free Software Foundation i pod względem
|
||||
prawnym nie stanowi warunków rozpowszechniania
|
||||
oprogramowania stosującego GNU GPL -- ustanawia je
|
||||
wyłącznie oryginalny angielski tekst licencji GNU
|
||||
GPLLicense. Tłumaczenie pochodzi ze strony
|
||||
http://www.linux.org.pl/
|
||||
|
||||
|
||||
@ -455,507 +455,507 @@ http://www.linux.org.pl/
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Zezwala się na kopiowanie i rozpowszechnianie wiernych
|
||||
Zezwala się na kopiowanie i rozpowszechnianie wiernych
|
||||
kopii niniejszego dokumentu licencyjnego, jednak bez prawa
|
||||
wprowadzania zmian.
|
||||
|
||||
Preambuła
|
||||
Preambuła
|
||||
|
||||
Większość licencji na oprogramowanie pomyślana jest po
|
||||
to, aby odebrać użytkownikowi możliwość swobodnego
|
||||
udostępniania innym i zmieniania danego software'u.
|
||||
Większość licencji na oprogramowanie pomyślana jest po
|
||||
to, aby odebrać użytkownikowi możliwość swobodnego
|
||||
udostępniania innym i zmieniania danego software'u.
|
||||
Natomiast w wypadku Powszechnej Licencji Publicznej GNU
|
||||
(GNU General Public License, GPL) celem jest
|
||||
zagwarantowanie użytkownikowi swobody udostępniania i
|
||||
zmieniania tego bezpłatnego oprogramowania, a więc danie
|
||||
pewności, iż oprogramowanie jest wolno dostępne dla
|
||||
wszystkich użytkowników. Niniejsza Powszechna Licencja
|
||||
Publiczna dotyczy większości oprogramowania wydawanego
|
||||
przez Fundację Wolnego Oprogramowania (Free Software
|
||||
Foundation) oraz wszelkich innych programów, których
|
||||
autorzy zobowiązują się do jej stosowania. (Niektóre
|
||||
rodzaje oprogramowania wydawanego przez Fundację objęte są
|
||||
Powszechną Licencją Publiczną GNU dla Bibliotek, GNU
|
||||
Library General Public License). Użytkownik może stosować
|
||||
ją również do swoich programów.
|
||||
zagwarantowanie użytkownikowi swobody udostępniania i
|
||||
zmieniania tego bezpłatnego oprogramowania, a więc danie
|
||||
pewności, iż oprogramowanie jest wolno dostępne dla
|
||||
wszystkich użytkowników. Niniejsza Powszechna Licencja
|
||||
Publiczna dotyczy większości oprogramowania wydawanego
|
||||
przez Fundację Wolnego Oprogramowania (Free Software
|
||||
Foundation) oraz wszelkich innych programów, których
|
||||
autorzy zobowiązują się do jej stosowania. (Niektóre
|
||||
rodzaje oprogramowania wydawanego przez Fundację objęte są
|
||||
Powszechną Licencją Publiczną GNU dla Bibliotek, GNU
|
||||
Library General Public License). Użytkownik może stosować
|
||||
ją również do swoich programów.
|
||||
|
||||
Mówiąc o wolnym oprogramowaniu mamy na myśli swobodę, a
|
||||
nie cenę. Nasze Powszechne Licencje Publiczne wprowadzono
|
||||
po to, aby zapewnić Państwu swobodę rozpowszechniania
|
||||
kopii tego oprogramowania (i - jeśli ktoś chce -
|
||||
pobierania za tę usługę opłaty), jak również aby
|
||||
udostępnić kod źródłowy oraz umożliwić dokonywanie zmian
|
||||
tego oprogramowania lub wykorzystywania jego fragmentów w
|
||||
nowych, wolnych programach. Nie bez znaczenia jest też
|
||||
sama możliwość dotarcia do Państwa z informacją o
|
||||
Mówiąc o wolnym oprogramowaniu mamy na myśli swobodę, a
|
||||
nie cenę. Nasze Powszechne Licencje Publiczne wprowadzono
|
||||
po to, aby zapewnić Państwu swobodę rozpowszechniania
|
||||
kopii tego oprogramowania (i - jeśli ktoś chce -
|
||||
pobierania za tę usługę opłaty), jak również aby
|
||||
udostępnić kod źródłowy oraz umożliwić dokonywanie zmian
|
||||
tego oprogramowania lub wykorzystywania jego fragmentów w
|
||||
nowych, wolnych programach. Nie bez znaczenia jest też
|
||||
sama możliwość dotarcia do Państwa z informacją o
|
||||
wszystkich tych udogodnieniach.
|
||||
|
||||
W celu ochrony praw użytkownika jesteśmy zmuszeni
|
||||
wprowadzać ograniczenia zabraniające komukolwiek
|
||||
W celu ochrony praw użytkownika jesteśmy zmuszeni
|
||||
wprowadzać ograniczenia zabraniające komukolwiek
|
||||
kwestionowanie jego praw albo sugerowanie rezygnacji z
|
||||
tych praw. Ograniczenia te sprowadzają się do pewnych dla
|
||||
Państwa obowiązków w przypadku rozpowszechniania przez Was
|
||||
kopii naszego oprogramowania bądź dokonywania w nim zmian.
|
||||
tych praw. Ograniczenia te sprowadzają się do pewnych dla
|
||||
Państwa obowiązków w przypadku rozpowszechniania przez Was
|
||||
kopii naszego oprogramowania bądź dokonywania w nim zmian.
|
||||
|
||||
Na przykład, jeśli rozprowadzacie Państwo kopie takiego
|
||||
programu, niezależnie czy gratisowo, czy za opłatą,
|
||||
musicie Państwo odbiorcy udzielić wszelkich tych praw,
|
||||
jakie mieliście sami. Musicie zapewnić mu również
|
||||
otrzymanie kodu źródłowego (lub możliwość otrzymania) oraz
|
||||
przedstawić niniejsze Warunki, aby mógł on poznać swoje
|
||||
Na przykład, jeśli rozprowadzacie Państwo kopie takiego
|
||||
programu, niezależnie czy gratisowo, czy za opłatą,
|
||||
musicie Państwo odbiorcy udzielić wszelkich tych praw,
|
||||
jakie mieliście sami. Musicie zapewnić mu również
|
||||
otrzymanie kodu źródłowego (lub możliwość otrzymania) oraz
|
||||
przedstawić niniejsze Warunki, aby mógł on poznać swoje
|
||||
prawa.
|
||||
|
||||
Ochrona Państwa praw przebiega w dwóch etapach:
|
||||
Ochrona Państwa praw przebiega w dwóch etapach:
|
||||
|
||||
1. zastrzegamy prawo własności autorskiej do
|
||||
1. zastrzegamy prawo własności autorskiej do
|
||||
oprogramowania,
|
||||
|
||||
2. oferujemy Państwu niniejszą licencję, która daje Wam
|
||||
2. oferujemy Państwu niniejszą licencję, która daje Wam
|
||||
sankcjonowane prawem zezwolenie na kopiowanie,
|
||||
rozpowszechnianie i/lub modyfikowanie tego oprogramowania.
|
||||
|
||||
Ponadto dla ochrony tak autora, jak i naszej, pragniemy
|
||||
mieć pewność, że każdy zrozumie, iż na niniejsze wolne
|
||||
oprogramowanie nie udziela się gwarancji. W razie
|
||||
dokonania w nim przez kogoś modyfikacji i puszczenia dalej
|
||||
mieć pewność, że każdy zrozumie, iż na niniejsze wolne
|
||||
oprogramowanie nie udziela się gwarancji. W razie
|
||||
dokonania w nim przez kogoś modyfikacji i puszczenia dalej
|
||||
do obrotu, pragniemy, aby dalsi odbiorcy zdawali sobie
|
||||
sprawę z tego, że problemy wprowadzone przez inne osoby
|
||||
nie są wyrazem oryginalnych działań twórców.
|
||||
sprawę z tego, że problemy wprowadzone przez inne osoby
|
||||
nie są wyrazem oryginalnych działań twórców.
|
||||
|
||||
I rzecz ostatnia: każdemu wolnemu programowi stale
|
||||
zagrażają patenty na oprogramowanie. Naszym pragnieniem
|
||||
jest unikanie takiego niebezpieczeństwa, kiedy
|
||||
redystrybutorzy wolnego programu indywidualnie uzyskują
|
||||
prawa patentowe, nadając tym samym programowi charakter
|
||||
prawnie zastrzeżony. W celu zapobieżenia takim zjawiskom
|
||||
jednoznacznie wyjaśniliśmy, że każdy patent musi być
|
||||
wydawany albo dla swobodnego użytku przez wszystkich, albo
|
||||
I rzecz ostatnia: każdemu wolnemu programowi stale
|
||||
zagrażają patenty na oprogramowanie. Naszym pragnieniem
|
||||
jest unikanie takiego niebezpieczeństwa, kiedy
|
||||
redystrybutorzy wolnego programu indywidualnie uzyskują
|
||||
prawa patentowe, nadając tym samym programowi charakter
|
||||
prawnie zastrzeżony. W celu zapobieżenia takim zjawiskom
|
||||
jednoznacznie wyjaśniliśmy, że każdy patent musi być
|
||||
wydawany albo dla swobodnego użytku przez wszystkich, albo
|
||||
nie wydawany wcale.
|
||||
|
||||
Poniżej podajemy dokładne zasady i warunki kopiowania,
|
||||
Poniżej podajemy dokładne zasady i warunki kopiowania,
|
||||
rozpowszechniania i modyfikowania.
|
||||
|
||||
|
||||
ZASADY I WARUNKI KOPIOWANIA,
|
||||
ROZPOWSZECHNIANIA I MODYFIKOWANIA
|
||||
|
||||
0. Niniejsza Licencja dotyczy programów i innych prac,
|
||||
na których umieszczona jest pochodząca od właściciela praw
|
||||
autorskich informacja, że dany program lub praca może być
|
||||
0. Niniejsza Licencja dotyczy programów i innych prac,
|
||||
na których umieszczona jest pochodząca od właściciela praw
|
||||
autorskich informacja, że dany program lub praca może być
|
||||
rozpowszechniana na warunkach niniejszej Powszechnej
|
||||
Licencji Publicznej. Używane poniżej słowo "Program"
|
||||
oznacza właśnie takie programy lub prace, zaś określenie
|
||||
Licencji Publicznej. Używane poniżej słowo "Program"
|
||||
oznacza właśnie takie programy lub prace, zaś określenie
|
||||
"praca oparta na Programie" dotyczy albo Programu, albo
|
||||
pochodzącej od niego pracy w rozumieniu prawa autorskiego,
|
||||
to jest pracy zawierającej Program lub jego część
|
||||
dosłowną, bądź zmodyfikowaną i/lub przełożoną na inny
|
||||
język. (W dalszym ciągu niniejszego, pojęcie przekładu
|
||||
włącza się bez ograniczeń do terminu "modyfikacja"). Do
|
||||
każdego licencjobiorcy będziemy zwracać się "per Ty".
|
||||
pochodzącej od niego pracy w rozumieniu prawa autorskiego,
|
||||
to jest pracy zawierającej Program lub jego część
|
||||
dosłowną, bądź zmodyfikowaną i/lub przełożoną na inny
|
||||
język. (W dalszym ciągu niniejszego, pojęcie przekładu
|
||||
włącza się bez ograniczeń do terminu "modyfikacja"). Do
|
||||
każdego licencjobiorcy będziemy zwracać się "per Ty".
|
||||
|
||||
Niniejsza Licencja nie obejmuje działań innych niż
|
||||
kopiowanie, rozprowadzanie i modyfikowanie - nie mieszczą
|
||||
się one w jej zakresie. Czynność używania Programu nie
|
||||
Niniejsza Licencja nie obejmuje działań innych niż
|
||||
kopiowanie, rozprowadzanie i modyfikowanie - nie mieszczą
|
||||
się one w jej zakresie. Czynność używania Programu nie
|
||||
jest poddana ograniczeniom, a produkty uzyskane z Programu
|
||||
objęte są Licencją tylko wtedy, gdy ich treść stanowi
|
||||
pracę opartą na Programie (niezależnie od stworzenia jej
|
||||
przy użyciu Programu). To, czy fakt taki jest prawdą,
|
||||
zależy od tego, co dany Program wykonuje.
|
||||
objęte są Licencją tylko wtedy, gdy ich treść stanowi
|
||||
pracę opartą na Programie (niezależnie od stworzenia jej
|
||||
przy użyciu Programu). To, czy fakt taki jest prawdą,
|
||||
zależy od tego, co dany Program wykonuje.
|
||||
|
||||
1. Możesz kopiować i rozprowadzać w dowolnych mediach
|
||||
wierne kopie kodu źródłowego Programu w otrzymanej formie
|
||||
pod warunkiem, że w widoczny sposób i odpowiednio podasz
|
||||
na każdej kopii właściwą informację o prawie autorskim i
|
||||
zrzeczenie się uprawnień z tytułu gwarancji; wszelkie
|
||||
1. Możesz kopiować i rozprowadzać w dowolnych mediach
|
||||
wierne kopie kodu źródłowego Programu w otrzymanej formie
|
||||
pod warunkiem, że w widoczny sposób i odpowiednio podasz
|
||||
na każdej kopii właściwą informację o prawie autorskim i
|
||||
zrzeczenie się uprawnień z tytułu gwarancji; wszelkie
|
||||
napisy informacyjne na temat Licencji i faktu
|
||||
nieudzielania gwarancji musisz chronić przed uszkodzeniem,
|
||||
zaś wszystkim innym odbiorcom Programu musisz wraz z
|
||||
Programem wręczać egzemplarz niniejszej Licencji.
|
||||
nieudzielania gwarancji musisz chronić przed uszkodzeniem,
|
||||
zaś wszystkim innym odbiorcom Programu musisz wraz z
|
||||
Programem wręczać egzemplarz niniejszej Licencji.
|
||||
|
||||
Możesz pobierać opłatę za fizyczną czynność przekazania
|
||||
kopii i według własnej decyzji możesz za opłatą proponować
|
||||
ochronę gwarancyjną.
|
||||
Możesz pobierać opłatę za fizyczną czynność przekazania
|
||||
kopii i według własnej decyzji możesz za opłatą proponować
|
||||
ochronę gwarancyjną.
|
||||
|
||||
2. Możesz modyfikować swoją kopię czy kopie Programu
|
||||
oraz dowolne jego części, tworząc przez to pracę opartą na
|
||||
Programie, jak również kopiować i rozprowadzać takie
|
||||
modyfikacje i pracę na warunkach podanych w pkt.1 powyżej
|
||||
- pod warunkiem przestrzegania całości poniższych wymogów:
|
||||
2. Możesz modyfikować swoją kopię czy kopie Programu
|
||||
oraz dowolne jego części, tworząc przez to pracę opartą na
|
||||
Programie, jak również kopiować i rozprowadzać takie
|
||||
modyfikacje i pracę na warunkach podanych w pkt.1 powyżej
|
||||
- pod warunkiem przestrzegania całości poniższych wymogów:
|
||||
|
||||
a) Musisz spowodować umieszczenie na zmodyfikowanych
|
||||
plikach widocznej informacji o tym, że dane pliki zostały
|
||||
przez ciebie zmienione, wraz z datą dokonania zmian.
|
||||
a) Musisz spowodować umieszczenie na zmodyfikowanych
|
||||
plikach widocznej informacji o tym, że dane pliki zostały
|
||||
przez ciebie zmienione, wraz z datą dokonania zmian.
|
||||
|
||||
b) Musisz doprowadzić do tego, aby każda
|
||||
rozpowszechniana lub publikowana przez ciebie praca, która
|
||||
w całości lub części zawiera Program, albo pochodzi od
|
||||
niego lub jego części, była w całości i bezpłatnie
|
||||
b) Musisz doprowadzić do tego, aby każda
|
||||
rozpowszechniana lub publikowana przez ciebie praca, która
|
||||
w całości lub części zawiera Program, albo pochodzi od
|
||||
niego lub jego części, była w całości i bezpłatnie
|
||||
licencjonowana dla wszelkich stron trzecich na warunkach
|
||||
niniejszej Licencji.
|
||||
|
||||
c) Jeżeli zmodyfikowany program podczas korzystania z
|
||||
c) Jeżeli zmodyfikowany program podczas korzystania z
|
||||
niego w normalnym trybie odczytuje polecenia
|
||||
interaktywnie, musisz spowodować, aby po uruchomieniu
|
||||
(użyty w interaktywny sposób w najzwyklejszym trybie),
|
||||
wydrukowywał on lub wyświetlał powiadomienie o odnośnym
|
||||
interaktywnie, musisz spowodować, aby po uruchomieniu
|
||||
(użyty w interaktywny sposób w najzwyklejszym trybie),
|
||||
wydrukowywał on lub wyświetlał powiadomienie o odnośnym
|
||||
prawie autorskim i braku gwarancji (ewentualnie o
|
||||
zapewnianiu gwarancji przez ciebie), oraz o tym, że
|
||||
użytkownicy mogą redystrybuować ten program na niniejszych
|
||||
warunkach wraz z informacją, jak użytkownik może zapoznać
|
||||
się z treścią niniejszej Licencji. (Wyjątek: jeśli sam
|
||||
zapewnianiu gwarancji przez ciebie), oraz o tym, że
|
||||
użytkownicy mogą redystrybuować ten program na niniejszych
|
||||
warunkach wraz z informacją, jak użytkownik może zapoznać
|
||||
się z treścią niniejszej Licencji. (Wyjątek: jeśli sam
|
||||
Program jest interaktywny, ale normalnie nie drukuje
|
||||
takiego powiadomienia, twoja praca oparta na nim też nie
|
||||
musi wydrukowywać takiego powiadomienia).
|
||||
takiego powiadomienia, twoja praca oparta na nim też nie
|
||||
musi wydrukowywać takiego powiadomienia).
|
||||
|
||||
Niniejsze wymogi odnoszą się do zmodyfikowanej pracy
|
||||
jako całości. Jeśli dające się ustalić sekcje danej pracy
|
||||
nie pochodzą od Programu i mogą być racjonalnie uważane za
|
||||
samodzielne i odrębne same w sobie, to niniejsza Licencja
|
||||
i jej warunki nie mają zastosowania do takich sekcji przy
|
||||
rozprowadzaniu ich przez ciebie jako odrębne prace. Jeśli
|
||||
jednak rozprowadzasz je jako część całości, będącej pracą
|
||||
opartą na Programie, rozpowszechnianie tej całości musi
|
||||
być dokonywane na warunkach niniejszej Licencji, której
|
||||
zezwolenia dla innych licencjobiorców rozciągają się w
|
||||
całej szerokości na tę całość, a tym samym i na każdą
|
||||
indywidualną jej część, niezależnie od jej autorstwa.
|
||||
Niniejsze wymogi odnoszą się do zmodyfikowanej pracy
|
||||
jako całości. Jeśli dające się ustalić sekcje danej pracy
|
||||
nie pochodzą od Programu i mogą być racjonalnie uważane za
|
||||
samodzielne i odrębne same w sobie, to niniejsza Licencja
|
||||
i jej warunki nie mają zastosowania do takich sekcji przy
|
||||
rozprowadzaniu ich przez ciebie jako odrębne prace. Jeśli
|
||||
jednak rozprowadzasz je jako część całości, będącej pracą
|
||||
opartą na Programie, rozpowszechnianie tej całości musi
|
||||
być dokonywane na warunkach niniejszej Licencji, której
|
||||
zezwolenia dla innych licencjobiorców rozciągają się w
|
||||
całej szerokości na tę całość, a tym samym i na każdą
|
||||
indywidualną jej część, niezależnie od jej autorstwa.
|
||||
|
||||
Dlatego też intencją tego fragmentu nie jest roszczenie
|
||||
sobie praw albo podważanie twych praw do pracy napisanej w
|
||||
całości przez ciebie. Chodzi nam raczej o korzystanie z
|
||||
Dlatego też intencją tego fragmentu nie jest roszczenie
|
||||
sobie praw albo podważanie twych praw do pracy napisanej w
|
||||
całości przez ciebie. Chodzi nam raczej o korzystanie z
|
||||
prawa kontrolowania dystrybucji pochodnych i zbiorowych
|
||||
prac opartych na Programie.
|
||||
|
||||
I jeszcze jedno: samo tylko połączenie z Programem (lub
|
||||
z pracą opartą na Programie) innej pracy - nie opartej na
|
||||
Programie, w ramach wolumenu nośnika przechowywania lub
|
||||
dystrybucji, nie powoduje objęcia takiej pracy zakresem
|
||||
I jeszcze jedno: samo tylko połączenie z Programem (lub
|
||||
z pracą opartą na Programie) innej pracy - nie opartej na
|
||||
Programie, w ramach wolumenu nośnika przechowywania lub
|
||||
dystrybucji, nie powoduje objęcia takiej pracy zakresem
|
||||
niniejszej Licencji.
|
||||
|
||||
3. Możesz kopiować i rozprowadzać Program (lub opartą na
|
||||
nim pracę - zgodnie z pkt.2 w kodzie wynikowym lub w
|
||||
formie wykonywalnej w myśl postanowień pkt.1 i 2 powyżej,
|
||||
pod warunkiem zrealizowania również poniższych wymogów:
|
||||
3. Możesz kopiować i rozprowadzać Program (lub opartą na
|
||||
nim pracę - zgodnie z pkt.2 w kodzie wynikowym lub w
|
||||
formie wykonywalnej w myśl postanowień pkt.1 i 2 powyżej,
|
||||
pod warunkiem zrealizowania również poniższych wymogów:
|
||||
|
||||
a) Musisz dołączyć do niego odpowiadający mu,
|
||||
kompletny i możliwy do odczytania przez urządzenia cyfrowe
|
||||
kod źródłowy, który musi być rozpowszechniany na warunkach
|
||||
pkt.1 i 2 powyżej i na nośniku zwyczajowo używanym dla
|
||||
a) Musisz dołączyć do niego odpowiadający mu,
|
||||
kompletny i możliwy do odczytania przez urządzenia cyfrowe
|
||||
kod źródłowy, który musi być rozpowszechniany na warunkach
|
||||
pkt.1 i 2 powyżej i na nośniku zwyczajowo używanym dla
|
||||
wzajemnej wymiany oprogramowania; lub
|
||||
|
||||
b) dołączyć do niego pisemną ofertę, ważną co najmniej
|
||||
3 lata, przyznającą każdej stronie trzeciej - za opłatą
|
||||
nie przekraczającą twego kosztu fizycznego wykonywania
|
||||
dystrybucji źródła - kompletną, odczytywalną przez
|
||||
urządzenia cyfrowe kopię odpowiadającego mu kodu
|
||||
źródłowego, rozprowadzaną na warunkach pkt.1 i 2 powyżej,
|
||||
na nośniku zwyczajowo używanym do wzajemnej wymiany
|
||||
b) dołączyć do niego pisemną ofertę, ważną co najmniej
|
||||
3 lata, przyznającą każdej stronie trzeciej - za opłatą
|
||||
nie przekraczającą twego kosztu fizycznego wykonywania
|
||||
dystrybucji źródła - kompletną, odczytywalną przez
|
||||
urządzenia cyfrowe kopię odpowiadającego mu kodu
|
||||
źródłowego, rozprowadzaną na warunkach pkt.1 i 2 powyżej,
|
||||
na nośniku zwyczajowo używanym do wzajemnej wymiany
|
||||
oprogramowania; lub
|
||||
|
||||
c) dołączyć do niego informację, jaką otrzymałeś na
|
||||
temat oferty rozprowadzania odpowiedniego kodu źródłowego.
|
||||
(Ta możliwość dozwolona jest tylko dla dystrybucji
|
||||
niehandlowej i jedynie wtedy, gdy otrzymałeś dany program
|
||||
c) dołączyć do niego informację, jaką otrzymałeś na
|
||||
temat oferty rozprowadzania odpowiedniego kodu źródłowego.
|
||||
(Ta możliwość dozwolona jest tylko dla dystrybucji
|
||||
niehandlowej i jedynie wtedy, gdy otrzymałeś dany program
|
||||
w kodzie wynikowym lub formie wykonywalnej wraz z
|
||||
wymienioną ofertą - zgodnie z podpunktem "b" powyżej).
|
||||
wymienioną ofertą - zgodnie z podpunktem "b" powyżej).
|
||||
|
||||
Określenie kod źródłowy dla pracy oznacza formę pracy
|
||||
preferowaną dla wprowadzania do niej modyfikacji. Dla
|
||||
wykonanej pracy, kompletny kod źródłowy oznacza cały kod
|
||||
źródłowy wszystkich modułów, wszelkie sprzężone z nią
|
||||
pośredniczące pliki opisujące oraz zbiory komend stosowane
|
||||
do sterowania kompilacją i instalowaniem programów.
|
||||
Niemniej jednak, jako wyjątek specjalny, dystrybuowany (w
|
||||
formie źródłowej albo binarnej) kod źródłowy nie musi
|
||||
obejmować niczego, co jest normalnie rozprowadzane przy
|
||||
pomocy głównych komponentów (kompilator, jądro itd.)
|
||||
systemu operacyjnego, na którym pracuje część wykonywalna,
|
||||
o ile sam taki komponent towarzyszy tej części.
|
||||
Określenie kod źródłowy dla pracy oznacza formę pracy
|
||||
preferowaną dla wprowadzania do niej modyfikacji. Dla
|
||||
wykonanej pracy, kompletny kod źródłowy oznacza cały kod
|
||||
źródłowy wszystkich modułów, wszelkie sprzężone z nią
|
||||
pośredniczące pliki opisujące oraz zbiory komend stosowane
|
||||
do sterowania kompilacją i instalowaniem programów.
|
||||
Niemniej jednak, jako wyjątek specjalny, dystrybuowany (w
|
||||
formie źródłowej albo binarnej) kod źródłowy nie musi
|
||||
obejmować niczego, co jest normalnie rozprowadzane przy
|
||||
pomocy głównych komponentów (kompilator, jądro itd.)
|
||||
systemu operacyjnego, na którym pracuje część wykonywalna,
|
||||
o ile sam taki komponent towarzyszy tej części.
|
||||
|
||||
Jeśli dystrybucja części wykonywalnej albo kodu
|
||||
wynikowego realizowana jest poprzez oferowanie dostępu do
|
||||
kopii z wyznaczonego miejsca, to oferowanie równoważnego
|
||||
dostępu dla kopiowania kodu źródłowego z tego samego
|
||||
miejsca liczy się jako rozpowszechnianie kodu źródłowego,
|
||||
nawet gdy strony trzecie nie są zmuszone do kopiowania
|
||||
źródła wraz z kodem wynikowym.
|
||||
Jeśli dystrybucja części wykonywalnej albo kodu
|
||||
wynikowego realizowana jest poprzez oferowanie dostępu do
|
||||
kopii z wyznaczonego miejsca, to oferowanie równoważnego
|
||||
dostępu dla kopiowania kodu źródłowego z tego samego
|
||||
miejsca liczy się jako rozpowszechnianie kodu źródłowego,
|
||||
nawet gdy strony trzecie nie są zmuszone do kopiowania
|
||||
źródła wraz z kodem wynikowym.
|
||||
|
||||
4. Poza przypadkami jednoznacznie dozwolonymi w
|
||||
niniejszej Licencji, nie możesz kopiować, modyfikować,
|
||||
sublicencjonować ani rozpowszechniać Programu. We
|
||||
wszystkich pozostałych wypadkach, każda próba skopiowania,
|
||||
niniejszej Licencji, nie możesz kopiować, modyfikować,
|
||||
sublicencjonować ani rozpowszechniać Programu. We
|
||||
wszystkich pozostałych wypadkach, każda próba skopiowania,
|
||||
sublicencjonowania lub rozpowszechnienia Programu jest
|
||||
nieważna i powoduje automatyczne wygaśnięcie twoich praw z
|
||||
tytułu Licencji. Niemniej jednak, stronom, które już
|
||||
otrzymały od ciebie kopie albo prawa w ramach niniejszej
|
||||
Licencji, licencje nie wygasają tak długo, jak długo
|
||||
strony te w pełni stosują się do nich.
|
||||
nieważna i powoduje automatyczne wygaśnięcie twoich praw z
|
||||
tytułu Licencji. Niemniej jednak, stronom, które już
|
||||
otrzymały od ciebie kopie albo prawa w ramach niniejszej
|
||||
Licencji, licencje nie wygasają tak długo, jak długo
|
||||
strony te w pełni stosują się do nich.
|
||||
|
||||
5. Nie musisz akceptować niniejszej Licencji, jeżeli jej
|
||||
nie podpisałeś. Niemniej jednak, nic innego nie zapewni ci
|
||||
5. Nie musisz akceptować niniejszej Licencji, jeżeli jej
|
||||
nie podpisałeś. Niemniej jednak, nic innego nie zapewni ci
|
||||
zezwolenia na modyfikowanie lub rozprowadzanie Programu i
|
||||
pochodzących od niego prac. Działania takie są prawnie
|
||||
zabronione, jeżeli nie przyjmujesz niniejszej Licencji.
|
||||
Dlatego też, poprzez modyfikowanie bądź rozpowszechnianie
|
||||
pochodzących od niego prac. Działania takie są prawnie
|
||||
zabronione, jeżeli nie przyjmujesz niniejszej Licencji.
|
||||
Dlatego też, poprzez modyfikowanie bądź rozpowszechnianie
|
||||
Programu (lub pracy na nim opartej) dajesz wyraz swojej
|
||||
akceptacji dla Licencji i wszelkich jej postanowień i
|
||||
warunków dotyczących kopiowania, rozprowadzania i
|
||||
akceptacji dla Licencji i wszelkich jej postanowień i
|
||||
warunków dotyczących kopiowania, rozprowadzania i
|
||||
modyfikowania Programu lub opartych na nim prac.
|
||||
|
||||
6. W każdym przypadku redystrybucji przez ciebie
|
||||
6. W każdym przypadku redystrybucji przez ciebie
|
||||
Programu (albo opartej na nim pracy), odbiorca
|
||||
automatycznie otrzymuje od pierwotnego licencjodawcy
|
||||
licencję na kopiowanie, rozpowszechnianie i modyfikowanie
|
||||
licencję na kopiowanie, rozpowszechnianie i modyfikowanie
|
||||
Programu na niniejszych zasadach i warunkach. Na
|
||||
korzystanie przez odbiorcę z udzielonych w niniejszej
|
||||
Licencji praw nie możesz narzucać już dalszych ograniczeń.
|
||||
Nie jesteś stroną odpowiedzialną za kontrolę
|
||||
korzystanie przez odbiorcę z udzielonych w niniejszej
|
||||
Licencji praw nie możesz narzucać już dalszych ograniczeń.
|
||||
Nie jesteś stroną odpowiedzialną za kontrolę
|
||||
przestrzegania Licencji przez osoby trzecie.
|
||||
|
||||
7. Jeśli na skutek wyroku sądowego lub zarzutu
|
||||
naruszenia patentu, jak też z każdej innej przyczyny (nie
|
||||
ograniczonej do kwestii patentowych) zostaną narzucone na
|
||||
ciebie (niezależnie czy to mocą wyroku sądowego, umowy,
|
||||
czy w inny sposób) warunki sprzeczne z warunkami
|
||||
niniejszej Licencji, to nie zwalniają one ciebie z
|
||||
warunków Licencji. Jeśli nie możesz prowadzić dystrybucji
|
||||
tak, aby wypełniać jednocześnie swoje obowiązki z tytułu
|
||||
niniejszej Licencji i inne odnośne obowiązki, to w
|
||||
rezultacie nie możesz wcale rozprowadzać Programu. Na
|
||||
przykład, gdyby licencja patentowa nie zezwalała na wolną
|
||||
od opłat licencyjnych redystrybucję Programu przez
|
||||
wszystkie osoby, które otrzymały kopie bezpośrednio lub
|
||||
pośrednio od ciebie, to jedynym sposobem pozwalającym ci
|
||||
7. Jeśli na skutek wyroku sądowego lub zarzutu
|
||||
naruszenia patentu, jak też z każdej innej przyczyny (nie
|
||||
ograniczonej do kwestii patentowych) zostaną narzucone na
|
||||
ciebie (niezależnie czy to mocą wyroku sądowego, umowy,
|
||||
czy w inny sposób) warunki sprzeczne z warunkami
|
||||
niniejszej Licencji, to nie zwalniają one ciebie z
|
||||
warunków Licencji. Jeśli nie możesz prowadzić dystrybucji
|
||||
tak, aby wypełniać jednocześnie swoje obowiązki z tytułu
|
||||
niniejszej Licencji i inne odnośne obowiązki, to w
|
||||
rezultacie nie możesz wcale rozprowadzać Programu. Na
|
||||
przykład, gdyby licencja patentowa nie zezwalała na wolną
|
||||
od opłat licencyjnych redystrybucję Programu przez
|
||||
wszystkie osoby, które otrzymały kopie bezpośrednio lub
|
||||
pośrednio od ciebie, to jedynym sposobem pozwalającym ci
|
||||
na przestrzeganie i licencji patentowej, i Licencji
|
||||
niniejszej, byłoby całkowite powstrzymanie się od
|
||||
niniejszej, byłoby całkowite powstrzymanie się od
|
||||
jakiejkolwiek dystrybucji Programu.
|
||||
|
||||
Jeżeli w jakichś szczególnych okolicznościach któryś
|
||||
fragment niniejszego punktu stałby się nieważny lub
|
||||
niewykonywalny, to intencją jest, aby znajdowała
|
||||
zastosowanie pozostała część punktu, a treść całego punktu
|
||||
była stosowana w pozostałych okolicznościach.
|
||||
Jeżeli w jakichś szczególnych okolicznościach któryś
|
||||
fragment niniejszego punktu stałby się nieważny lub
|
||||
niewykonywalny, to intencją jest, aby znajdowała
|
||||
zastosowanie pozostała część punktu, a treść całego punktu
|
||||
była stosowana w pozostałych okolicznościach.
|
||||
|
||||
Celem niniejszego punktu nie jest zachęcanie do
|
||||
naruszania patentów czy innych praw własności, albo też do
|
||||
podważania ich ważności; niniejszy punkt za swój jedyny
|
||||
cel ma ochronę integralności systemu rozpowszechniania
|
||||
wolnego oprogramowania, realizowanego za pomocą
|
||||
publicznych licencji. Wielu ludzi bezinteresownie wniosło
|
||||
swój wkład do stworzenia szerokiego zakresu oprogramowania
|
||||
upowszechnianego w tym systemie, mając zaufanie do
|
||||
konsekwentnego jego stosowania; wyłącznie do
|
||||
autora/ofiarodawcy należy decyzja, czy życzy on sobie
|
||||
rozprowadzania oprogramowania za pośrednictwem innego
|
||||
systemu i licencjobiorca nie może tego prawa wyboru
|
||||
ograniczać.
|
||||
Celem niniejszego punktu nie jest zachęcanie do
|
||||
naruszania patentów czy innych praw własności, albo też do
|
||||
podważania ich ważności; niniejszy punkt za swój jedyny
|
||||
cel ma ochronę integralności systemu rozpowszechniania
|
||||
wolnego oprogramowania, realizowanego za pomocą
|
||||
publicznych licencji. Wielu ludzi bezinteresownie wniosło
|
||||
swój wkład do stworzenia szerokiego zakresu oprogramowania
|
||||
upowszechnianego w tym systemie, mając zaufanie do
|
||||
konsekwentnego jego stosowania; wyłącznie do
|
||||
autora/ofiarodawcy należy decyzja, czy życzy on sobie
|
||||
rozprowadzania oprogramowania za pośrednictwem innego
|
||||
systemu i licencjobiorca nie może tego prawa wyboru
|
||||
ograniczać.
|
||||
|
||||
Intencją niniejszego punktu jest jasne i wyraźne
|
||||
przedstawienie tego, co uważa się za skutki, jakie rodzi
|
||||
pozostała część niniejszej Licencji.
|
||||
Intencją niniejszego punktu jest jasne i wyraźne
|
||||
przedstawienie tego, co uważa się za skutki, jakie rodzi
|
||||
pozostała część niniejszej Licencji.
|
||||
|
||||
8. W przypadku, gdy dystrybucja i/lub używanie Programu
|
||||
w niektórych krajach poddane jest ograniczeniom patentowym
|
||||
lub zastrzeżeniom prawami autorskimi, początkowy posiadacz
|
||||
praw autorskich, który poddaje Program pod oddziaływanie
|
||||
niniejszej Licencji, może dodać wyraźnie zakreślone
|
||||
geograficzne ograniczenie rozpowszechniania wyłączające te
|
||||
kraje, dzięki czemu dystrybucja dozwolona będzie wyłącznie
|
||||
w krajach czy wśród krajów nie objętych takim wyłączeniem.
|
||||
8. W przypadku, gdy dystrybucja i/lub używanie Programu
|
||||
w niektórych krajach poddane jest ograniczeniom patentowym
|
||||
lub zastrzeżeniom prawami autorskimi, początkowy posiadacz
|
||||
praw autorskich, który poddaje Program pod oddziaływanie
|
||||
niniejszej Licencji, może dodać wyraźnie zakreślone
|
||||
geograficzne ograniczenie rozpowszechniania wyłączające te
|
||||
kraje, dzięki czemu dystrybucja dozwolona będzie wyłącznie
|
||||
w krajach czy wśród krajów nie objętych takim wyłączeniem.
|
||||
W przypadku takim, niniejsza Licencja obejmuje dane
|
||||
ograniczenie tak, jakby było ono wpisane w jej treść.
|
||||
ograniczenie tak, jakby było ono wpisane w jej treść.
|
||||
|
||||
9. W miarę potrzeby Fundacja Wolnego Oprogramowania może
|
||||
publikować poprawione i/lub nowe wersje Powszechnej
|
||||
Licencji Publicznej. Takie nowe wersje będą napisane w
|
||||
duchu podobnym do obecnej wersji, ale mogą różnić się w
|
||||
szczegółach poruszających nowe problemy czy zagadnienia.
|
||||
9. W miarę potrzeby Fundacja Wolnego Oprogramowania może
|
||||
publikować poprawione i/lub nowe wersje Powszechnej
|
||||
Licencji Publicznej. Takie nowe wersje będą napisane w
|
||||
duchu podobnym do obecnej wersji, ale mogą różnić się w
|
||||
szczegółach poruszających nowe problemy czy zagadnienia.
|
||||
|
||||
Każdej wersji nadaje się wyróżniający ją numer. Jeżeli
|
||||
Program podaje numer wersji niniejszej Licencji, odnoszący
|
||||
się do tej wersji i "wszelkich wersji następnych", masz do
|
||||
wyboru albo stosować się do postanowień i warunków tej
|
||||
wersji, albo którejkolwiek wersji późniejszej wydanej
|
||||
przez Fundację Wolnego Oprogramowania. O ile Program nie
|
||||
podaje numeru wersji niniejszej Licencji, możesz wybrać
|
||||
dowolną wersję kiedykolwiek opublikowaną przez Fundację.
|
||||
Każdej wersji nadaje się wyróżniający ją numer. Jeżeli
|
||||
Program podaje numer wersji niniejszej Licencji, odnoszący
|
||||
się do tej wersji i "wszelkich wersji następnych", masz do
|
||||
wyboru albo stosować się do postanowień i warunków tej
|
||||
wersji, albo którejkolwiek wersji późniejszej wydanej
|
||||
przez Fundację Wolnego Oprogramowania. O ile Program nie
|
||||
podaje numeru wersji niniejszej Licencji, możesz wybrać
|
||||
dowolną wersję kiedykolwiek opublikowaną przez Fundację.
|
||||
|
||||
10. Jeśli chcesz włączyć części Programu do innych
|
||||
wolnych programów, których warunki rozpowszechniania są
|
||||
inne, zwróć się pisemnie do autora z prośbą o pozwolenie.
|
||||
W przypadku oprogramowania objętego przez Fundację prawem
|
||||
10. Jeśli chcesz włączyć części Programu do innych
|
||||
wolnych programów, których warunki rozpowszechniania są
|
||||
inne, zwróć się pisemnie do autora z prośbą o pozwolenie.
|
||||
W przypadku oprogramowania objętego przez Fundację prawem
|
||||
autorskim, napisz do Fundacji; czasami czynimy od tego
|
||||
odstępstwa. W naszej decyzji kierujemy się dwoma celami:
|
||||
odstępstwa. W naszej decyzji kierujemy się dwoma celami:
|
||||
utrzymania wolnego statusu wszystkich pochodnych naszego
|
||||
wolnego oprogramowania oraz - generalnie - promowania
|
||||
współudziału i wielokrotnego stosowania oprogramowania.
|
||||
współudziału i wielokrotnego stosowania oprogramowania.
|
||||
|
||||
|
||||
WYRÓB BEZ GWARANCJI
|
||||
WYRÓB BEZ GWARANCJI
|
||||
|
||||
11. PONIEWAŻ PROGRAM JEST LICENCJONOWANY BEZPŁATNIE, NIE
|
||||
JEST OBJĘTY GWARANCJĄ W ZAKRESIE DOZWOLONYM PRZEZ
|
||||
OBOWIĄZUJĄCE PRZEPISY. O ILE NA PIŚMIE NIE STANOWI SIĘ
|
||||
11. PONIEWAŻ PROGRAM JEST LICENCJONOWANY BEZPŁATNIE, NIE
|
||||
JEST OBJĘTY GWARANCJĄ W ZAKRESIE DOZWOLONYM PRZEZ
|
||||
OBOWIĄZUJĄCE PRZEPISY. O ILE NA PIŚMIE NIE STANOWI SIĘ
|
||||
INACZEJ, POSIADACZE PRAW AUTORSKICH I/LUB INNE STRONY
|
||||
ZAPEWNIAJĄ PROGRAM W STANIE, W JAKIM JEST ("JAK WIDAĆ")
|
||||
BEZ JAKIEJKOLWIEK GWARANCJI, ANI WYRAŹNEJ, ANI DOMYŚLNEJ,
|
||||
W TYM MIĘDZY INNYMI DOMYŚLNYCH GWARANCJI CO DO
|
||||
PRZYDATNOŚCI HANDLOWEJ I PRZYDATNOŚCI DO OKREŚLONYCH
|
||||
ZASTOSOWAŃ. CAŁOŚĆ RYZYKA W ZAKRESIE JAKOŚCI I
|
||||
SKUTECZNOŚCI DZIAŁANIA PROGRAMU PONOSISZ SAM. W RAZIE
|
||||
GDYBY PROGRAM OKAZAŁ SIĘ WADLIWY, PONOSISZ KOSZT CAŁEGO
|
||||
NIEZBĘDNEGO SERWISU, NAPRAWY I KORYGOWANIA.
|
||||
ZAPEWNIAJĄ PROGRAM W STANIE, W JAKIM JEST ("JAK WIDAĆ")
|
||||
BEZ JAKIEJKOLWIEK GWARANCJI, ANI WYRAŹNEJ, ANI DOMYŚLNEJ,
|
||||
W TYM MIĘDZY INNYMI DOMYŚLNYCH GWARANCJI CO DO
|
||||
PRZYDATNOŚCI HANDLOWEJ I PRZYDATNOŚCI DO OKREŚLONYCH
|
||||
ZASTOSOWAŃ. CAŁOŚĆ RYZYKA W ZAKRESIE JAKOŚCI I
|
||||
SKUTECZNOŚCI DZIAŁANIA PROGRAMU PONOSISZ SAM. W RAZIE
|
||||
GDYBY PROGRAM OKAZAŁ SIĘ WADLIWY, PONOSISZ KOSZT CAŁEGO
|
||||
NIEZBĘDNEGO SERWISU, NAPRAWY I KORYGOWANIA.
|
||||
|
||||
12. O ILE OBOWIĄZUJĄCE PRAWO NIE STANOWI INACZEJ ALBO
|
||||
CZEGOŚ INNEGO NIE UZGODNIONO W FORMIE PISEMNEJ, ŻADEN
|
||||
POSIADACZ PRAW AUTORSKICH ANI INNA STRONA MODYFIKUJĄCA
|
||||
I/LUB REDYSTRYBUJĄCA PROGRAM ZGODNIE Z POWYŻSZYMI
|
||||
ZEZWOLENIAMI, W ŻADNYM WYPADKU NIE JEST ODPOWIEDZIALNA
|
||||
WOBEC CIEBIE ZA SZKODY, W TYM SZKODY OGÓLNE, SPECJALNE,
|
||||
UBOCZNE LUB SKUTKOWE, WYNIKŁE Z UŻYCIA BĄDŹ NIEMOŻLIWOŚCI
|
||||
UŻYCIA PROGRAMU (W TYM, MIĘDZY INNYMI, ZA UTRATĘ DANYCH
|
||||
LUB POWSTANIE DANYCH NIEDOKŁADNYCH, ALBO ZA STRATY
|
||||
PONIESIONE PRZEZ CIEBIE LUB STRONY TRZECIE, JAK TEŻ
|
||||
NIEDZIAŁANIE PROGRAMU Z INNYMI PROGRAMAMI), NAWET JEŚLI
|
||||
DANY POSIADACZ BĄDŹ INNA STRONA ZOSTALI POWIADOMIENI O
|
||||
MOŻLIWOŚCI POWSTANIA TAKICH SZKÓD.
|
||||
12. O ILE OBOWIĄZUJĄCE PRAWO NIE STANOWI INACZEJ ALBO
|
||||
CZEGOŚ INNEGO NIE UZGODNIONO W FORMIE PISEMNEJ, ŻADEN
|
||||
POSIADACZ PRAW AUTORSKICH ANI INNA STRONA MODYFIKUJĄCA
|
||||
I/LUB REDYSTRYBUJĄCA PROGRAM ZGODNIE Z POWYŻSZYMI
|
||||
ZEZWOLENIAMI, W ŻADNYM WYPADKU NIE JEST ODPOWIEDZIALNA
|
||||
WOBEC CIEBIE ZA SZKODY, W TYM SZKODY OGÓLNE, SPECJALNE,
|
||||
UBOCZNE LUB SKUTKOWE, WYNIKŁE Z UŻYCIA BĄDŹ NIEMOŻLIWOŚCI
|
||||
UŻYCIA PROGRAMU (W TYM, MIĘDZY INNYMI, ZA UTRATĘ DANYCH
|
||||
LUB POWSTANIE DANYCH NIEDOKŁADNYCH, ALBO ZA STRATY
|
||||
PONIESIONE PRZEZ CIEBIE LUB STRONY TRZECIE, JAK TEŻ
|
||||
NIEDZIAŁANIE PROGRAMU Z INNYMI PROGRAMAMI), NAWET JEŚLI
|
||||
DANY POSIADACZ BĄDŹ INNA STRONA ZOSTALI POWIADOMIENI O
|
||||
MOŻLIWOŚCI POWSTANIA TAKICH SZKÓD.
|
||||
|
||||
|
||||
KONIEC ZASAD I WARUNKÓW
|
||||
KONIEC ZASAD I WARUNKÓW
|
||||
|
||||
Jak stosować niniejsze Warunki do Twoich nowych
|
||||
programów
|
||||
Jak stosować niniejsze Warunki do Twoich nowych
|
||||
programów
|
||||
|
||||
Jeśli opracowujesz nowy program i chciałbyś, aby stał
|
||||
się on przydatny dla szerokiego ogółu, najlepszą drogą do
|
||||
osiągnięcia tego będzie nadanie twemu programowi
|
||||
charakteru wolnego oprogramowania, które każdy może
|
||||
redystrybuować i zmieniać na niniejszych warunkach.
|
||||
Jeśli opracowujesz nowy program i chciałbyś, aby stał
|
||||
się on przydatny dla szerokiego ogółu, najlepszą drogą do
|
||||
osiągnięcia tego będzie nadanie twemu programowi
|
||||
charakteru wolnego oprogramowania, które każdy może
|
||||
redystrybuować i zmieniać na niniejszych warunkach.
|
||||
|
||||
W tym celu do programu dołącz poniższe informacje.
|
||||
Bezpieczniej jest dołączyć je na początku każdego pliku
|
||||
źródłowego, dzięki czemu najskuteczniej można przekazać
|
||||
fakt nieistnienia gwarancji; każdy plik powinien przy tym
|
||||
nosić uwagę "copyright" i odnośnik, gdzie można znaleźć
|
||||
pełną informację.
|
||||
W tym celu do programu dołącz poniższe informacje.
|
||||
Bezpieczniej jest dołączyć je na początku każdego pliku
|
||||
źródłowego, dzięki czemu najskuteczniej można przekazać
|
||||
fakt nieistnienia gwarancji; każdy plik powinien przy tym
|
||||
nosić uwagę "copyright" i odnośnik, gdzie można znaleźć
|
||||
pełną informację.
|
||||
|
||||
nazwa programu i informacja, do czego on służy.
|
||||
nazwa programu i informacja, do czego on służy.
|
||||
Copyright (C) 19../20.. nazwisko autora
|
||||
|
||||
Niniejszy program jest wolnym oprogramowaniem;
|
||||
możesz go rozprowadzać dalej i/lub modyfikować na
|
||||
możesz go rozprowadzać dalej i/lub modyfikować na
|
||||
warunkach Powszechnej Licencji Publicznej GNU,
|
||||
wydanej przez Fundację Wolnego Oprogramowania -
|
||||
według wersji 2-giej tej Licencji lub którejś z
|
||||
późniejszych wersji.
|
||||
wydanej przez Fundację Wolnego Oprogramowania -
|
||||
według wersji 2-giej tej Licencji lub którejś z
|
||||
późniejszych wersji.
|
||||
|
||||
Niniejszy program rozpowszechniany jest z nadzieją,
|
||||
iż będzie on użyteczny - jednak BEZ JAKIEJKOLWIEK
|
||||
GWARANCJI, nawet domyślnej gwarancji PRZYDATNOŚCI
|
||||
HANDLOWEJ albo PRZYDATNOŚCI DO OKREŚLONYCH
|
||||
ZASTOSOWAŃ. W celu uzyskania bliższych informacji -
|
||||
Niniejszy program rozpowszechniany jest z nadzieją,
|
||||
iż będzie on użyteczny - jednak BEZ JAKIEJKOLWIEK
|
||||
GWARANCJI, nawet domyślnej gwarancji PRZYDATNOŚCI
|
||||
HANDLOWEJ albo PRZYDATNOŚCI DO OKREŚLONYCH
|
||||
ZASTOSOWAŃ. W celu uzyskania bliższych informacji -
|
||||
Powszechna Licencja Publiczna GNU.
|
||||
|
||||
Z pewnością wraz z niniejszym programem otrzymałeś
|
||||
też egzemplarz Powszechnej Licencji Publicznej GNU
|
||||
(GNU General Public License); jeśli nie - napisz do
|
||||
Z pewnością wraz z niniejszym programem otrzymałeś
|
||||
też egzemplarz Powszechnej Licencji Publicznej GNU
|
||||
(GNU General Public License); jeśli nie - napisz do
|
||||
Free Software Foundation, Inc., 51 Franklin Street,
|
||||
Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Podaj też informacje o sposobie kontaktowania się z
|
||||
tobą pocztą elektroniczną lub zwykłą.
|
||||
Podaj też informacje o sposobie kontaktowania się z
|
||||
tobą pocztą elektroniczną lub zwykłą.
|
||||
|
||||
Jeśli dany program jest interaktywny, spraw, aby w
|
||||
momencie wchodzenia w tryb interaktywny wyświetlał on
|
||||
komunikat jak w poniższym przykładzie:
|
||||
Jeśli dany program jest interaktywny, spraw, aby w
|
||||
momencie wchodzenia w tryb interaktywny wyświetlał on
|
||||
komunikat jak w poniższym przykładzie:
|
||||
|
||||
Gnomovision wersja 69, Copyright C 19.. nazwisko
|
||||
|
||||
Gnomovision wydawany jest ABSOLUTNIE BEZ ŻADNEJ
|
||||
GWARANCJI - w celu uzyskania dalszych szczegółów
|
||||
Gnomovision wydawany jest ABSOLUTNIE BEZ ŻADNEJ
|
||||
GWARANCJI - w celu uzyskania dalszych szczegółów
|
||||
wpisz "show w". To jest wolne oprogramowanie i mile
|
||||
widziane jest dalsze rozpowszechnianie go przez
|
||||
ciebie na określonych warunkach - w celu uzyskania
|
||||
bliższych szczegółów wpisz "show c".
|
||||
ciebie na określonych warunkach - w celu uzyskania
|
||||
bliższych szczegółów wpisz "show c".
|
||||
|
||||
Powyższe hipotetyczne polecenia "show w" i "show c"
|
||||
winny powodować wyświetlenie odpowiednich części
|
||||
Powszechnej Licencji Publicznej. Oczywiście możesz używać
|
||||
innych poleceń niż "show w" i "show c"; mogą to być nawet
|
||||
kliknięcia myszą lub pozycje menu - co tylko sobie uznasz
|
||||
Powyższe hipotetyczne polecenia "show w" i "show c"
|
||||
winny powodować wyświetlenie odpowiednich części
|
||||
Powszechnej Licencji Publicznej. Oczywiście możesz używać
|
||||
innych poleceń niż "show w" i "show c"; mogą to być nawet
|
||||
kliknięcia myszą lub pozycje menu - co tylko sobie uznasz
|
||||
za stosowne.
|
||||
|
||||
Powinieneś też poprosić swego pracodawcę (jeśli
|
||||
pracujesz jako programista) czy też swoją szkołę (jeśli
|
||||
jesteś uczniem), o podpisanie, w razie potrzeby,
|
||||
"Rezygnacji z praw autorskich" do programu. Poniżej
|
||||
podajemy przykład (zmień nazwy/nazwiska):
|
||||
Powinieneś też poprosić swego pracodawcę (jeśli
|
||||
pracujesz jako programista) czy też swoją szkołę (jeśli
|
||||
jesteś uczniem), o podpisanie, w razie potrzeby,
|
||||
"Rezygnacji z praw autorskich" do programu. Poniżej
|
||||
podajemy przykład (zmień nazwy/nazwiska):
|
||||
|
||||
My, firma Jojodyne Sp. z o.o. niniejszym zrzekamy
|
||||
się i rezygnujemy z wszelkich interesów prawnych w
|
||||
się i rezygnujemy z wszelkich interesów prawnych w
|
||||
zakresie praw autorskich do programu "Gnomovision"
|
||||
(który realizuje następujące funkcje...), napisanego
|
||||
(który realizuje następujące funkcje...), napisanego
|
||||
przez p.Jana Kowalskiego.
|
||||
|
||||
Podpis: /-/ Gniewosław Wielkoważny
|
||||
Podpis: /-/ Gniewosław Wielkoważny
|
||||
|
||||
Gniewosław Wielkoważny, Prezes...itp
|
||||
Gniewosław Wielkoważny, Prezes...itp
|
||||
|
||||
Powszechna Licencja Publiczna nie zezwala na włączanie
|
||||
twego programu do programów prawnie zastrzeżonych. Jeśli
|
||||
twój program jest biblioteką podprogramów, możesz
|
||||
rozważyć, czy nie będzie korzystniej zezwolić na
|
||||
powiązanie prawnie zastrzeżonych aplikacji z biblioteką.
|
||||
Jeśli chciałbyś właśnie tego dokonać, zamiast niniejszej
|
||||
Licencji zastosuj Powszechną Licencję Publiczną GNU dla
|
||||
Powszechna Licencja Publiczna nie zezwala na włączanie
|
||||
twego programu do programów prawnie zastrzeżonych. Jeśli
|
||||
twój program jest biblioteką podprogramów, możesz
|
||||
rozważyć, czy nie będzie korzystniej zezwolić na
|
||||
powiązanie prawnie zastrzeżonych aplikacji z biblioteką.
|
||||
Jeśli chciałbyś właśnie tego dokonać, zamiast niniejszej
|
||||
Licencji zastosuj Powszechną Licencję Publiczną GNU dla
|
||||
Bibliotek.
|
||||
|
||||
[QueryBox]
|
||||
Okna zapytania
|
||||
|
||||
W oknach dialogowych użyj kursorów lub naciśnij
|
||||
podświetloną literę aby wybrać opcję. Możesz też kliknąć
|
||||
myszą na odpowiednim przycisku.
|
||||
W oknach dialogowych użyj kursorów lub naciśnij
|
||||
podświetloną literę aby wybrać opcję. Możesz też kliknąć
|
||||
myszą na odpowiednim przycisku.
|
||||
|
||||
[How to use help]
|
||||
Jak korzystać z pomocy
|
||||
Jak korzystać z pomocy
|
||||
|
||||
Do obsługi przeglądarki pomocy możesz użyć kursorów lub
|
||||
myszy. Naciśnij strzałkę w dół aby przejść do
|
||||
następnej pozycji lub przewinąć ekran w dół. Naciśnij
|
||||
strzałkę w górę aby przejść do poprzedniej pozycji lub
|
||||
przewinąć ekran w górę. Naciśnij strzałkę w prawo aby
|
||||
podążyć za zaznaczonym odnośnikiem. Naciśnij strzałkę w
|
||||
lewo aby powrócić do poprzedniego odwiedzonego węzła w
|
||||
Do obsługi przeglądarki pomocy możesz użyć kursorów lub
|
||||
myszy. Naciśnij strzałkę w dół aby przejść do
|
||||
następnej pozycji lub przewinąć ekran w dół. Naciśnij
|
||||
strzałkę w górę aby przejść do poprzedniej pozycji lub
|
||||
przewinąć ekran w górę. Naciśnij strzałkę w prawo aby
|
||||
podążyć za zaznaczonym odnośnikiem. Naciśnij strzałkę w
|
||||
lewo aby powrócić do poprzedniego odwiedzonego węzła w
|
||||
historii.
|
||||
|
||||
Jeśli twój terminal nie obsługuje klawiszy kursorów,
|
||||
możesz użyć spacji aby przewinąć do przodu i klawisza
|
||||
b aby przewinąć do tyłu. Użyj TAB aby przejść do
|
||||
następnej pozycji i ENTER aby odwiedzić zaznaczony
|
||||
odnośnik. Klawisz l wraca do poprzedniego odwiedzonego
|
||||
węzła w historii. Naciśnij ESC aby wyjść z
|
||||
przeglądarki pomocy.
|
||||
Jeśli twój terminal nie obsługuje klawiszy kursorów,
|
||||
możesz użyć spacji aby przewinąć do przodu i klawisza
|
||||
b aby przewinąć do tyłu. Użyj TAB aby przejść do
|
||||
następnej pozycji i ENTER aby odwiedzić zaznaczony
|
||||
odnośnik. Klawisz l wraca do poprzedniego odwiedzonego
|
||||
węzła w historii. Naciśnij ESC aby wyjść z
|
||||
przeglądarki pomocy.
|
||||
|
||||
Lewy przycisk myszy uaktywnia odnośnik lub przewija ekran.
|
||||
Prawy wraca do poprzedniego węzła w historii.
|
||||
Lewy przycisk myszy uaktywnia odnośnik lub przewija ekran.
|
||||
Prawy wraca do poprzedniego węzła w historii.
|
||||
|
||||
Pełna lista klawiszy przeglądarki pomocy:
|
||||
Pełna lista klawiszy przeglądarki pomocy:
|
||||
|
||||
Podstawowe klawisze ruchuGeneral Movement Keys także
|
||||
działają.
|
||||
Podstawowe klawisze ruchuGeneral Movement Keys także
|
||||
działają.
|
||||
|
||||
tab Następna pozycja.
|
||||
tab Następna pozycja.
|
||||
M-tab Poprzednia pozycja.
|
||||
dół Następna pozycja lub przewiń ekran w dół.
|
||||
góra Poprzednia pozycja lub przewiń w górę.
|
||||
prawo, enter Uaktywnia odnośnik.
|
||||
lewo, l Poprzedni węzeł w historii.
|
||||
F1 Pomoc dla przeglądarki pomocy.
|
||||
n Następny węzeł.
|
||||
p Poprzedni węzeł.
|
||||
c Przejście do Spisu treści.
|
||||
F10, esc Wyjście z przeglądarki pomocy.
|
||||
dół Następna pozycja lub przewiń ekran w dół.
|
||||
góra Poprzednia pozycja lub przewiń w górę.
|
||||
prawo, enter Uaktywnia odnośnik.
|
||||
lewo, l Poprzedni węzeł w historii.
|
||||
F1 Pomoc dla przeglądarki pomocy.
|
||||
n Następny węzeł.
|
||||
p Poprzedni węzeł.
|
||||
c Przejście do Spisu treści.
|
||||
F10, esc Wyjście z przeglądarki pomocy.
|
||||
|
||||
Local variables:
|
||||
fill-column: 58
|
||||
|
21
doc/ru/CHARSET.workflow.txt
Normal file
21
doc/ru/CHARSET.workflow.txt
Normal file
@ -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
File diff suppressed because it is too large
Load Diff
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
|
||||
qqqqqqCommanderqj
|
||||
|
||||
Вы сейчас видите главное окно интерактивной подсказки
|
||||
программы GNU Midnight Commander.
|
||||
Вы сейчас видите главное окно интерактивной подсказки
|
||||
программы GNU Midnight Commander.
|
||||
|
||||
Чтобы узнать, как пользоваться подсказкой, нажмите клавишу
|
||||
EnterHow to use help, иначе переходите к перечню разделовContents подсказки.
|
||||
Чтобы узнать, как пользоваться подсказкой, нажмите клавишу
|
||||
EnterHow to use help, иначе переходите к перечню разделовContents подсказки.
|
||||
|
||||
Программа Midnight Commander поставляется АБСОЛЮТНО БЕЗ
|
||||
ВСЯКИХ ГАРАНТИЙГарантия. Это свободно распространяемое программное
|
||||
обеспечение, созданное группой авторовAUTHORS. Вы можете передавать
|
||||
его другим при условии соблюдения требований лицензии GNUЛицензия (оригинал на английском)
|
||||
(прочитайте неофициальный переводЛицензия этой лицензии).
|
||||
Программа Midnight Commander поставляется АБСОЛЮТНО БЕЗ
|
||||
ВСЯКИХ ГАРАНТИЙГарантия. Это свободно распространяемое программное
|
||||
обеспечение, созданное группой авторовAUTHORS. Вы можете передавать
|
||||
его другим при условии соблюдения требований лицензии GNUЛицензия (оригинал на английском)
|
||||
(прочитайте неофициальный переводЛицензия этой лицензии).
|
||||
|
||||
Русский перевод текста подсказки - Костромин В.А., 1999 г.[Лицензия (оригинал на английском)]
|
||||
Русский перевод текста подсказки - Костромин В.А., 1999 г.[Лицензия (оригинал на английском)]
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
@ -429,478 +429,478 @@ to permit linking proprietary applications with the
|
||||
library. If this is what you want to do, use the GNU
|
||||
Library General Public License instead of this License.
|
||||
|
||||
[Лицензия]
|
||||
[Лицензия]
|
||||
|
||||
УНИВЕРСАЛЬНАЯ ОБЩЕСТВЕННАЯ ЛИЦЕНЗИЯ GNU
|
||||
УНИВЕРСАЛЬНАЯ ОБЩЕСТВЕННАЯ ЛИЦЕНЗИЯ GNU
|
||||
|
||||
Версия 2, июнь 1991
|
||||
Версия 2, июнь 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
(C) Перевод. О.В. Кузина, В.М. Юфа, 1993
|
||||
(C) Перевод. О.С. Тихонов, 1998
|
||||
(C) Перевод. О.В. Кузина, В.М. Юфа, 1993
|
||||
(C) Перевод. О.С. Тихонов, 1998
|
||||
|
||||
Всем разрешается копировать и распространять дословные копии
|
||||
этого лицензионного документа, но изменять его нельзя.
|
||||
Всем разрешается копировать и распространять дословные копии
|
||||
этого лицензионного документа, но изменять его нельзя.
|
||||
|
||||
Преамбула
|
||||
Преамбула
|
||||
|
||||
Лицензии на большую часть программного обеспечения (ПО) сос-
|
||||
тавлены так, чтобы лишить вас свободы совместно использовать
|
||||
и изменять его. Напротив, Универсальная Общественная Лицензия
|
||||
GNU предназначена гарантировать вашу свободу совместно ис-
|
||||
пользовать и изменять свободное ПО, т.е. удостоверить, что ПО
|
||||
является свободным для всех его пользователей. Эта Универ-
|
||||
сальная Общественная Лицензия применима к большей части ПО
|
||||
Фонда Свободного ПО и ко всем другим программам, чьи авторы
|
||||
принимают на себя обязательства ее использовать. (Вместо нее
|
||||
для части ПО Фонда Свободного ПО применяется Универсальная
|
||||
Общественная Лицензия GNU для библиотек.) Вы тоже можете
|
||||
использовать ее для своих программ.
|
||||
Лицензии на большую часть программного обеспечения (ПО) сос-
|
||||
тавлены так, чтобы лишить вас свободы совместно использовать
|
||||
и изменять его. Напротив, Универсальная Общественная Лицензия
|
||||
GNU предназначена гарантировать вашу свободу совместно ис-
|
||||
пользовать и изменять свободное ПО, т.е. удостоверить, что ПО
|
||||
является свободным для всех его пользователей. Эта Универ-
|
||||
сальная Общественная Лицензия применима к большей части ПО
|
||||
Фонда Свободного ПО и ко всем другим программам, чьи авторы
|
||||
принимают на себя обязательства ее использовать. (Вместо нее
|
||||
для части ПО Фонда Свободного ПО применяется Универсальная
|
||||
Общественная Лицензия GNU для библиотек.) Вы тоже можете
|
||||
использовать ее для своих программ.
|
||||
|
||||
Когда мы говорим о свободном ПО, мы имеем в виду свободу, а
|
||||
не цену. Предполагается, что наши Универсальные Общественные
|
||||
Лицензии гарантируют, что вы пользуетесь свободой распростра-
|
||||
нять копии свободного ПО (и получать за это вознаграждение,
|
||||
если вы того желаете); что вы получаете исходный код или
|
||||
можете получить его, если захотите; что вы можете изменять
|
||||
ПО или использовать его части в новых свободных программах;
|
||||
и что вы знаете, что вы можете все это делать.
|
||||
Когда мы говорим о свободном ПО, мы имеем в виду свободу, а
|
||||
не цену. Предполагается, что наши Универсальные Общественные
|
||||
Лицензии гарантируют, что вы пользуетесь свободой распростра-
|
||||
нять копии свободного ПО (и получать за это вознаграждение,
|
||||
если вы того желаете); что вы получаете исходный код или
|
||||
можете получить его, если захотите; что вы можете изменять
|
||||
ПО или использовать его части в новых свободных программах;
|
||||
и что вы знаете, что вы можете все это делать.
|
||||
|
||||
Чтобы защитить ваши права, нам нужно ввести такие ограниче-
|
||||
ния, которые запретят кому бы то ни было отказывать вам в
|
||||
этих правах или потребовать от вас отказаться от этих прав.
|
||||
Эти ограничения переводятся в некоторые обязательства для
|
||||
вас, если вы распространяете копии ПО или если вы модифици-
|
||||
руете его.
|
||||
Чтобы защитить ваши права, нам нужно ввести такие ограниче-
|
||||
ния, которые запретят кому бы то ни было отказывать вам в
|
||||
этих правах или потребовать от вас отказаться от этих прав.
|
||||
Эти ограничения переводятся в некоторые обязательства для
|
||||
вас, если вы распространяете копии ПО или если вы модифици-
|
||||
руете его.
|
||||
|
||||
Например, если вы распространяете копии такой программы
|
||||
бесплатно или за вознаграждение, вы должны предоставить
|
||||
получателям все права, которыми вы обладаете. Вы должны
|
||||
гарантировать, что они тоже получат или смогут получить
|
||||
исходный код. И вы должны показать им эти условия, чтобы
|
||||
они знали о своих правах.
|
||||
Например, если вы распространяете копии такой программы
|
||||
бесплатно или за вознаграждение, вы должны предоставить
|
||||
получателям все права, которыми вы обладаете. Вы должны
|
||||
гарантировать, что они тоже получат или смогут получить
|
||||
исходный код. И вы должны показать им эти условия, чтобы
|
||||
они знали о своих правах.
|
||||
|
||||
Мы защищаем ваши права в два этапа: (1) сохраняем авторские
|
||||
права на ПО и (2) предлагаем вам эту лицензию, которая дает
|
||||
вам законное право копировать, распространять и/или модифи-
|
||||
цировать ПО.
|
||||
Мы защищаем ваши права в два этапа: (1) сохраняем авторские
|
||||
права на ПО и (2) предлагаем вам эту лицензию, которая дает
|
||||
вам законное право копировать, распространять и/или модифи-
|
||||
цировать ПО.
|
||||
|
||||
Также, чтобы защитить нас и каждого автора, мы хотим удосто-
|
||||
вериться, что все понимают, что гарантий на это свободное ПО
|
||||
нет. Если ПО модифицируется и передается кем-то еще, мы
|
||||
хотим, чтобы получатели ПО знали, что то, что у них есть --
|
||||
это не оригинал, чтобы любые проблемы, созданные другими, не
|
||||
отразились на репутации первоначальных авторов.
|
||||
Также, чтобы защитить нас и каждого автора, мы хотим удосто-
|
||||
вериться, что все понимают, что гарантий на это свободное ПО
|
||||
нет. Если ПО модифицируется и передается кем-то еще, мы
|
||||
хотим, чтобы получатели ПО знали, что то, что у них есть --
|
||||
это не оригинал, чтобы любые проблемы, созданные другими, не
|
||||
отразились на репутации первоначальных авторов.
|
||||
|
||||
И наконец, каждой свободной программе постоянно угрожают па-
|
||||
тенты на ПО. Мы хотим избежать опасности, что повторные рас-
|
||||
пространители свободной программы самостоятельно получат па-
|
||||
тенты, делая программу таким образом частной собственностью.
|
||||
Чтобы предотвратить это, мы явно заявляем, что любой патент
|
||||
должен быть либо предоставлен всем для свободного использо-
|
||||
вания, либо не предоставлен никому.
|
||||
И наконец, каждой свободной программе постоянно угрожают па-
|
||||
тенты на ПО. Мы хотим избежать опасности, что повторные рас-
|
||||
пространители свободной программы самостоятельно получат па-
|
||||
тенты, делая программу таким образом частной собственностью.
|
||||
Чтобы предотвратить это, мы явно заявляем, что любой патент
|
||||
должен быть либо предоставлен всем для свободного использо-
|
||||
вания, либо не предоставлен никому.
|
||||
|
||||
Ниже следуют точные определения и условия для копирования,
|
||||
распространения и модификации.
|
||||
Ниже следуют точные определения и условия для копирования,
|
||||
распространения и модификации.
|
||||
|
||||
ОПРЕДЕЛЕНИЯ И УСЛОВИЯ ДЛЯ КОПИРОВАНИЯ, РАСПРОСТРАНЕНИЯ И
|
||||
МОДИФИКАЦИИ
|
||||
ОПРЕДЕЛЕНИЯ И УСЛОВИЯ ДЛЯ КОПИРОВАНИЯ, РАСПРОСТРАНЕНИЯ И
|
||||
МОДИФИКАЦИИ
|
||||
|
||||
1. Эта Лицензия применима к любой программе или другому
|
||||
произведению, содержащему уведомление, помещенное держа-
|
||||
телем авторских прав и сообщающее о том, что оно может
|
||||
распространяться при условиях, оговоренных в данной Уни-
|
||||
версальной Общественной Лицензии. В последующем термин
|
||||
"Программа" относится к любой такой программе или произ-
|
||||
ведению, а термин "произведение, основанное на Программе"
|
||||
означает Программу или любое произведение, содержащее
|
||||
Программу или ее часть, дословную, или модифицированную,
|
||||
и/или переведенную на другой язык. (Здесь и далее перевод
|
||||
включается без ограничений в понятие "модификация".)
|
||||
Каждый обладатель лицензии адресуется как "вы". Виды дея-
|
||||
тельности, не являющиеся копированием, распространением
|
||||
или модификацией не охватываются этой Лицензией; они за
|
||||
пределами ее влияния. Использование Программы по ее функ-
|
||||
циональному назначению не ограничено, и выходные данные
|
||||
Программы охватываются этой Лицензией, только если их со-
|
||||
держание является произведением, основанным на Программе
|
||||
(вне зависимости от того, были ли они получены в процессе
|
||||
использования Программы). Являются ли они таковыми, зави-
|
||||
сит от того, что именно делает Программа.
|
||||
2. Вы можете копировать и распространять дословные копии ис-
|
||||
ходного кода Программы по его получении на любом носите-
|
||||
ле, при условии что вы соответствующим образом помещаете
|
||||
на видном месте в каждой копии соответствующее уведомле-
|
||||
ние об авторских правах и отказ от гарантий; оставляете
|
||||
нетронутыми все уведомления, относящиеся к данной Лицен-
|
||||
зии и к отсутствию каких-либо гарантий; и передаете всем
|
||||
другим получателям Программы копию данной Лицензии вместе
|
||||
с Программой. Вы можете назначить плату за физический акт
|
||||
передачи копии и можете по своему усмотрению предостав-
|
||||
лять гарантии за вознаграждение.
|
||||
3. Вы можете изменять свою копию или копии Программы или
|
||||
любой ее части, создавая таким образом произведение, ос-
|
||||
нованное на Программе, и копировать и распространять эти
|
||||
модификации или произведение в соответствии с Разделом 1,
|
||||
приведенным выше, при условии, что вы выполните все ниже-
|
||||
следующие условия:
|
||||
1. Вы обязаны снабдить модифицированные файлы заметными
|
||||
уведомлениями, содержащими указания на то, что вы
|
||||
изменили файлы, и дату каждого изменения.
|
||||
2. Вы обязаны предоставить всем третьим лицам лицензию
|
||||
на бесплатное использование каждого произведения,
|
||||
которое вы распространяете или публикуете, целиком,
|
||||
и которое полностью или частично содержит Программу
|
||||
или какую-либо ее часть, на условиях, оговоренных в
|
||||
данной Лицензии.
|
||||
3. Если модифицированная программа обычно читает коман-
|
||||
ды в интерактивном режиме работы, вы должны сделать
|
||||
так, чтобы при запуске для работы в таком интер-
|
||||
активном режиме обычным для нее способом она печа-
|
||||
тала или выводила на экран объявление, содержащее
|
||||
соответствующее уведомление об авторских правах и
|
||||
уведомление о том, что гарантий нет (или, наоборот,
|
||||
сообщающее о том, что вы обеспечиваете гарантии), и
|
||||
что пользователи могут повторно распространять про-
|
||||
грамму при этих условиях, и указывающее пользовате-
|
||||
лю, как просмотреть копию данной Лицензии.
|
||||
(Исключение: если сама Программа работает в интер-
|
||||
активном режиме, но обычно не выводит подобное
|
||||
объявление, то ваше произведение, основанное на
|
||||
Программе, не обязано выводить объявление.)
|
||||
Эти требования применяются к модифицированному произве-
|
||||
дению в целом. Если известные части этого произведения
|
||||
не были основаны на Программе и могут обоснованно счи-
|
||||
таться независимыми и самостоятельными произведениями,
|
||||
то эта Лицензия и ее условия не распространяются на эти
|
||||
части, если вы распространяете их как отдельные произве-
|
||||
дения. Но если вы распространяете эти части как часть
|
||||
целого произведения, основанного на Программе, то вы
|
||||
обязаны делать это в соответствии с условиями данной Ли-
|
||||
цензии, распространяя права получателей лицензии на все
|
||||
произведение и, таким образом, на каждую часть, вне за-
|
||||
висимости от того, кто ее написал. Таким образом, содер-
|
||||
жание этого раздела не имеет цели претендовать на ваши
|
||||
права на произведение, написанное полностью вами, или
|
||||
оспаривать их; цель скорее в том, чтобы развить право
|
||||
управлять распространением производных или коллективных
|
||||
произведений, основанных на Программе. Кроме того, прос-
|
||||
тое нахождение другого произведения, не основанного на
|
||||
этой Программе, совместно с Программой (или с произведе-
|
||||
нием, основанным на этой Программе) на том же носителе
|
||||
для постоянного хранения или распространяемом носителе
|
||||
не распространяет действие этой Лицензии на другое произ-
|
||||
ведение.
|
||||
4. Вы можете копировать и распространять Программу (или
|
||||
произведение, основанное на ней) согласно Разделу 2) в
|
||||
объектном коде или в выполнимом виде в соответствии с
|
||||
Разделами 1 и 2, приведенными выше, при условии, что вы
|
||||
также выполните одно из следующих требований:
|
||||
1. Сопроводите ее полным соответствующим машиночитаемым
|
||||
исходным кодом, который должен распространяться в
|
||||
соответствии с Разделами 1 и 2, приведенными выше,
|
||||
на носителе, обычно используемом для обмена ПО; или,
|
||||
2. Сопроводите ее письменным предложением, действитель-
|
||||
ным по крайней мере в течение трех лет, предоставить
|
||||
любому третьему лицу за вознаграждение не большее
|
||||
стоимости физического акта изготовления копии полную
|
||||
машиночитаемую копию соответствующего исходного
|
||||
кода, подлежащую распространению в соответствии с
|
||||
Разделами 1 и 2, приведенными выше; или
|
||||
3. Сопроводите ее информацией, полученной вами в ка-
|
||||
честве предложения распространить соответствующий
|
||||
исходный код. (Эта возможность допустима только для
|
||||
некоммерческого распространения, и только если вы
|
||||
получили программу в объектном коде или в выполнимом
|
||||
виде с предложением в соответствии с Пунктом b)
|
||||
выше.)
|
||||
Исходный код для произведения означает его вид, пред-
|
||||
почтительный для выполнения в нем модификаций. Для ис-
|
||||
полняемого произведения полный исходный код означает все
|
||||
исходные коды для всех модулей, которые он содержит, плюс
|
||||
любые связанные с произведением файлы определения
|
||||
интерфейса, плюс сценарии, используемые для управления
|
||||
компиляцией и установкой исполняемого произведения.
|
||||
Однако, в виде особого исключения распространяемый исход-
|
||||
ный код не обязан включать то, что обычно предоставляется
|
||||
с основными компонентами операционной системы, под
|
||||
управлением которой работает исполняемое произведение, за
|
||||
исключением случая, когда сам компонент сопровождает
|
||||
исполняемое произведение. Если распространение исполня-
|
||||
емого произведения или объектного кода происходит путем
|
||||
предоставления доступа для копирования с обозначенного
|
||||
места, то предоставление доступа для копирования исходно-
|
||||
го кода с того же места считается распространением исход-
|
||||
ного кода, даже если третьи лица не принуждаются к копи-
|
||||
рованию исходного кода вместе с объектным кодом.
|
||||
5. Вы не можете копировать, изменять, повторно лицензиро-
|
||||
вать, или распространять Программу иначе, чем это явно
|
||||
предусмотрено данной Лицензией. Любая попытка копировать,
|
||||
изменять, повторно лицензировать, или распространять Про-
|
||||
грамму каким-либо другим способом неправомерна и автома-
|
||||
тически прекращает ваши права данные вам этой Лицензией.
|
||||
Однако лицензии лиц, получивших от вас копии или права
|
||||
согласно данной Универсальной Общественной Лицензии, не
|
||||
прекратят своего действия до тех пор, пока эти лица пол-
|
||||
ностью соблюдают условия.
|
||||
6. Вы не обязаны соглашаться с этой Лицензией, так как вы
|
||||
не подписывали ее. Однако тогда вы не получаете права
|
||||
модифицировать или распространять Программу или основан-
|
||||
ные на Программе произведения. Эти действия запрещены
|
||||
законом, если вы не принимаете к соблюдению эту Лицензию.
|
||||
А значит, изменяя или распространяя Программу (или
|
||||
произведение, основанное на Программе), вы изъявляете
|
||||
свое согласие с этой Лицензией и всеми ее условиями о
|
||||
копировании, распространении или модификации Программы
|
||||
или произведений, основанных на ней.
|
||||
7. Каждый раз, когда вы повторно распространяете Программу
|
||||
(или любое произведение, основанное на Программе), полу-
|
||||
чатель этого произведения автоматически получает лицензию
|
||||
от первоначального держателя лицензии на копирование,
|
||||
распространение или модификацию Программы, обсуждаемую
|
||||
в этих определениях и условиях. Вы не можете налагать
|
||||
каких-либо дополнительных ограничений на осуществление
|
||||
получателем прав, предоставленных данным документом. Вы
|
||||
не несете ответственности за соблюдение третьими лицами
|
||||
условий этой Лицензии.
|
||||
8. Если в результате судебного разбирательства, или обвине-
|
||||
ния в нарушении патента или по любой другой причине (не
|
||||
обязательно связанной с патентами), вам навязаны условия,
|
||||
противоречащие данной Лицензии (как по решению суда, так
|
||||
и нет), то это не освобождает вас от соблюдения Лицензии.
|
||||
Если вы не можете заниматься распространением так, чтобы
|
||||
одновременно удовлетворить требованиям и этой Лицензии,
|
||||
и всем другим требованиям, то вы не должны заниматься
|
||||
распространением Программы.
|
||||
Например, если патент не позволяет безвозмездное повтор-
|
||||
ное распространение Программы всем, кто получил копии от
|
||||
вас непосредственно или через посредников, то единствен-
|
||||
ным способом удовлетворить и патенту, и этой Лицензии
|
||||
будет ваш полный отказ от распространения Программы. Если
|
||||
какая-либо часть этого раздела не имеет силы или не может
|
||||
быть применена при любых конкретных обстоятельствах, то
|
||||
подразумевается, что имеет силу остальная часть раздела,
|
||||
и весь Раздел имеет силу при других обстоятельствах. Цель
|
||||
этого раздела -- не побудить вас делать заявления о нару-
|
||||
шениях прав на патент, или заявлять о других претензиях
|
||||
на право собственности, или оспаривать правильность по-
|
||||
добных претензий; единственная цель этого раздела -- за-
|
||||
щита целостности системы распространения свободного ПО,
|
||||
которая реализуется использованием общих лицензий. Многие
|
||||
люди благодаря этой системе внесли щедрый вклад в широкий
|
||||
спектр распространяемого ПО полагаясь на согласованное
|
||||
применение этой системы; автору принадлежит право решать
|
||||
хочет ли он или она распространять ПО в этой системе или
|
||||
в какой-то другой, и получатель лицензии не может влиять
|
||||
на принятие этого решения. Этот раздел предназначен для
|
||||
того, чтобы тщательно прояснить, что полагается следстви-
|
||||
ем из остальной части данной Лицензии.
|
||||
9. Если распространение и/или применение Программы ограниче-
|
||||
но в ряде стран либо патентами, либо авторскими правами
|
||||
на интерфейсы, первоначальный обладатель авторских прав,
|
||||
выпускающий Программу с этой Лицензией, может добавить
|
||||
явное ограничение на географическое распространение,
|
||||
исключив такие страны, так что распространение разреша-
|
||||
ется только в тех странах, которые не были исключены. В
|
||||
этом случае данная Лицензия включает в себя это ограниче-
|
||||
ние, как если бы оно было написано в тексте данной Лицен-
|
||||
зии.
|
||||
10. Фонд Свободного ПО может время от времени публиковать
|
||||
пересмотренные и/или новые версии Универсальной Общест-
|
||||
венной Лицензии. Такие новые версии будут сходны по духу
|
||||
с настоящей версией, но могут отличаться в деталях,
|
||||
направленных на новые проблемы или обстоятельства. Каждой
|
||||
версии придается отличительный номер версии. Если в Про-
|
||||
грамме указан номер версии данной Лицензии, которая к ней
|
||||
применима, и слова "любая последующая версия", вы можете
|
||||
по выбору следовать определениям и условиям либо данной
|
||||
версии, либо любой последующей версии, опубликованной
|
||||
Фондом Свободного ПО. Если в Программе не указан номер
|
||||
версии данной Лицензии, вы можете выбрать любую версию,
|
||||
когда-либо опубликованную Фондом Свободного ПО.
|
||||
11. Если вы хотите встроить части Программы в другие свобод-
|
||||
ные программы с иными условиями распространения, напишите
|
||||
автору с просьбой о разрешении. Для ПО, которое охраняет-
|
||||
ся авторскими правами Фонда Свободного ПО, напишите в
|
||||
Фонд Свободного ПО; мы иногда делаем исключения для
|
||||
этого. Наше решение будет руководствоваться двумя целями:
|
||||
сохранения свободного статуса всех производных нашего
|
||||
свободного ПО и содействия совместному и повторному ис-
|
||||
пользованию ПО вообще.
|
||||
1. Эта Лицензия применима к любой программе или другому
|
||||
произведению, содержащему уведомление, помещенное держа-
|
||||
телем авторских прав и сообщающее о том, что оно может
|
||||
распространяться при условиях, оговоренных в данной Уни-
|
||||
версальной Общественной Лицензии. В последующем термин
|
||||
"Программа" относится к любой такой программе или произ-
|
||||
ведению, а термин "произведение, основанное на Программе"
|
||||
означает Программу или любое произведение, содержащее
|
||||
Программу или ее часть, дословную, или модифицированную,
|
||||
и/или переведенную на другой язык. (Здесь и далее перевод
|
||||
включается без ограничений в понятие "модификация".)
|
||||
Каждый обладатель лицензии адресуется как "вы". Виды дея-
|
||||
тельности, не являющиеся копированием, распространением
|
||||
или модификацией не охватываются этой Лицензией; они за
|
||||
пределами ее влияния. Использование Программы по ее функ-
|
||||
циональному назначению не ограничено, и выходные данные
|
||||
Программы охватываются этой Лицензией, только если их со-
|
||||
держание является произведением, основанным на Программе
|
||||
(вне зависимости от того, были ли они получены в процессе
|
||||
использования Программы). Являются ли они таковыми, зави-
|
||||
сит от того, что именно делает Программа.
|
||||
2. Вы можете копировать и распространять дословные копии ис-
|
||||
ходного кода Программы по его получении на любом носите-
|
||||
ле, при условии что вы соответствующим образом помещаете
|
||||
на видном месте в каждой копии соответствующее уведомле-
|
||||
ние об авторских правах и отказ от гарантий; оставляете
|
||||
нетронутыми все уведомления, относящиеся к данной Лицен-
|
||||
зии и к отсутствию каких-либо гарантий; и передаете всем
|
||||
другим получателям Программы копию данной Лицензии вместе
|
||||
с Программой. Вы можете назначить плату за физический акт
|
||||
передачи копии и можете по своему усмотрению предостав-
|
||||
лять гарантии за вознаграждение.
|
||||
3. Вы можете изменять свою копию или копии Программы или
|
||||
любой ее части, создавая таким образом произведение, ос-
|
||||
нованное на Программе, и копировать и распространять эти
|
||||
модификации или произведение в соответствии с Разделом 1,
|
||||
приведенным выше, при условии, что вы выполните все ниже-
|
||||
следующие условия:
|
||||
1. Вы обязаны снабдить модифицированные файлы заметными
|
||||
уведомлениями, содержащими указания на то, что вы
|
||||
изменили файлы, и дату каждого изменения.
|
||||
2. Вы обязаны предоставить всем третьим лицам лицензию
|
||||
на бесплатное использование каждого произведения,
|
||||
которое вы распространяете или публикуете, целиком,
|
||||
и которое полностью или частично содержит Программу
|
||||
или какую-либо ее часть, на условиях, оговоренных в
|
||||
данной Лицензии.
|
||||
3. Если модифицированная программа обычно читает коман-
|
||||
ды в интерактивном режиме работы, вы должны сделать
|
||||
так, чтобы при запуске для работы в таком интер-
|
||||
активном режиме обычным для нее способом она печа-
|
||||
тала или выводила на экран объявление, содержащее
|
||||
соответствующее уведомление об авторских правах и
|
||||
уведомление о том, что гарантий нет (или, наоборот,
|
||||
сообщающее о том, что вы обеспечиваете гарантии), и
|
||||
что пользователи могут повторно распространять про-
|
||||
грамму при этих условиях, и указывающее пользовате-
|
||||
лю, как просмотреть копию данной Лицензии.
|
||||
(Исключение: если сама Программа работает в интер-
|
||||
активном режиме, но обычно не выводит подобное
|
||||
объявление, то ваше произведение, основанное на
|
||||
Программе, не обязано выводить объявление.)
|
||||
Эти требования применяются к модифицированному произве-
|
||||
дению в целом. Если известные части этого произведения
|
||||
не были основаны на Программе и могут обоснованно счи-
|
||||
таться независимыми и самостоятельными произведениями,
|
||||
то эта Лицензия и ее условия не распространяются на эти
|
||||
части, если вы распространяете их как отдельные произве-
|
||||
дения. Но если вы распространяете эти части как часть
|
||||
целого произведения, основанного на Программе, то вы
|
||||
обязаны делать это в соответствии с условиями данной Ли-
|
||||
цензии, распространяя права получателей лицензии на все
|
||||
произведение и, таким образом, на каждую часть, вне за-
|
||||
висимости от того, кто ее написал. Таким образом, содер-
|
||||
жание этого раздела не имеет цели претендовать на ваши
|
||||
права на произведение, написанное полностью вами, или
|
||||
оспаривать их; цель скорее в том, чтобы развить право
|
||||
управлять распространением производных или коллективных
|
||||
произведений, основанных на Программе. Кроме того, прос-
|
||||
тое нахождение другого произведения, не основанного на
|
||||
этой Программе, совместно с Программой (или с произведе-
|
||||
нием, основанным на этой Программе) на том же носителе
|
||||
для постоянного хранения или распространяемом носителе
|
||||
не распространяет действие этой Лицензии на другое произ-
|
||||
ведение.
|
||||
4. Вы можете копировать и распространять Программу (или
|
||||
произведение, основанное на ней) согласно Разделу 2) в
|
||||
объектном коде или в выполнимом виде в соответствии с
|
||||
Разделами 1 и 2, приведенными выше, при условии, что вы
|
||||
также выполните одно из следующих требований:
|
||||
1. Сопроводите ее полным соответствующим машиночитаемым
|
||||
исходным кодом, который должен распространяться в
|
||||
соответствии с Разделами 1 и 2, приведенными выше,
|
||||
на носителе, обычно используемом для обмена ПО; или,
|
||||
2. Сопроводите ее письменным предложением, действитель-
|
||||
ным по крайней мере в течение трех лет, предоставить
|
||||
любому третьему лицу за вознаграждение не большее
|
||||
стоимости физического акта изготовления копии полную
|
||||
машиночитаемую копию соответствующего исходного
|
||||
кода, подлежащую распространению в соответствии с
|
||||
Разделами 1 и 2, приведенными выше; или
|
||||
3. Сопроводите ее информацией, полученной вами в ка-
|
||||
честве предложения распространить соответствующий
|
||||
исходный код. (Эта возможность допустима только для
|
||||
некоммерческого распространения, и только если вы
|
||||
получили программу в объектном коде или в выполнимом
|
||||
виде с предложением в соответствии с Пунктом b)
|
||||
выше.)
|
||||
Исходный код для произведения означает его вид, пред-
|
||||
почтительный для выполнения в нем модификаций. Для ис-
|
||||
полняемого произведения полный исходный код означает все
|
||||
исходные коды для всех модулей, которые он содержит, плюс
|
||||
любые связанные с произведением файлы определения
|
||||
интерфейса, плюс сценарии, используемые для управления
|
||||
компиляцией и установкой исполняемого произведения.
|
||||
Однако, в виде особого исключения распространяемый исход-
|
||||
ный код не обязан включать то, что обычно предоставляется
|
||||
с основными компонентами операционной системы, под
|
||||
управлением которой работает исполняемое произведение, за
|
||||
исключением случая, когда сам компонент сопровождает
|
||||
исполняемое произведение. Если распространение исполня-
|
||||
емого произведения или объектного кода происходит путем
|
||||
предоставления доступа для копирования с обозначенного
|
||||
места, то предоставление доступа для копирования исходно-
|
||||
го кода с того же места считается распространением исход-
|
||||
ного кода, даже если третьи лица не принуждаются к копи-
|
||||
рованию исходного кода вместе с объектным кодом.
|
||||
5. Вы не можете копировать, изменять, повторно лицензиро-
|
||||
вать, или распространять Программу иначе, чем это явно
|
||||
предусмотрено данной Лицензией. Любая попытка копировать,
|
||||
изменять, повторно лицензировать, или распространять Про-
|
||||
грамму каким-либо другим способом неправомерна и автома-
|
||||
тически прекращает ваши права данные вам этой Лицензией.
|
||||
Однако лицензии лиц, получивших от вас копии или права
|
||||
согласно данной Универсальной Общественной Лицензии, не
|
||||
прекратят своего действия до тех пор, пока эти лица пол-
|
||||
ностью соблюдают условия.
|
||||
6. Вы не обязаны соглашаться с этой Лицензией, так как вы
|
||||
не подписывали ее. Однако тогда вы не получаете права
|
||||
модифицировать или распространять Программу или основан-
|
||||
ные на Программе произведения. Эти действия запрещены
|
||||
законом, если вы не принимаете к соблюдению эту Лицензию.
|
||||
А значит, изменяя или распространяя Программу (или
|
||||
произведение, основанное на Программе), вы изъявляете
|
||||
свое согласие с этой Лицензией и всеми ее условиями о
|
||||
копировании, распространении или модификации Программы
|
||||
или произведений, основанных на ней.
|
||||
7. Каждый раз, когда вы повторно распространяете Программу
|
||||
(или любое произведение, основанное на Программе), полу-
|
||||
чатель этого произведения автоматически получает лицензию
|
||||
от первоначального держателя лицензии на копирование,
|
||||
распространение или модификацию Программы, обсуждаемую
|
||||
в этих определениях и условиях. Вы не можете налагать
|
||||
каких-либо дополнительных ограничений на осуществление
|
||||
получателем прав, предоставленных данным документом. Вы
|
||||
не несете ответственности за соблюдение третьими лицами
|
||||
условий этой Лицензии.
|
||||
8. Если в результате судебного разбирательства, или обвине-
|
||||
ния в нарушении патента или по любой другой причине (не
|
||||
обязательно связанной с патентами), вам навязаны условия,
|
||||
противоречащие данной Лицензии (как по решению суда, так
|
||||
и нет), то это не освобождает вас от соблюдения Лицензии.
|
||||
Если вы не можете заниматься распространением так, чтобы
|
||||
одновременно удовлетворить требованиям и этой Лицензии,
|
||||
и всем другим требованиям, то вы не должны заниматься
|
||||
распространением Программы.
|
||||
Например, если патент не позволяет безвозмездное повтор-
|
||||
ное распространение Программы всем, кто получил копии от
|
||||
вас непосредственно или через посредников, то единствен-
|
||||
ным способом удовлетворить и патенту, и этой Лицензии
|
||||
будет ваш полный отказ от распространения Программы. Если
|
||||
какая-либо часть этого раздела не имеет силы или не может
|
||||
быть применена при любых конкретных обстоятельствах, то
|
||||
подразумевается, что имеет силу остальная часть раздела,
|
||||
и весь Раздел имеет силу при других обстоятельствах. Цель
|
||||
этого раздела -- не побудить вас делать заявления о нару-
|
||||
шениях прав на патент, или заявлять о других претензиях
|
||||
на право собственности, или оспаривать правильность по-
|
||||
добных претензий; единственная цель этого раздела -- за-
|
||||
щита целостности системы распространения свободного ПО,
|
||||
которая реализуется использованием общих лицензий. Многие
|
||||
люди благодаря этой системе внесли щедрый вклад в широкий
|
||||
спектр распространяемого ПО полагаясь на согласованное
|
||||
применение этой системы; автору принадлежит право решать
|
||||
хочет ли он или она распространять ПО в этой системе или
|
||||
в какой-то другой, и получатель лицензии не может влиять
|
||||
на принятие этого решения. Этот раздел предназначен для
|
||||
того, чтобы тщательно прояснить, что полагается следстви-
|
||||
ем из остальной части данной Лицензии.
|
||||
9. Если распространение и/или применение Программы ограниче-
|
||||
но в ряде стран либо патентами, либо авторскими правами
|
||||
на интерфейсы, первоначальный обладатель авторских прав,
|
||||
выпускающий Программу с этой Лицензией, может добавить
|
||||
явное ограничение на географическое распространение,
|
||||
исключив такие страны, так что распространение разреша-
|
||||
ется только в тех странах, которые не были исключены. В
|
||||
этом случае данная Лицензия включает в себя это ограниче-
|
||||
ние, как если бы оно было написано в тексте данной Лицен-
|
||||
зии.
|
||||
10. Фонд Свободного ПО может время от времени публиковать
|
||||
пересмотренные и/или новые версии Универсальной Общест-
|
||||
венной Лицензии. Такие новые версии будут сходны по духу
|
||||
с настоящей версией, но могут отличаться в деталях,
|
||||
направленных на новые проблемы или обстоятельства. Каждой
|
||||
версии придается отличительный номер версии. Если в Про-
|
||||
грамме указан номер версии данной Лицензии, которая к ней
|
||||
применима, и слова "любая последующая версия", вы можете
|
||||
по выбору следовать определениям и условиям либо данной
|
||||
версии, либо любой последующей версии, опубликованной
|
||||
Фондом Свободного ПО. Если в Программе не указан номер
|
||||
версии данной Лицензии, вы можете выбрать любую версию,
|
||||
когда-либо опубликованную Фондом Свободного ПО.
|
||||
11. Если вы хотите встроить части Программы в другие свобод-
|
||||
ные программы с иными условиями распространения, напишите
|
||||
автору с просьбой о разрешении. Для ПО, которое охраняет-
|
||||
ся авторскими правами Фонда Свободного ПО, напишите в
|
||||
Фонд Свободного ПО; мы иногда делаем исключения для
|
||||
этого. Наше решение будет руководствоваться двумя целями:
|
||||
сохранения свободного статуса всех производных нашего
|
||||
свободного ПО и содействия совместному и повторному ис-
|
||||
пользованию ПО вообще.
|
||||
|
||||
[Гарантия]
|
||||
НИКАКИХ ГАРАНТИЙ
|
||||
[Гарантия]
|
||||
НИКАКИХ ГАРАНТИЙ
|
||||
|
||||
12. ПОСКОЛЬКУ ПРОГРАММА ПРЕДОСТАВЛЯЕТСЯ БЕСПЛАТНО, НА ПРО-
|
||||
ГРАММУ НЕТ ГАРАНТИЙ В ТОЙ МЕРЕ, КАКАЯ ДОПУСТИМА ПРИМЕНИ-
|
||||
МЫМ ЗАКОНОМ, ЗА ИСКЛЮЧЕНИЕМ ТЕХ СЛУЧАЕВ, КОГДА ПРОТИВНОЕ
|
||||
ЗАЯВЛЕНО В ПИСЬМЕННОЙ ФОРМЕ.
|
||||
ДЕРЖАТЕЛИ АВТОРСКИХ ПРАВ И/ИЛИ ДРУГИЕ СТОРОНЫ ПОСТАВЛЯЮТ
|
||||
ПРОГРАММУ "КАК ОНА ЕСТЬ" БЕЗ КАКОГО-ЛИБО ВИДА ГАРАНТИЙ,
|
||||
ВЫРАЖЕННЫХ ЯВНО ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ
|
||||
ОГРАНИЧИВАЯСЬ ПОДРАЗУМЕВАЕМЫМИ ГАРАНТИЯМИ КОММЕРЧЕСКОЙ
|
||||
ЦЕННОСТИ И ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ. ВЕСЬ РИСК В
|
||||
ОТНОШЕНИИ КАЧЕСТВА И ПРОИЗВОДИТЕЛЬНОСТИ ПРОГРАММЫ
|
||||
ОСТАЕТСЯ ПРИ ВАС. ЕСЛИ ПРОГРАММА ОКАЖЕТСЯ ДЕФЕКТИВНОЙ,
|
||||
ВЫ ПРИНИМАЕТЕ НА СЕБЯ СТОИМОСТЬ ВСЕГО НЕОБХОДИМОГО
|
||||
ОБСЛУЖИВАНИЯ, ВОССТАНОВЛЕНИЯ ИЛИ ИСПРАВЛЕНИЯ.
|
||||
13. НИ В КОЕМ СЛУЧАЕ, ЕСЛИ НЕ ТРЕБУЕТСЯ ПОДХОДЯЩИМ ЗАКОНОМ
|
||||
ИЛИ НЕ УСЛОВЛЕНО В ПИСЬМЕННОЙ ФОРМЕ, НИКАКОЙ ДЕРЖАТЕЛЬ
|
||||
АВТОРСКИХ ПРАВ ИЛИ НИКАКОЕ ДРУГОЕ ЛИЦО, КОТОРОЕ МОЖЕТ
|
||||
ИЗМЕНЯТЬ И/ИЛИ ПОВТОРНО РАСПРОСТРАНЯТЬ ПРОГРАММУ, КАК
|
||||
БЫЛО РАЗРЕШЕНО ВЫШЕ, НЕ ОТВЕТСТВЕННЫ ПЕРЕД ВАМИ ЗА УБЫТ-
|
||||
КИ, ВКЛЮЧАЯ ЛЮБЫЕ ОБЩИЕ, СПЕЦИАЛЬНЫЕ, СЛУЧАЙНЫЕ ИЛИ
|
||||
ПОСЛЕДОВАВШИЕ УБЫТКИ, ПРОИСТЕКАЮЩИЕ ИЗ ИСПОЛЬЗОВАНИЯ ИЛИ
|
||||
НЕВОЗМОЖНОСТИ ИСПОЛЬЗОВАНИЯ ПРОГРАММЫ (ВКЛЮЧАЯ, НО НЕ
|
||||
ОГРАНИЧИВАЯСЬ ПОТЕРЕЙ ДАННЫХ, ИЛИ ДАННЫМИ, СТАВШИМИ
|
||||
НЕПРАВИЛЬНЫМИ, ИЛИ ПОТЕРЯМИ, ПОНЕСЕННЫМИ ИЗ-ЗА ВАС ИЛИ
|
||||
ТРЕТЬИХ ЛИЦ, ИЛИ ОТКАЗОМ ПРОГРАММЫ РАБОТАТЬ СОВМЕСТНО С
|
||||
ЛЮБЫМИ ДРУГИМИ ПРОГРАММАМИ), ДАЖЕ ЕСЛИ ТАКОЙ ДЕРЖАТЕЛЬ ИЛИ
|
||||
ДРУГОЕ ЛИЦО БЫЛИ ИЗВЕЩЕНЫ О ВОЗМОЖНОСТИ ТАКИХ УБЫТКОВ.
|
||||
12. ПОСКОЛЬКУ ПРОГРАММА ПРЕДОСТАВЛЯЕТСЯ БЕСПЛАТНО, НА ПРО-
|
||||
ГРАММУ НЕТ ГАРАНТИЙ В ТОЙ МЕРЕ, КАКАЯ ДОПУСТИМА ПРИМЕНИ-
|
||||
МЫМ ЗАКОНОМ, ЗА ИСКЛЮЧЕНИЕМ ТЕХ СЛУЧАЕВ, КОГДА ПРОТИВНОЕ
|
||||
ЗАЯВЛЕНО В ПИСЬМЕННОЙ ФОРМЕ.
|
||||
ДЕРЖАТЕЛИ АВТОРСКИХ ПРАВ И/ИЛИ ДРУГИЕ СТОРОНЫ ПОСТАВЛЯЮТ
|
||||
ПРОГРАММУ "КАК ОНА ЕСТЬ" БЕЗ КАКОГО-ЛИБО ВИДА ГАРАНТИЙ,
|
||||
ВЫРАЖЕННЫХ ЯВНО ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ
|
||||
ОГРАНИЧИВАЯСЬ ПОДРАЗУМЕВАЕМЫМИ ГАРАНТИЯМИ КОММЕРЧЕСКОЙ
|
||||
ЦЕННОСТИ И ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ. ВЕСЬ РИСК В
|
||||
ОТНОШЕНИИ КАЧЕСТВА И ПРОИЗВОДИТЕЛЬНОСТИ ПРОГРАММЫ
|
||||
ОСТАЕТСЯ ПРИ ВАС. ЕСЛИ ПРОГРАММА ОКАЖЕТСЯ ДЕФЕКТИВНОЙ,
|
||||
ВЫ ПРИНИМАЕТЕ НА СЕБЯ СТОИМОСТЬ ВСЕГО НЕОБХОДИМОГО
|
||||
ОБСЛУЖИВАНИЯ, ВОССТАНОВЛЕНИЯ ИЛИ ИСПРАВЛЕНИЯ.
|
||||
13. НИ В КОЕМ СЛУЧАЕ, ЕСЛИ НЕ ТРЕБУЕТСЯ ПОДХОДЯЩИМ ЗАКОНОМ
|
||||
ИЛИ НЕ УСЛОВЛЕНО В ПИСЬМЕННОЙ ФОРМЕ, НИКАКОЙ ДЕРЖАТЕЛЬ
|
||||
АВТОРСКИХ ПРАВ ИЛИ НИКАКОЕ ДРУГОЕ ЛИЦО, КОТОРОЕ МОЖЕТ
|
||||
ИЗМЕНЯТЬ И/ИЛИ ПОВТОРНО РАСПРОСТРАНЯТЬ ПРОГРАММУ, КАК
|
||||
БЫЛО РАЗРЕШЕНО ВЫШЕ, НЕ ОТВЕТСТВЕННЫ ПЕРЕД ВАМИ ЗА УБЫТ-
|
||||
КИ, ВКЛЮЧАЯ ЛЮБЫЕ ОБЩИЕ, СПЕЦИАЛЬНЫЕ, СЛУЧАЙНЫЕ ИЛИ
|
||||
ПОСЛЕДОВАВШИЕ УБЫТКИ, ПРОИСТЕКАЮЩИЕ ИЗ ИСПОЛЬЗОВАНИЯ ИЛИ
|
||||
НЕВОЗМОЖНОСТИ ИСПОЛЬЗОВАНИЯ ПРОГРАММЫ (ВКЛЮЧАЯ, НО НЕ
|
||||
ОГРАНИЧИВАЯСЬ ПОТЕРЕЙ ДАННЫХ, ИЛИ ДАННЫМИ, СТАВШИМИ
|
||||
НЕПРАВИЛЬНЫМИ, ИЛИ ПОТЕРЯМИ, ПОНЕСЕННЫМИ ИЗ-ЗА ВАС ИЛИ
|
||||
ТРЕТЬИХ ЛИЦ, ИЛИ ОТКАЗОМ ПРОГРАММЫ РАБОТАТЬ СОВМЕСТНО С
|
||||
ЛЮБЫМИ ДРУГИМИ ПРОГРАММАМИ), ДАЖЕ ЕСЛИ ТАКОЙ ДЕРЖАТЕЛЬ ИЛИ
|
||||
ДРУГОЕ ЛИЦО БЫЛИ ИЗВЕЩЕНЫ О ВОЗМОЖНОСТИ ТАКИХ УБЫТКОВ.
|
||||
|
||||
КОНЕЦ ОПРЕДЕЛЕНИЙ И УСЛОВИЙ
|
||||
КОНЕЦ ОПРЕДЕЛЕНИЙ И УСЛОВИЙ
|
||||
|
||||
Как применять эти условия к вашим новым программам
|
||||
Как применять эти условия к вашим новым программам
|
||||
|
||||
Если вы разрабатываете новую программу и хотите, чтобы она
|
||||
принесла максимально возможную пользу обществу, лучший способ
|
||||
достичь этого - включить ее в свободное ПО, которое каждый
|
||||
может повторно распространять и изменять согласно данным
|
||||
условиям.
|
||||
Если вы разрабатываете новую программу и хотите, чтобы она
|
||||
принесла максимально возможную пользу обществу, лучший способ
|
||||
достичь этого - включить ее в свободное ПО, которое каждый
|
||||
может повторно распространять и изменять согласно данным
|
||||
условиям.
|
||||
|
||||
Чтобы сделать это, добавьте в программу следующие уведомле-
|
||||
ния. Самое безопасное -- это добавить их в начало каждого
|
||||
исходного файла, чтобы наиболее эффективно отобразить исклю-
|
||||
чение гарантий; и каждый файл должен содержать по меньшей
|
||||
мере строку, содержащую знак охраны авторского права и
|
||||
указание на то, где находится полное уведомление.
|
||||
Чтобы сделать это, добавьте в программу следующие уведомле-
|
||||
ния. Самое безопасное -- это добавить их в начало каждого
|
||||
исходного файла, чтобы наиболее эффективно отобразить исклю-
|
||||
чение гарантий; и каждый файл должен содержать по меньшей
|
||||
мере строку, содержащую знак охраны авторского права и
|
||||
указание на то, где находится полное уведомление.
|
||||
|
||||
одна строка, содержащая название программы и краткое
|
||||
описание того, что она делает.
|
||||
(C) наименование (имя) автора 19гг
|
||||
одна строка, содержащая название программы и краткое
|
||||
описание того, что она делает.
|
||||
(C) наименование (имя) автора 19гг
|
||||
|
||||
Это свободная программа; вы можете повторно распространять
|
||||
ее и/или модифицировать ее в соответствии с Универсальной
|
||||
Общественной Лицензией GNU, опубликованной Фондом Свободного
|
||||
ПО; либо версии 2, либо (по вашему выбору) любой более
|
||||
поздней версии.
|
||||
Это свободная программа; вы можете повторно распространять
|
||||
ее и/или модифицировать ее в соответствии с Универсальной
|
||||
Общественной Лицензией GNU, опубликованной Фондом Свободного
|
||||
ПО; либо версии 2, либо (по вашему выбору) любой более
|
||||
поздней версии.
|
||||
|
||||
Эта программа распространяется в надежде, что она будет
|
||||
полезной, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумевае-
|
||||
мых гарантий КОММЕРЧЕСКОЙ ЦЕННОСТИ или ПРИГОДНОСТИ ДЛЯ
|
||||
КОНКРЕТНОЙ ЦЕЛИ. Для получения подробных сведений смотрите
|
||||
Универсальную Общественную Лицензию GNU.
|
||||
Эта программа распространяется в надежде, что она будет
|
||||
полезной, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумевае-
|
||||
мых гарантий КОММЕРЧЕСКОЙ ЦЕННОСТИ или ПРИГОДНОСТИ ДЛЯ
|
||||
КОНКРЕТНОЙ ЦЕЛИ. Для получения подробных сведений смотрите
|
||||
Универсальную Общественную Лицензию GNU.
|
||||
|
||||
Вы должны были получить копию Универсальной Общественной
|
||||
Лицензии GNU вместе с этой программой; если нет, напишите
|
||||
по адресу: Free Software Foundation, Inc., 51 Franklin Street,
|
||||
Вы должны были получить копию Универсальной Общественной
|
||||
Лицензии GNU вместе с этой программой; если нет, напишите
|
||||
по адресу: Free Software Foundation, Inc., 51 Franklin Street,
|
||||
Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Добавьте также сведения о том, как связаться с вами по
|
||||
электронной и обычной почте.
|
||||
Добавьте также сведения о том, как связаться с вами по
|
||||
электронной и обычной почте.
|
||||
|
||||
Если программа интерактивная, сделайте так, чтобы при запуске
|
||||
в интерактивном режиме она выдавала краткое уведомление типа
|
||||
следующего:
|
||||
Если программа интерактивная, сделайте так, чтобы при запуске
|
||||
в интерактивном режиме она выдавала краткое уведомление типа
|
||||
следующего:
|
||||
|
||||
Gnomovision, версия 69, (C) имя автора 19гг
|
||||
Gnomovision поставляется АБСОЛЮТНО БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ;
|
||||
для получения подробностей напечатайте 'show w'. Это свобод-
|
||||
ная программа, и вы приглашаетесь повторно распространять ее
|
||||
при определенных условиях; для получения подробностей введите
|
||||
Gnomovision, версия 69, (C) имя автора 19гг
|
||||
Gnomovision поставляется АБСОЛЮТНО БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ;
|
||||
для получения подробностей напечатайте 'show w'. Это свобод-
|
||||
ная программа, и вы приглашаетесь повторно распространять ее
|
||||
при определенных условиях; для получения подробностей введите
|
||||
'show c'.
|
||||
|
||||
Гипотетические команды `show w' и `show c' должны показывать
|
||||
соответствующие части Универсальной Общественной Лицензии.
|
||||
Конечно, используемые вами команды могут называться как-ни-
|
||||
будь иначе, нежели `show w' и `show c'; они даже могут выби-
|
||||
раться с помощью мыши или быть пунктами меню -- все, что
|
||||
подходит для вашей программы.
|
||||
Гипотетические команды `show w' и `show c' должны показывать
|
||||
соответствующие части Универсальной Общественной Лицензии.
|
||||
Конечно, используемые вами команды могут называться как-ни-
|
||||
будь иначе, нежели `show w' и `show c'; они даже могут выби-
|
||||
раться с помощью мыши или быть пунктами меню -- все, что
|
||||
подходит для вашей программы.
|
||||
|
||||
Вы также должны добиться того, чтобы ваш работодатель (если
|
||||
вы работаете программистом) или ваше учебное заведение, если
|
||||
таковое имеется, подписали в случае необходимости "отказ от
|
||||
имущественных прав" на эту программу. Вот образец; замените
|
||||
фамилии:
|
||||
Вы также должны добиться того, чтобы ваш работодатель (если
|
||||
вы работаете программистом) или ваше учебное заведение, если
|
||||
таковое имеется, подписали в случае необходимости "отказ от
|
||||
имущественных прав" на эту программу. Вот образец; замените
|
||||
фамилии:
|
||||
|
||||
Компания ``Братья Ёёдины'' настоящим отказывается от всех
|
||||
имущественных прав на программу 'Gnomovision' (которая делает
|
||||
пассы в сторону компиляторов), написанную Абстрактным К.И.
|
||||
Компания ``Братья Ёёдины'' настоящим отказывается от всех
|
||||
имущественных прав на программу 'Gnomovision' (которая делает
|
||||
пассы в сторону компиляторов), написанную Абстрактным К.И.
|
||||
|
||||
подпись Мага Ната, 1 апреля 1989 г
|
||||
Маг Нат, Президент фирмы Вице.
|
||||
подпись Мага Ната, 1 апреля 1989 г
|
||||
Маг Нат, Президент фирмы Вице.
|
||||
|
||||
Данная Универсальная Общественная Лицензия не позволяет вам
|
||||
включать вашу программу в программы, являющиеся частной соб-
|
||||
ственностью. Если ваша программа -- это библиотека процедур,
|
||||
вам стоит подумать, не будет ли лучше разрешить программам,
|
||||
являющимся частной собственностью, связываться с вашей
|
||||
библиотекой. Если это то, чего вы хотите, используйте вместо
|
||||
этой Лицензии Универсальную Общественную Лицензию GNU для
|
||||
библиотек.
|
||||
Данная Универсальная Общественная Лицензия не позволяет вам
|
||||
включать вашу программу в программы, являющиеся частной соб-
|
||||
ственностью. Если ваша программа -- это библиотека процедур,
|
||||
вам стоит подумать, не будет ли лучше разрешить программам,
|
||||
являющимся частной собственностью, связываться с вашей
|
||||
библиотекой. Если это то, чего вы хотите, используйте вместо
|
||||
этой Лицензии Универсальную Общественную Лицензию GNU для
|
||||
библиотек.
|
||||
|
||||
[QueryBox]
|
||||
Диалоговые окна запросов
|
||||
Диалоговые окна запросов
|
||||
|
||||
В окнах запросов для выбора какого-либо варианта ответа
|
||||
(которые обычно задаются в виде экранных кнопок) Вы можете
|
||||
использовать либо клавиши со стрелками, либо выбрать ответ
|
||||
путем нажатия клавиши с выделенной в названии кнопки
|
||||
буквой, либо щелкнув по нужной кнопке мышкой.
|
||||
В окнах запросов для выбора какого-либо варианта ответа
|
||||
(которые обычно задаются в виде экранных кнопок) Вы можете
|
||||
использовать либо клавиши со стрелками, либо выбрать ответ
|
||||
путем нажатия клавиши с выделенной в названии кнопки
|
||||
буквой, либо щелкнув по нужной кнопке мышкой.
|
||||
|
||||
|
||||
[How to use help]
|
||||
Как пользоваться помощью
|
||||
Как пользоваться помощью
|
||||
|
||||
При работе с программой Midnight Commander практически в
|
||||
любой момент можно обратиться к интерактивной подсказке,
|
||||
вызов которой осуществляется нажатием клавиши F1. Для
|
||||
перемещения в окне просмотра подсказки Вы можете
|
||||
использовать клавиши перемещения курсора (стрелки) или
|
||||
мышь. Стрелка вниз вызывает переход к следующей ссылке
|
||||
(выделены голубым фоном) или сдвиг текста на одну строку
|
||||
вверх. Стрелка вверх вызывает переход к предыдущей ссылке
|
||||
или сдвиг текста на одну строку вверх. Стрелка вправо
|
||||
вызывает переход по ссылке, которая в данный момент
|
||||
выделена синим фоном (текущая ссылка). По стрелке влево
|
||||
происходит переход к ранее просмотренным разделам
|
||||
подсказки.
|
||||
При работе с программой Midnight Commander практически в
|
||||
любой момент можно обратиться к интерактивной подсказке,
|
||||
вызов которой осуществляется нажатием клавиши F1. Для
|
||||
перемещения в окне просмотра подсказки Вы можете
|
||||
использовать клавиши перемещения курсора (стрелки) или
|
||||
мышь. Стрелка вниз вызывает переход к следующей ссылке
|
||||
(выделены голубым фоном) или сдвиг текста на одну строку
|
||||
вверх. Стрелка вверх вызывает переход к предыдущей ссылке
|
||||
или сдвиг текста на одну строку вверх. Стрелка вправо
|
||||
вызывает переход по ссылке, которая в данный момент
|
||||
выделена синим фоном (текущая ссылка). По стрелке влево
|
||||
происходит переход к ранее просмотренным разделам
|
||||
подсказки.
|
||||
|
||||
Если Ваш терминал не поддерживает клавиши-стрелки, Вы
|
||||
можете использовать клавишу пробела для перехода к
|
||||
следующей странице подсказки и клавишу 'b' для перехода к
|
||||
предыдущей странице. Клавиша TAB вызывает переход к
|
||||
следующей ссылке, а нажатие ENTER - переход по текущей
|
||||
ссылке. При просмотре подсказки программа запоминает
|
||||
последовательность переходов по ссылкам и позволяет
|
||||
вернуться к ранее просмотренным разделам, воспользовавшись
|
||||
клавишей 'l' (last). Нажатие на ESC вызывает выход из окна
|
||||
подсказки.
|
||||
Если Ваш терминал не поддерживает клавиши-стрелки, Вы
|
||||
можете использовать клавишу пробела для перехода к
|
||||
следующей странице подсказки и клавишу 'b' для перехода к
|
||||
предыдущей странице. Клавиша TAB вызывает переход к
|
||||
следующей ссылке, а нажатие ENTER - переход по текущей
|
||||
ссылке. При просмотре подсказки программа запоминает
|
||||
последовательность переходов по ссылкам и позволяет
|
||||
вернуться к ранее просмотренным разделам, воспользовавшись
|
||||
клавишей 'l' (last). Нажатие на ESC вызывает выход из окна
|
||||
подсказки.
|
||||
|
||||
По щелчку левой клавиши мыши происходит переход по ссылке
|
||||
или перемещение по тексту подсказки. Щелчок правой кнопкой
|
||||
мыши используется для переход к ранее просмотренным
|
||||
разделам.
|
||||
По щелчку левой клавиши мыши происходит переход по ссылке
|
||||
или перемещение по тексту подсказки. Щелчок правой кнопкой
|
||||
мыши используется для переход к ранее просмотренным
|
||||
разделам.
|
||||
|
||||
Полный список управляющих комбинаций для окна просмотра
|
||||
подсказки:
|
||||
Полный список управляющих комбинаций для окна просмотра
|
||||
подсказки:
|
||||
|
||||
Работают все клавиши управления перемещениемGeneral Movement Keys.
|
||||
Работают все клавиши управления перемещениемGeneral Movement Keys.
|
||||
|
||||
tab Переход на следующую ссылку.
|
||||
M-tab Переход на предыдущую ссылку.
|
||||
down Переход на следующую ссылку или смещение
|
||||
текста на одну строку вверх.
|
||||
up Переход на следующую ссылку или смещение
|
||||
текста на одну строку вниз.
|
||||
right, enter Переход по текущей ссылке.
|
||||
left, l Переход к ранее просмотренным разделам.
|
||||
F1 Помощь по использованию самой подсказки.
|
||||
n Переход к следующему разделу помощи.
|
||||
p Переход к предыдущему разделу помощи.
|
||||
c Переход к оглавлению подсказки.
|
||||
F10, esc Выход из окна просмотра подсказки.
|
||||
tab Переход на следующую ссылку.
|
||||
M-tab Переход на предыдущую ссылку.
|
||||
down Переход на следующую ссылку или смещение
|
||||
текста на одну строку вверх.
|
||||
up Переход на следующую ссылку или смещение
|
||||
текста на одну строку вниз.
|
||||
right, enter Переход по текущей ссылке.
|
||||
left, l Переход к ранее просмотренным разделам.
|
||||
F1 Помощь по использованию самой подсказки.
|
||||
n Переход к следующему разделу помощи.
|
||||
p Переход к предыдущему разделу помощи.
|
||||
c Переход к оглавлению подсказки.
|
||||
F10, esc Выход из окна просмотра подсказки.
|
||||
|
||||
|
||||
|
||||
|
4112
doc/sr/mc.1.in
4112
doc/sr/mc.1.in
File diff suppressed because it is too large
Load Diff
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 x x tqu x x x x tqu x x
|
||||
v x mqj v v mqj x v v v mqv
|
||||
mqqqнаредникqqj
|
||||
mqqqнаредникqqj
|
||||
|
||||
Ово је главни екран помоћи за ГНУ-овог поноћног наредника.
|
||||
Ово је главни екран помоћи за ГНУ-овог поноћног наредника.
|
||||
|
||||
Да бисте сазнали више о томе како да користите интерактивни
|
||||
систем помоћи потребно је да притиснете EnterHow to use help.
|
||||
Можете и одмах отићи на садржајContents помоћи.
|
||||
Да бисте сазнали више о томе како да користите интерактивни
|
||||
систем помоћи потребно је да притиснете EnterHow to use help.
|
||||
Можете и одмах отићи на садржајContents помоћи.
|
||||
|
||||
ГНУ-овог поноћног наредника су написали његови ауториAUTHORS.
|
||||
ГНУ-овог поноћног наредника су написали његови ауториAUTHORS.
|
||||
|
||||
ГНУ-ов поноћни наредник се испоручује БЕЗ ИКАКВЕ ГАРАНЦИЈЕWarranty.
|
||||
Ово је слободни софтвер, а ви сте позвани да га
|
||||
расподелите под одредбама ГНУ-ове опште јавне лиценцеЛиценца (оригинал на енглеском).
|
||||
Погледајте и незваничан превод ГНУ-ове ОЈЛ на српскиЛиценца (на српском).
|
||||
ГНУ-ов поноћни наредник се испоручује БЕЗ ИКАКВЕ ГАРАНЦИЈЕWarranty.
|
||||
Ово је слободни софтвер, а ви сте позвани да га
|
||||
расподелите под одредбама ГНУ-ове опште јавне лиценцеЛиценца (оригинал на енглеском).
|
||||
Погледајте и незваничан превод ГНУ-ове ОЈЛ на српскиЛиценца (на српском).
|
||||
|
||||
Превод Поноћног наредника и ове датотеке помоћи на српски:
|
||||
Страхиња Радић, <mr99164@alas.matf.bg.ac.yu>
|
||||
СРД `Уликс', http://uliks.sourceforge.net
|
||||
[Лиценца (оригинал на енглеском)]
|
||||
Превод Поноћног наредника и ове датотеке помоћи на српски:
|
||||
Страхиња Радић, <mr99164@alas.matf.bg.ac.yu>
|
||||
СРД `Уликс', http://uliks.sourceforge.net
|
||||
[Лиценца (оригинал на енглеском)]
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
@ -435,499 +435,499 @@ to permit linking proprietary applications with the
|
||||
library. If this is what you want to do, use the GNU
|
||||
Library General Public License instead of this License.
|
||||
|
||||
[Лиценца (на српском)]
|
||||
[Лиценца (на српском)]
|
||||
|
||||
ГНУ-ОВА ОПШТА ЈАВНА ЛИЦЕНЦА
|
||||
Верзија 2, јун 1991 (*)
|
||||
ГНУ-ОВА ОПШТА ЈАВНА ЛИЦЕНЦА
|
||||
Верзија 2, јун 1991 (*)
|
||||
|
||||
Ауторска права (C) 1989, 1991 Free Software Foundation,
|
||||
Ауторска права (C) 1989, 1991 Free Software Foundation,
|
||||
Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||
USA.
|
||||
|
||||
Дозвољено је умножавање и расподела дословног примерка
|
||||
текста ове лиценце, али није дозвољено њено мењање.
|
||||
Дозвољено је умножавање и расподела дословног примерка
|
||||
текста ове лиценце, али није дозвољено њено мењање.
|
||||
|
||||
Уговор
|
||||
Уговор
|
||||
|
||||
За већину софтвера лиценце су начињене са циљем да вам
|
||||
одузму слободу да га делите са другима и мењате. Насупрот
|
||||
томе, ГНУ-ова општа јавна лиценца вам гарантује слободу
|
||||
дељења и измене слободног софтвера да би осигурала слободу
|
||||
софтвера за све његове кориснике. Ова Општа јавна лиценца
|
||||
се односи на већину софтвера из Задужбине за слободни
|
||||
софтвер и на сваки други програм, чији се аутори обавежу
|
||||
на њено коришћење. (Други софтвер Задужбине за слободни
|
||||
софтвер је уместо ове лиценце покривен ГНУ-овом
|
||||
библиотечком општом јавном лиценцом (**).) И ви је можете
|
||||
применити на ваше програме.
|
||||
За већину софтвера лиценце су начињене са циљем да вам
|
||||
одузму слободу да га делите са другима и мењате. Насупрот
|
||||
томе, ГНУ-ова општа јавна лиценца вам гарантује слободу
|
||||
дељења и измене слободног софтвера да би осигурала слободу
|
||||
софтвера за све његове кориснике. Ова Општа јавна лиценца
|
||||
се односи на већину софтвера из Задужбине за слободни
|
||||
софтвер и на сваки други програм, чији се аутори обавежу
|
||||
на њено коришћење. (Други софтвер Задужбине за слободни
|
||||
софтвер је уместо ове лиценце покривен ГНУ-овом
|
||||
библиотечком општом јавном лиценцом (**).) И ви је можете
|
||||
применити на ваше програме.
|
||||
|
||||
Када говоримо о слободном софтверу, мислимо на слободу,
|
||||
а не на цену. Наше опште јавне лиценце су замишљене да
|
||||
осигурају вашу слободу расподеле примерака слободног
|
||||
софтвера (и наплаћивања за ту услугу по жељи), примања
|
||||
изворног кода или његовог добијања по жељи, могућности
|
||||
измене софтвера или коришћења делова истог у новим
|
||||
слободним програмима; и да вам дају до знања да то можете
|
||||
да урадите.
|
||||
Када говоримо о слободном софтверу, мислимо на слободу,
|
||||
а не на цену. Наше опште јавне лиценце су замишљене да
|
||||
осигурају вашу слободу расподеле примерака слободног
|
||||
софтвера (и наплаћивања за ту услугу по жељи), примања
|
||||
изворног кода или његовог добијања по жељи, могућности
|
||||
измене софтвера или коришћења делова истог у новим
|
||||
слободним програмима; и да вам дају до знања да то можете
|
||||
да урадите.
|
||||
|
||||
Да бисмо заштитили ваша права, морамо да поставимо
|
||||
ограничења која забрањују било коме да вам оспори ова
|
||||
права или да тражи од вас да их се одрекнете. Ова
|
||||
ограничења су и обавезујућа за вас ако расподељујете
|
||||
примерке софтвера, или га измените.
|
||||
Да бисмо заштитили ваша права, морамо да поставимо
|
||||
ограничења која забрањују било коме да вам оспори ова
|
||||
права или да тражи од вас да их се одрекнете. Ова
|
||||
ограничења су и обавезујућа за вас ако расподељујете
|
||||
примерке софтвера, или га измените.
|
||||
|
||||
На пример, ако расподељујете примерке таквог програма,
|
||||
бесплатно или за одређену новчану надокнаду, морате дати и
|
||||
примаоцима сва права која сами поседујете. Морате се
|
||||
постарати да и они приме или могу да добију изворни код.
|
||||
Најзад, морате им показати ове одредбе да би били упознати
|
||||
са својим правима.
|
||||
На пример, ако расподељујете примерке таквог програма,
|
||||
бесплатно или за одређену новчану надокнаду, морате дати и
|
||||
примаоцима сва права која сами поседујете. Морате се
|
||||
постарати да и они приме или могу да добију изворни код.
|
||||
Најзад, морате им показати ове одредбе да би били упознати
|
||||
са својим правима.
|
||||
|
||||
Ми штитимо ваша права у два корака: (1) штитимо софтвер
|
||||
заштитом ауторских права, и (2) нудимо вам ову лиценцу
|
||||
која вам даје правну дозволу да умножавате, расподељујете
|
||||
и/или мењате софтвер.
|
||||
Ми штитимо ваша права у два корака: (1) штитимо софтвер
|
||||
заштитом ауторских права, и (2) нудимо вам ову лиценцу
|
||||
која вам даје правну дозволу да умножавате, расподељујете
|
||||
и/или мењате софтвер.
|
||||
|
||||
Такође, ради заштите сваког аутора и нас хоћемо да се
|
||||
осигурамо да свако разуме да не постоји гаранција за овај
|
||||
слободни софтвер. Ако је софтвер неко други изменио и
|
||||
проследио га, хоћемо да примаоци знају да оно што имају
|
||||
није оригинал, тако да се било какви проблеми који су
|
||||
настали због других, неће одразити на углед аутора
|
||||
оригинала.
|
||||
Такође, ради заштите сваког аутора и нас хоћемо да се
|
||||
осигурамо да свако разуме да не постоји гаранција за овај
|
||||
слободни софтвер. Ако је софтвер неко други изменио и
|
||||
проследио га, хоћемо да примаоци знају да оно што имају
|
||||
није оригинал, тако да се било какви проблеми који су
|
||||
настали због других, неће одразити на углед аутора
|
||||
оригинала.
|
||||
|
||||
Најзад, све слободне програме непрестано угрожавају
|
||||
софтверски патенти. Ми хоћемо да избегнемо опасност да
|
||||
расподељивачи слободног програма индивидуално добију
|
||||
патентне лиценце и на тај начин ставе програм у приватно
|
||||
власништво. Да бисмо спречили ово, јасно смо истакли да
|
||||
сваки патент мора да буде лиценциран за свачију слободну
|
||||
употребу или да уопште не буде лиценциран.
|
||||
Најзад, све слободне програме непрестано угрожавају
|
||||
софтверски патенти. Ми хоћемо да избегнемо опасност да
|
||||
расподељивачи слободног програма индивидуално добију
|
||||
патентне лиценце и на тај начин ставе програм у приватно
|
||||
власништво. Да бисмо спречили ово, јасно смо истакли да
|
||||
сваки патент мора да буде лиценциран за свачију слободну
|
||||
употребу или да уопште не буде лиценциран.
|
||||
|
||||
Прецизне одредбе и услови умножавања, расподеле и измене
|
||||
следе.
|
||||
Прецизне одредбе и услови умножавања, расподеле и измене
|
||||
следе.
|
||||
|
||||
ГНУ-ОВА ОПШТА ЈАВНА ЛИЦЕНЦА
|
||||
ОДРЕДБЕ И УСЛОВИ УМНОЖАВАЊА, РАСПОДЕЛЕ И ИЗМЕНЕ
|
||||
ГНУ-ОВА ОПШТА ЈАВНА ЛИЦЕНЦА
|
||||
ОДРЕДБЕ И УСЛОВИ УМНОЖАВАЊА, РАСПОДЕЛЕ И ИЗМЕНЕ
|
||||
|
||||
0. Ова лиценца се односи на сваки програм или друго дело
|
||||
које садржи саопштење власника ауторских права у ком стоји
|
||||
да може бити расподељен под одредбама ове опште јавне
|
||||
лиценце. ,,Програм`` ће надаље означавати сваки такав
|
||||
програм или рад, а ,,дело засновано на Програму`` ће
|
||||
означавати Програм или било који рад проистекао из њега по
|
||||
Закону о ауторским правима; тј. дело које садржи Програм
|
||||
или његов део, било дословни или са изменама и/или
|
||||
преведен на други језик. (Одавде па надаље, превод је
|
||||
укључен без ограничења у погледу израза ,,измена``.) Сваки
|
||||
корисник лиценце је означен као ,,ви``.
|
||||
0. Ова лиценца се односи на сваки програм или друго дело
|
||||
које садржи саопштење власника ауторских права у ком стоји
|
||||
да може бити расподељен под одредбама ове опште јавне
|
||||
лиценце. ,,Програм`` ће надаље означавати сваки такав
|
||||
програм или рад, а ,,дело засновано на Програму`` ће
|
||||
означавати Програм или било који рад проистекао из њега по
|
||||
Закону о ауторским правима; тј. дело које садржи Програм
|
||||
или његов део, било дословни или са изменама и/или
|
||||
преведен на други језик. (Одавде па надаље, превод је
|
||||
укључен без ограничења у погледу израза ,,измена``.) Сваки
|
||||
корисник лиценце је означен као ,,ви``.
|
||||
|
||||
Друге активности осим умножавања, расподеле и измене нису
|
||||
обухваћене овом лиценцом; оне су изван њеног домена. Чин
|
||||
покретања Програма није ограничен, а добијени резултат
|
||||
извршавања Програма је обухваћен у случају да се његов
|
||||
садржај састоји од дела заснованог на Програму (независно
|
||||
од чињенице да је настао као резултат покретања Програма).
|
||||
Ово непосредно зависи од тога шта Програм ради.
|
||||
Друге активности осим умножавања, расподеле и измене нису
|
||||
обухваћене овом лиценцом; оне су изван њеног домена. Чин
|
||||
покретања Програма није ограничен, а добијени резултат
|
||||
извршавања Програма је обухваћен у случају да се његов
|
||||
садржај састоји од дела заснованог на Програму (независно
|
||||
од чињенице да је настао као резултат покретања Програма).
|
||||
Ово непосредно зависи од тога шта Програм ради.
|
||||
|
||||
1. Ви можете умножавати и расподелити дословне примерке
|
||||
изворног кода Програма чим га примите, на било којем
|
||||
медијуму, уз услов да на адекватан и одговарајући начин
|
||||
означите на сваком примерку одговарајуће саопштење о
|
||||
ауторским правима и објашњење гаранције; сачувате
|
||||
недирнутим саопштења која се позивају на ову лиценцу и
|
||||
одсуство било какве гаранције; и свим другим примаоцима
|
||||
Програма дате примерак ове лиценце заједно са Програмом.
|
||||
1. Ви можете умножавати и расподелити дословне примерке
|
||||
изворног кода Програма чим га примите, на било којем
|
||||
медијуму, уз услов да на адекватан и одговарајући начин
|
||||
означите на сваком примерку одговарајуће саопштење о
|
||||
ауторским правима и објашњење гаранције; сачувате
|
||||
недирнутим саопштења која се позивају на ову лиценцу и
|
||||
одсуство било какве гаранције; и свим другим примаоцима
|
||||
Програма дате примерак ове лиценце заједно са Програмом.
|
||||
|
||||
Ви можете наплаћивати новчану надокнаду за чин физичког
|
||||
преноса примерка, и по вашем избору можете понудити
|
||||
заштиту гаранцијом у замену за новчану надокнаду.
|
||||
Ви можете наплаћивати новчану надокнаду за чин физичког
|
||||
преноса примерка, и по вашем избору можете понудити
|
||||
заштиту гаранцијом у замену за новчану надокнаду.
|
||||
|
||||
|
||||
2. Ви можете изменити ваш примерак или примерке Програма
|
||||
или било ког његовог дела, образујући дело засновано на
|
||||
Програму, и умножавати и расподелити такве измене или дела
|
||||
под горњим одредбама члана 1, уз услов да сами такође
|
||||
испуните сваки од следећих услова:
|
||||
2. Ви можете изменити ваш примерак или примерке Програма
|
||||
или било ког његовог дела, образујући дело засновано на
|
||||
Програму, и умножавати и расподелити такве измене или дела
|
||||
под горњим одредбама члана 1, уз услов да сами такође
|
||||
испуните сваки од следећих услова:
|
||||
|
||||
а) морате осигурати да измењене датотеке носе уочљива
|
||||
обавештења да сте ви изменили датотеке као и датум
|
||||
било какве измене;
|
||||
а) морате осигурати да измењене датотеке носе уочљива
|
||||
обавештења да сте ви изменили датотеке као и датум
|
||||
било какве измене;
|
||||
|
||||
б) морате осигурати да свако дело које расподељујете
|
||||
или издајете, а које у целини или делом садржи или је
|
||||
изведено из Програма или било ког његовог дела, буде
|
||||
лиценцирано у целини без новчане надокнаде свим трећим
|
||||
лицима под одредбама ове лиценце;
|
||||
б) морате осигурати да свако дело које расподељујете
|
||||
или издајете, а које у целини или делом садржи или је
|
||||
изведено из Програма или било ког његовог дела, буде
|
||||
лиценцирано у целини без новчане надокнаде свим трећим
|
||||
лицима под одредбама ове лиценце;
|
||||
|
||||
в) ако измењени програм чита команде интерактивно када
|
||||
је покренут, ви морате осигурати да, када је покренут
|
||||
у циљу такве интерактивне употребе на уобичајен начин,
|
||||
испише или прикаже објаву која укључује одговарајуће
|
||||
саопштење о ауторским правима и саопштење да не
|
||||
постоји гаранција (или да ви дајете гаранцију) да
|
||||
корисници могу расподелити програм под овим условима,
|
||||
и објашњење кориснику како да прикаже примерак ове
|
||||
лиценце. (Изузетак: ако је Програм интерактиван али
|
||||
обично не исписује такву објаву, ваше дело засновано
|
||||
на Програму не мора да испише објаву.)
|
||||
в) ако измењени програм чита команде интерактивно када
|
||||
је покренут, ви морате осигурати да, када је покренут
|
||||
у циљу такве интерактивне употребе на уобичајен начин,
|
||||
испише или прикаже објаву која укључује одговарајуће
|
||||
саопштење о ауторским правима и саопштење да не
|
||||
постоји гаранција (или да ви дајете гаранцију) да
|
||||
корисници могу расподелити програм под овим условима,
|
||||
и објашњење кориснику како да прикаже примерак ове
|
||||
лиценце. (Изузетак: ако је Програм интерактиван али
|
||||
обично не исписује такву објаву, ваше дело засновано
|
||||
на Програму не мора да испише објаву.)
|
||||
|
||||
|
||||
Ови захтеви се односе на измењено дело као целину. Ако
|
||||
уочљиви делови таквог дела нису изведени из Програма, па
|
||||
се могу разумно схватити као независна и одвојена дела за
|
||||
себе, онда се ова лиценца и њене одредбе не односе на те
|
||||
делове када их расподељујете као одвојена дела. Али када
|
||||
расподељујете исте делове као део целине која је дело
|
||||
засновано на Програму, расподела целине мора бити под
|
||||
одредбама ове лиценце, чије дозволе за друге њене носиоце
|
||||
се проширују на целину, а самим тим на сваки део без
|
||||
обзира ко га је написао.
|
||||
Ови захтеви се односе на измењено дело као целину. Ако
|
||||
уочљиви делови таквог дела нису изведени из Програма, па
|
||||
се могу разумно схватити као независна и одвојена дела за
|
||||
себе, онда се ова лиценца и њене одредбе не односе на те
|
||||
делове када их расподељујете као одвојена дела. Али када
|
||||
расподељујете исте делове као део целине која је дело
|
||||
засновано на Програму, расподела целине мора бити под
|
||||
одредбама ове лиценце, чије дозволе за друге њене носиоце
|
||||
се проширују на целину, а самим тим на сваки део без
|
||||
обзира ко га је написао.
|
||||
|
||||
Намера овог члана није да тражи права или оспори ваша
|
||||
права на дело које сте у целини написали; намера је
|
||||
првенствено да се успостави право на контролу расподеле
|
||||
изведених или колективних дела заснованих на Програму.
|
||||
Намера овог члана није да тражи права или оспори ваша
|
||||
права на дело које сте у целини написали; намера је
|
||||
првенствено да се успостави право на контролу расподеле
|
||||
изведених или колективних дела заснованих на Програму.
|
||||
|
||||
Само прикључивање Програму (или делу заснованом на
|
||||
Програму) другог дела које на њему није засновано на
|
||||
јединици за складиштење или медијуму за расподелу не
|
||||
доводи друго дело под оквир ове лиценце.
|
||||
Само прикључивање Програму (или делу заснованом на
|
||||
Програму) другог дела које на њему није засновано на
|
||||
јединици за складиштење или медијуму за расподелу не
|
||||
доводи друго дело под оквир ове лиценце.
|
||||
|
||||
3. Можете умножавати и расподелити Програм (или дело
|
||||
засновано на њему, по члану 2) у објектном коду или
|
||||
извршном облику под горњим одредбама чланова 1 и 2 уз
|
||||
услов да урадите једну од следећих ствари:
|
||||
3. Можете умножавати и расподелити Програм (или дело
|
||||
засновано на њему, по члану 2) у објектном коду или
|
||||
извршном облику под горњим одредбама чланова 1 и 2 уз
|
||||
услов да урадите једну од следећих ствари:
|
||||
|
||||
а) да приложите уз њега потпуни одговарајући машински
|
||||
читљив изворни код, који мора бити расподељен према
|
||||
горњим одредбама чланова 1 и 2 на медијуму уобичајеном
|
||||
за размену софтвера; или,
|
||||
а) да приложите уз њега потпуни одговарајући машински
|
||||
читљив изворни код, који мора бити расподељен према
|
||||
горњим одредбама чланова 1 и 2 на медијуму уобичајеном
|
||||
за размену софтвера; или,
|
||||
|
||||
б) да приложите уз њега писмену понуду, важећу бар три
|
||||
године, о достављању било којој трећој страни, уз
|
||||
новчану надокнаду не већу од цене потребне да обавите
|
||||
физичку расподелу извора, потпуног машински читљивог
|
||||
примерка одговарајућег изворног кода, за расподелу
|
||||
према горњим одредбама чланова 1 и 2 на медијуму
|
||||
уобичајеном за размену софтвера; или,
|
||||
б) да приложите уз њега писмену понуду, важећу бар три
|
||||
године, о достављању било којој трећој страни, уз
|
||||
новчану надокнаду не већу од цене потребне да обавите
|
||||
физичку расподелу извора, потпуног машински читљивог
|
||||
примерка одговарајућег изворног кода, за расподелу
|
||||
према горњим одредбама чланова 1 и 2 на медијуму
|
||||
уобичајеном за размену софтвера; или,
|
||||
|
||||
в) да приложите уз њега информацију коју сте добили
|
||||
као понуду о расподели одговарајућег изворног кода.
|
||||
(Ова могућност је дозвољена само за некомерцијалну
|
||||
расподелу и само ако сте добили програм у објектном
|
||||
коду или извршном виду уз такву понуду, према горњој
|
||||
тачки б.)
|
||||
в) да приложите уз њега информацију коју сте добили
|
||||
као понуду о расподели одговарајућег изворног кода.
|
||||
(Ова могућност је дозвољена само за некомерцијалну
|
||||
расподелу и само ако сте добили програм у објектном
|
||||
коду или извршном виду уз такву понуду, према горњој
|
||||
тачки б.)
|
||||
|
||||
Изворни код дела подразумева облик дела најпогоднији за
|
||||
прављење измена на њему. За дело у извршном облику,
|
||||
потпуни изворни код подразумева сав изворни код за све
|
||||
модуле које оно садржи, са додатком свих датотека који
|
||||
дефинишу интеракцију и списа за контролу превођења и
|
||||
инсталирања извршне верзије. Међутим, као посебан
|
||||
изузетак, расподељени изворни код не мора да укључи све
|
||||
што се обично расподељује (било у изворном или извршном
|
||||
облику) са главним компонентама (преводиоцем, језгром, и
|
||||
тако даље) оперативног система на ком се покреће извршна
|
||||
датотека, осим уколико се сама та компонента не испоручује
|
||||
са извршном датотеком.
|
||||
Изворни код дела подразумева облик дела најпогоднији за
|
||||
прављење измена на њему. За дело у извршном облику,
|
||||
потпуни изворни код подразумева сав изворни код за све
|
||||
модуле које оно садржи, са додатком свих датотека који
|
||||
дефинишу интеракцију и списа за контролу превођења и
|
||||
инсталирања извршне верзије. Међутим, као посебан
|
||||
изузетак, расподељени изворни код не мора да укључи све
|
||||
што се обично расподељује (било у изворном или извршном
|
||||
облику) са главним компонентама (преводиоцем, језгром, и
|
||||
тако даље) оперативног система на ком се покреће извршна
|
||||
датотека, осим уколико се сама та компонента не испоручује
|
||||
са извршном датотеком.
|
||||
|
||||
Ако се расподела извршног или објектног кода врши понудом
|
||||
приступа примерку са одређеног места, онда се понуда
|
||||
истоветног изворног кода са истог места рачуна као
|
||||
расподела изворног кода, чак и у случају када се од треће
|
||||
стране не захтева да умножава изворни код заједно са
|
||||
објектним кодом.
|
||||
Ако се расподела извршног или објектног кода врши понудом
|
||||
приступа примерку са одређеног места, онда се понуда
|
||||
истоветног изворног кода са истог места рачуна као
|
||||
расподела изворног кода, чак и у случају када се од треће
|
||||
стране не захтева да умножава изворни код заједно са
|
||||
објектним кодом.
|
||||
|
||||
4. Програм се не сме умножавати, мењати, подлиценцирати
|
||||
или расподелити другачије него што је изричито истакнуто
|
||||
овом лиценцом. Сваки другачији покушај умножавања, мењања,
|
||||
подлиценцирања или расподеле програма није пуноважан и
|
||||
аутоматски обуставља ваша права под овом лиценцом.
|
||||
Међутим, странама које су од вас примиле примерак или
|
||||
права под овом лиценцом неће се обуставити њихове лиценце
|
||||
све док се оне потпуно придржавају њених одредби.
|
||||
4. Програм се не сме умножавати, мењати, подлиценцирати
|
||||
или расподелити другачије него што је изричито истакнуто
|
||||
овом лиценцом. Сваки другачији покушај умножавања, мењања,
|
||||
подлиценцирања или расподеле програма није пуноважан и
|
||||
аутоматски обуставља ваша права под овом лиценцом.
|
||||
Међутим, странама које су од вас примиле примерак или
|
||||
права под овом лиценцом неће се обуставити њихове лиценце
|
||||
све док се оне потпуно придржавају њених одредби.
|
||||
|
||||
5. Од вас се не тражи да прихватите ову лиценцу, пошто
|
||||
је нисте потписали. Међутим, ништа друго вам не дозвољава
|
||||
да мењате или расподељујете Програм или изведена дела.
|
||||
Такве радње су забрањене законом уколико не прихватите ову
|
||||
лиценцу. Тако, изменом или расподелом Програма (или дела
|
||||
заснованог на Програму), прихватате да то урадите под овом
|
||||
лиценцом и под свим њеним одредбама и условима за
|
||||
умножавање, расподелу или измену Програма или дела
|
||||
заснованих на њему.
|
||||
5. Од вас се не тражи да прихватите ову лиценцу, пошто
|
||||
је нисте потписали. Међутим, ништа друго вам не дозвољава
|
||||
да мењате или расподељујете Програм или изведена дела.
|
||||
Такве радње су забрањене законом уколико не прихватите ову
|
||||
лиценцу. Тако, изменом или расподелом Програма (или дела
|
||||
заснованог на Програму), прихватате да то урадите под овом
|
||||
лиценцом и под свим њеним одредбама и условима за
|
||||
умножавање, расподелу или измену Програма или дела
|
||||
заснованих на њему.
|
||||
|
||||
6. Сваки пут када расподељујете Програм (или било које
|
||||
дело засновано на Програму), прималац ће аутоматски
|
||||
примити лиценцу од првобитног носиоца за умножавање,
|
||||
расподелу или измену Програма према овим одредбама и
|
||||
условима. Ви не можете даље ограничити примаочево
|
||||
коришћење овде датих права, као што ви нисте ни одговорни
|
||||
ако трећа страна наметне усклађивање са одредбама ове
|
||||
лиценце.
|
||||
6. Сваки пут када расподељујете Програм (или било које
|
||||
дело засновано на Програму), прималац ће аутоматски
|
||||
примити лиценцу од првобитног носиоца за умножавање,
|
||||
расподелу или измену Програма према овим одредбама и
|
||||
условима. Ви не можете даље ограничити примаочево
|
||||
коришћење овде датих права, као што ви нисте ни одговорни
|
||||
ако трећа страна наметне усклађивање са одредбама ове
|
||||
лиценце.
|
||||
|
||||
7. Ако су вам, као последица судске пресуде или под
|
||||
изговором кршења патента или било каквог другог разлога
|
||||
(не ограничавајући се искључиво на питања патената),
|
||||
наметнути услови (било судским налогом, поравнањем или
|
||||
другачије) који су у супротности са условима ове лиценце,
|
||||
они вас не изузимају од услова ове лиценце. Ако је
|
||||
расподела или било која друга ваша применљива обавеза у
|
||||
супротности са овом лиценцом, онда као последицу тога не
|
||||
можете уопште расподелити Програм. На пример, ако патентна
|
||||
лиценца не дозвољава бесплатну расподелу Програма од
|
||||
стране свих прималаца примерка или индиректно преко вас,
|
||||
онда је једини начин да се задовољи и ова лиценца да се у
|
||||
потпуности одрекнете расподеле Програма.
|
||||
7. Ако су вам, као последица судске пресуде или под
|
||||
изговором кршења патента или било каквог другог разлога
|
||||
(не ограничавајући се искључиво на питања патената),
|
||||
наметнути услови (било судским налогом, поравнањем или
|
||||
другачије) који су у супротности са условима ове лиценце,
|
||||
они вас не изузимају од услова ове лиценце. Ако је
|
||||
расподела или било која друга ваша применљива обавеза у
|
||||
супротности са овом лиценцом, онда као последицу тога не
|
||||
можете уопште расподелити Програм. На пример, ако патентна
|
||||
лиценца не дозвољава бесплатну расподелу Програма од
|
||||
стране свих прималаца примерка или индиректно преко вас,
|
||||
онда је једини начин да се задовољи и ова лиценца да се у
|
||||
потпуности одрекнете расподеле Програма.
|
||||
|
||||
Ако се било који део овог члана означи као неодговарајући
|
||||
или неприменљив под било којом одређеном околношћу,
|
||||
примењује се остатак члана а члан као целина се примењује
|
||||
под другим околностима.
|
||||
Ако се било који део овог члана означи као неодговарајући
|
||||
или неприменљив под било којом одређеном околношћу,
|
||||
примењује се остатак члана а члан као целина се примењује
|
||||
под другим околностима.
|
||||
|
||||
Циљ овог члана није да вас наведе да прекршите било које
|
||||
патенте или друга права на својину нити да оспори
|
||||
валидност таквих права; овај члан има за свој једини циљ
|
||||
заштиту интегритета система расподеле слободног софтвера,
|
||||
који је имплементиран применом јавних лиценци. Многи људи
|
||||
су дали свој несебични допринос у широком спектру софтвера
|
||||
расподељеног кроз овај систем, ослањајући се на његову
|
||||
доследну примену; на аутору/донатору је да одлучи да ли је
|
||||
вољан/вољна да расподељује софтвер кроз било који систем,
|
||||
а лиценца не може наметнути тај избор.
|
||||
Циљ овог члана није да вас наведе да прекршите било које
|
||||
патенте или друга права на својину нити да оспори
|
||||
валидност таквих права; овај члан има за свој једини циљ
|
||||
заштиту интегритета система расподеле слободног софтвера,
|
||||
који је имплементиран применом јавних лиценци. Многи људи
|
||||
су дали свој несебични допринос у широком спектру софтвера
|
||||
расподељеног кроз овај систем, ослањајући се на његову
|
||||
доследну примену; на аутору/донатору је да одлучи да ли је
|
||||
вољан/вољна да расподељује софтвер кроз било који систем,
|
||||
а лиценца не може наметнути тај избор.
|
||||
|
||||
Овај члан треба да детаљно разјасни оно што може бити
|
||||
последица остатка ове лиценце.
|
||||
Овај члан треба да детаљно разјасни оно што може бити
|
||||
последица остатка ове лиценце.
|
||||
|
||||
8. Ако су расподела и/или коришћење Програма забрањени у
|
||||
одређеним земљама, било патентима или ауторским правима,
|
||||
првобитни носилац ауторских права који стави Програм под
|
||||
ову лиценцу може да приложи експлицитно географско
|
||||
ограничење расподеле, које искључује такве земље; тако да
|
||||
је расподела дозвољена само у земљи или земљама које нису
|
||||
искључене на такав начин. У том случају, ова лиценца
|
||||
укључује ограничење као да је део њеног текста.
|
||||
8. Ако су расподела и/или коришћење Програма забрањени у
|
||||
одређеним земљама, било патентима или ауторским правима,
|
||||
првобитни носилац ауторских права који стави Програм под
|
||||
ову лиценцу може да приложи експлицитно географско
|
||||
ограничење расподеле, које искључује такве земље; тако да
|
||||
је расподела дозвољена само у земљи или земљама које нису
|
||||
искључене на такав начин. У том случају, ова лиценца
|
||||
укључује ограничење као да је део њеног текста.
|
||||
|
||||
9. Задужбина за слободни софтвер може повремено објавити
|
||||
ревидиране и/или нове верзије Опште јавне лиценце. Такве
|
||||
ревизије ће бити сличне по духу садашњој верзији, али се
|
||||
могу разликовати у детаљима у циљу разрешења нових
|
||||
проблема или питања.
|
||||
9. Задужбина за слободни софтвер може повремено објавити
|
||||
ревидиране и/или нове верзије Опште јавне лиценце. Такве
|
||||
ревизије ће бити сличне по духу садашњој верзији, али се
|
||||
могу разликовати у детаљима у циљу разрешења нових
|
||||
проблема или питања.
|
||||
|
||||
Свака верзија ће добити различит број. Ако Програм истиче
|
||||
број верзије Лиценце која се примењује на њега и текст ,,и
|
||||
било која следећа верзија``, можете примењивати одредбе и
|
||||
услове те или било које следеће верзије коју објави
|
||||
Задужбина за слободни софтвер. Ако Програм не истиче број
|
||||
верзије ове лиценце, можете изабрати било коју верзију
|
||||
коју је објавила Задужбина за слободни софтвер.
|
||||
Свака верзија ће добити различит број. Ако Програм истиче
|
||||
број верзије Лиценце која се примењује на њега и текст ,,и
|
||||
било која следећа верзија``, можете примењивати одредбе и
|
||||
услове те или било које следеће верзије коју објави
|
||||
Задужбина за слободни софтвер. Ако Програм не истиче број
|
||||
верзије ове лиценце, можете изабрати било коју верзију
|
||||
коју је објавила Задужбина за слободни софтвер.
|
||||
|
||||
10. Ако желите да употребите делове Програма у другим
|
||||
слободним програмима чији су услови расподеле другачији,
|
||||
пишите аутору и замолите га за дозволу. За софтвер над
|
||||
којим ауторска права има Задужбина за слободни софтвер,
|
||||
пишите Задужбини за слободни софтвер; ми понекад начинимо
|
||||
изузетке за овакве ствари. Наша одлука ће бити мотивисана
|
||||
са два циља: чувања слободног статуса свега што је
|
||||
изведено из нашег слободног софтвера и промовисања дељења
|
||||
и поновне употребе софтвера уопште.
|
||||
10. Ако желите да употребите делове Програма у другим
|
||||
слободним програмима чији су услови расподеле другачији,
|
||||
пишите аутору и замолите га за дозволу. За софтвер над
|
||||
којим ауторска права има Задужбина за слободни софтвер,
|
||||
пишите Задужбини за слободни софтвер; ми понекад начинимо
|
||||
изузетке за овакве ствари. Наша одлука ће бити мотивисана
|
||||
са два циља: чувања слободног статуса свега што је
|
||||
изведено из нашег слободног софтвера и промовисања дељења
|
||||
и поновне употребе софтвера уопште.
|
||||
|
||||
|
||||
ОДСУСТВО ГАРАНЦИЈЕ
|
||||
ОДСУСТВО ГАРАНЦИЈЕ
|
||||
|
||||
11. УСЛЕД ЛИЦЕНЦИРАЊА ОВОГ ПРОГРАМА БЕЗ НОВЧАНЕ
|
||||
НАДОКНАДЕ, НЕ ПОСТОЈИ ГАРАНЦИЈА ЗА ПРОГРАМ У ОКВИРУ
|
||||
ПОСТОЈЕЋИХ ЗАКОНА. АКО НИЈЕ ДРУГАЧИЈЕ НАПИСАНО, НОСИОЦИ
|
||||
АУТОРСКИХ ПРАВА И/ИЛИ ДРУГА ЛИЦА НУДЕ ПРОГРАМ ,,ТАКАВ
|
||||
КАКАВ ЈЕ`` БЕЗ БИЛО КАКВЕ ГАРАНЦИЈЕ, БИЛО ЕКСПЛИЦИТНЕ ИЛИ
|
||||
ИМПЛИЦИТНЕ, УКЉУЧУЈУЋИ АЛИ СЕ НЕ ОГРАНИЧАВАЈУЋИ НА
|
||||
ИМПЛИЦИТНЕ ГАРАНЦИЈЕ КОМЕРЦИЈАЛНЕ ВРЕДНОСТИ ИЛИ ИСПУЊАВАЊА
|
||||
ОДРЕЂЕНЕ ПОТРЕБЕ. ЦЕЛОКУПАН РИЗИК КВАЛИТЕТА И ПЕРФОРМАНСИ
|
||||
ЈЕ НА ВАМА. У СЛУЧАЈУ ДА СЕ ИСПОСТАВИ ДА ЈЕ ПРОГРАМ
|
||||
ДЕФЕКТАН, ВИ СНОСИТЕ ТРОШКОВЕ ПОТРЕБНОГ СЕРВИСИРАЊА ИЛИ
|
||||
ПОПРАВКЕ.
|
||||
11. УСЛЕД ЛИЦЕНЦИРАЊА ОВОГ ПРОГРАМА БЕЗ НОВЧАНЕ
|
||||
НАДОКНАДЕ, НЕ ПОСТОЈИ ГАРАНЦИЈА ЗА ПРОГРАМ У ОКВИРУ
|
||||
ПОСТОЈЕЋИХ ЗАКОНА. АКО НИЈЕ ДРУГАЧИЈЕ НАПИСАНО, НОСИОЦИ
|
||||
АУТОРСКИХ ПРАВА И/ИЛИ ДРУГА ЛИЦА НУДЕ ПРОГРАМ ,,ТАКАВ
|
||||
КАКАВ ЈЕ`` БЕЗ БИЛО КАКВЕ ГАРАНЦИЈЕ, БИЛО ЕКСПЛИЦИТНЕ ИЛИ
|
||||
ИМПЛИЦИТНЕ, УКЉУЧУЈУЋИ АЛИ СЕ НЕ ОГРАНИЧАВАЈУЋИ НА
|
||||
ИМПЛИЦИТНЕ ГАРАНЦИЈЕ КОМЕРЦИЈАЛНЕ ВРЕДНОСТИ ИЛИ ИСПУЊАВАЊА
|
||||
ОДРЕЂЕНЕ ПОТРЕБЕ. ЦЕЛОКУПАН РИЗИК КВАЛИТЕТА И ПЕРФОРМАНСИ
|
||||
ЈЕ НА ВАМА. У СЛУЧАЈУ ДА СЕ ИСПОСТАВИ ДА ЈЕ ПРОГРАМ
|
||||
ДЕФЕКТАН, ВИ СНОСИТЕ ТРОШКОВЕ ПОТРЕБНОГ СЕРВИСИРАЊА ИЛИ
|
||||
ПОПРАВКЕ.
|
||||
|
||||
12. НИ У КАКВИМ ОКОЛНОСТИМА, ИЗУЗЕВ АКО ТО ЗАХТЕВА
|
||||
ПОСТОЈЕЋИ ЗАКОН ИЛИ ПИСМЕНИ ДОГОВОР, НОСИЛАЦ АУТОРСКИХ
|
||||
ПРАВА ИЛИ БИЛО КОЈЕ ДРУГО ЛИЦЕ КОЈЕ МОЖЕ ИЗМЕНИТИ И/ИЛИ
|
||||
РАСПОДЕЛИТИ ПРОГРАМ УЗ ПОШТОВАЊЕ ПРЕТХОДНЕ ДОЗВОЛЕ, НЕЋЕ
|
||||
ВАМ БИТИ ОДГОВОРНИ ЗА ШТЕТЕ, КОЈЕ ОБУХВАТАЈУ СВЕ ОПШТЕ,
|
||||
ПОСЕБНЕ, СЛУЧАЈНЕ ИЛИ НАМЕРНЕ ШТЕТЕ ПРОУЗРОКОВАНЕ
|
||||
УПОТРЕБОМ ИЛИ НЕМОГУЋНОШЋУ УПОТРЕБЕ ПРОГРАМА (УКЉУЧУЈУЋИ
|
||||
АЛИ СЕ НЕ ОГРАНИЧАВАЈУЋИ НА ГУБИТАК ПОДАТАКА ИЛИ ПОГРЕШАН
|
||||
ПРИКАЗ ПОДАТАКА ИЛИ ГУБИТКЕ КОЈЕ СТЕ ИЗАЗВАЛИ ВИ ИЛИ ТРЕЋА
|
||||
ЛИЦА ИЛИ НЕМОГУЋНОСТ ПРОГРАМА ДА ФУНКЦИОНИШЕ СА БИЛО КОЈИМ
|
||||
ДРУГИМ ПРОГРАМИМА), ЧАК И АКО СУ ТАЈ НОСИЛАЦ ИЛИ ДРУГА
|
||||
ЛИЦА БИЛИ УПОЗНАТИ СА МОГУЋНОШЋУ ТАКВИХ ШТЕТА.
|
||||
12. НИ У КАКВИМ ОКОЛНОСТИМА, ИЗУЗЕВ АКО ТО ЗАХТЕВА
|
||||
ПОСТОЈЕЋИ ЗАКОН ИЛИ ПИСМЕНИ ДОГОВОР, НОСИЛАЦ АУТОРСКИХ
|
||||
ПРАВА ИЛИ БИЛО КОЈЕ ДРУГО ЛИЦЕ КОЈЕ МОЖЕ ИЗМЕНИТИ И/ИЛИ
|
||||
РАСПОДЕЛИТИ ПРОГРАМ УЗ ПОШТОВАЊЕ ПРЕТХОДНЕ ДОЗВОЛЕ, НЕЋЕ
|
||||
ВАМ БИТИ ОДГОВОРНИ ЗА ШТЕТЕ, КОЈЕ ОБУХВАТАЈУ СВЕ ОПШТЕ,
|
||||
ПОСЕБНЕ, СЛУЧАЈНЕ ИЛИ НАМЕРНЕ ШТЕТЕ ПРОУЗРОКОВАНЕ
|
||||
УПОТРЕБОМ ИЛИ НЕМОГУЋНОШЋУ УПОТРЕБЕ ПРОГРАМА (УКЉУЧУЈУЋИ
|
||||
АЛИ СЕ НЕ ОГРАНИЧАВАЈУЋИ НА ГУБИТАК ПОДАТАКА ИЛИ ПОГРЕШАН
|
||||
ПРИКАЗ ПОДАТАКА ИЛИ ГУБИТКЕ КОЈЕ СТЕ ИЗАЗВАЛИ ВИ ИЛИ ТРЕЋА
|
||||
ЛИЦА ИЛИ НЕМОГУЋНОСТ ПРОГРАМА ДА ФУНКЦИОНИШЕ СА БИЛО КОЈИМ
|
||||
ДРУГИМ ПРОГРАМИМА), ЧАК И АКО СУ ТАЈ НОСИЛАЦ ИЛИ ДРУГА
|
||||
ЛИЦА БИЛИ УПОЗНАТИ СА МОГУЋНОШЋУ ТАКВИХ ШТЕТА.
|
||||
|
||||
КРАЈ ОДРЕДБИ И УСЛОВА
|
||||
КРАЈ ОДРЕДБИ И УСЛОВА
|
||||
|
||||
Како да примените ове одредбе на ваше нове програме
|
||||
Како да примените ове одредбе на ваше нове програме
|
||||
|
||||
Ако развијете нови програм и желите да буде што
|
||||
кориснији јавности, најбољи начин да то постигнете је да
|
||||
га означите као слободни софтвер који свако може
|
||||
расподелити и мењати под овим одредбама.
|
||||
Ако развијете нови програм и желите да буде што
|
||||
кориснији јавности, најбољи начин да то постигнете је да
|
||||
га означите као слободни софтвер који свако може
|
||||
расподелити и мењати под овим одредбама.
|
||||
|
||||
Да бисте то урадили, додајте следећа обавештења вашем
|
||||
програму. Најсигурније је да их додате на почетак сваке
|
||||
изворне датотеке, да бисте најефикасније саопштили
|
||||
одсуство гаранције; свака датотека требало би да садржи
|
||||
најмање линију са ауторским правима и информацију где се
|
||||
може пронаћи пуно обавештење.
|
||||
Да бисте то урадили, додајте следећа обавештења вашем
|
||||
програму. Најсигурније је да их додате на почетак сваке
|
||||
изворне датотеке, да бисте најефикасније саопштили
|
||||
одсуство гаранције; свака датотека требало би да садржи
|
||||
најмање линију са ауторским правима и информацију где се
|
||||
може пронаћи пуно обавештење.
|
||||
|
||||
<у једној линији наведите назив програма и кратак опис
|
||||
онога шта ради.>
|
||||
Ауторска права (C) <гггг> <име аутора>
|
||||
<у једној линији наведите назив програма и кратак опис
|
||||
онога шта ради.>
|
||||
Ауторска права (C) <гггг> <име аутора>
|
||||
|
||||
Овај програм је слободни софтвер; можете га
|
||||
расподелити и/или мењати под одредбама ГНУ-ове опште
|
||||
јавне лиценце коју је објавила Задужбина за слободни
|
||||
софтвер; и то, било верзије 2 Лиценце, или (по вашем
|
||||
избору) било које следеће верзије.
|
||||
Овај програм је слободни софтвер; можете га
|
||||
расподелити и/или мењати под одредбама ГНУ-ове опште
|
||||
јавне лиценце коју је објавила Задужбина за слободни
|
||||
софтвер; и то, било верзије 2 Лиценце, или (по вашем
|
||||
избору) било које следеће верзије.
|
||||
|
||||
Овај програм се расподељује у намери да буде користан,
|
||||
али БЕЗ ИКАКВЕ ГАРАНЦИЈЕ; чак и без имплицитне
|
||||
гаранције КОМЕРЦИЈАЛНЕ ВРЕДНОСТИ или ИСПУЊАВАЊА
|
||||
ОДРЕЂЕНЕ ПОТРЕБЕ. Погледајте ГНУ-ову општу јавну
|
||||
лиценцу за више детаља.
|
||||
Овај програм се расподељује у намери да буде користан,
|
||||
али БЕЗ ИКАКВЕ ГАРАНЦИЈЕ; чак и без имплицитне
|
||||
гаранције КОМЕРЦИЈАЛНЕ ВРЕДНОСТИ или ИСПУЊАВАЊА
|
||||
ОДРЕЂЕНЕ ПОТРЕБЕ. Погледајте ГНУ-ову општу јавну
|
||||
лиценцу за више детаља.
|
||||
|
||||
Требало би да примите примерак ГНУ-ове опште јавне
|
||||
лиценце заједно са овим програмом; ако то није случај,
|
||||
пишите Задужбини за слободни софтвер на адресу: Free
|
||||
Требало би да примите примерак ГНУ-ове опште јавне
|
||||
лиценце заједно са овим програмом; ако то није случај,
|
||||
пишите Задужбини за слободни софтвер на адресу: Free
|
||||
Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||
Boston, MA 02110-1301 USA.
|
||||
|
||||
Такође додајте обавештење како вам се може јавити преко
|
||||
електронске и обичне поште.
|
||||
Такође додајте обавештење како вам се може јавити преко
|
||||
електронске и обичне поште.
|
||||
|
||||
Ако је програм интерактиван, треба да исписује кратко
|
||||
саопштење слично овом при покретању у интерактивном
|
||||
режиму:
|
||||
Ако је програм интерактиван, треба да исписује кратко
|
||||
саопштење слично овом при покретању у интерактивном
|
||||
режиму:
|
||||
|
||||
Гномовизија верзија 69, Ауторска права (C) година име
|
||||
аутора Гномовизија се испоручује БЕЗ ИКАКВЕ ГАРАНЦИЈЕ;
|
||||
за детаље откуцајте `прикажи г'. Ово је слободни
|
||||
софтвер, а ви сте позвани да га расподелите под
|
||||
извесним условима; откуцајте `прикажи у' за детаље.
|
||||
Гномовизија верзија 69, Ауторска права (C) година име
|
||||
аутора Гномовизија се испоручује БЕЗ ИКАКВЕ ГАРАНЦИЈЕ;
|
||||
за детаље откуцајте `прикажи г'. Ово је слободни
|
||||
софтвер, а ви сте позвани да га расподелите под
|
||||
извесним условима; откуцајте `прикажи у' за детаље.
|
||||
|
||||
Хипотетичке команде `прикажи г' и `прикажи у' би требало
|
||||
да прикажу одговарајуће делове Опште јавне лиценце.
|
||||
Наравно, команде које ви користите могу се разликовати од
|
||||
`прикажи г' и `прикажи у'; то чак могу бити и кликови
|
||||
мишем или ставке менија или нешто што највише одговара
|
||||
вашем програму.
|
||||
Хипотетичке команде `прикажи г' и `прикажи у' би требало
|
||||
да прикажу одговарајуће делове Опште јавне лиценце.
|
||||
Наравно, команде које ви користите могу се разликовати од
|
||||
`прикажи г' и `прикажи у'; то чак могу бити и кликови
|
||||
мишем или ставке менија или нешто што највише одговара
|
||||
вашем програму.
|
||||
|
||||
Такође би требало да затражите од вашег послодавца (ако
|
||||
сте запослени као програмер) или ваше школе (ако сте у
|
||||
школи) да потпише ,,објашњење ауторских права`` за
|
||||
програм, у случају да је то потребно. На пример (измените
|
||||
имена):
|
||||
Такође би требало да затражите од вашег послодавца (ако
|
||||
сте запослени као програмер) или ваше школе (ако сте у
|
||||
школи) да потпише ,,објашњење ауторских права`` за
|
||||
програм, у случају да је то потребно. На пример (измените
|
||||
имена):
|
||||
|
||||
Јојодин, д.д., се овим одриче свих ауторских права за
|
||||
програм `Гномовизија' (који пролази кроз преводиоце)
|
||||
који је написао Петар Хакер.
|
||||
Јојодин, д.д., се овим одриче свих ауторских права за
|
||||
програм `Гномовизија' (који пролази кроз преводиоце)
|
||||
који је написао Петар Хакер.
|
||||
|
||||
<потпис Тај Куна>, 1. април 1989.
|
||||
Тај Кун, председник пода
|
||||
<потпис Тај Куна>, 1. април 1989.
|
||||
Тај Кун, председник пода
|
||||
|
||||
Ова општа јавна лиценца не дозвољава укључење вашег
|
||||
програма у програме у приватном власништву. Ако је ваш
|
||||
програм библиотека рутина, може вам бити корисније да
|
||||
дозволите повезивање власничких апликација са библиотеком.
|
||||
Ако је то оно што желите, користите ГНУ-ову библиотечку
|
||||
општу јавну лиценцу (**) уместо ове лиценце.
|
||||
Ова општа јавна лиценца не дозвољава укључење вашег
|
||||
програма у програме у приватном власништву. Ако је ваш
|
||||
програм библиотека рутина, може вам бити корисније да
|
||||
дозволите повезивање власничких апликација са библиотеком.
|
||||
Ако је то оно што желите, користите ГНУ-ову библиотечку
|
||||
општу јавну лиценцу (**) уместо ове лиценце.
|
||||
|
||||
Напомене у тексту
|
||||
Напомене у тексту
|
||||
|
||||
|
||||
(*) Коначна српска верзија ГНУ-ове ОЈЛ је уобличена 6.
|
||||
августа 2001. године у Београду, уз мање исправке 20.
|
||||
септембра 2002., 3. и 16. фебруара 2003., 5. и 10.
|
||||
маја 2003. и 1. и 6. септембра 2003.
|
||||
(*) Коначна српска верзија ГНУ-ове ОЈЛ је уобличена 6.
|
||||
августа 2001. године у Београду, уз мање исправке 20.
|
||||
септембра 2002., 3. и 16. фебруара 2003., 5. и 10.
|
||||
маја 2003. и 1. и 6. септембра 2003.
|
||||
|
||||
(**) ГНУ-ова библиотечка општа јавна лиценца (БОЈЛ, енг.
|
||||
LGPL/Library General Public License) се сада зове
|
||||
ГНУ-ова мања општа јавна лиценца (МОЈЛ, енг.
|
||||
(**) ГНУ-ова библиотечка општа јавна лиценца (БОЈЛ, енг.
|
||||
LGPL/Library General Public License) се сада зове
|
||||
ГНУ-ова мања општа јавна лиценца (МОЈЛ, енг.
|
||||
LGPL/Lesser General Public License).
|
||||
|
||||
Заслуге за српску верзију ГНУ-ове ОЈЛ
|
||||
Заслуге за српску верзију ГНУ-ове ОЈЛ
|
||||
|
||||
превод са енглеског:
|
||||
превод са енглеског:
|
||||
|
||||
Страхиња Радић, студент на Математичком факултету у
|
||||
Београду,
|
||||
<mr99164 на серверу alas.matf.bg.ac.yu>
|
||||
Страхиња Радић, студент на Математичком факултету у
|
||||
Београду,
|
||||
<mr99164 на серверу alas.matf.bg.ac.yu>
|
||||
|
||||
сугестије:
|
||||
сугестије:
|
||||
|
||||
Милош Ранчић, студент на Филолошком факултету у
|
||||
Београду,
|
||||
<millosh на серверу isgf.grf.bg.ac.yu>
|
||||
Милош Ранчић, студент на Филолошком факултету у
|
||||
Београду,
|
||||
<millosh на серверу isgf.grf.bg.ac.yu>
|
||||
|
||||
Зоран Стефановић, председник пројекта ,,Растко``,
|
||||
<orfej на серверу rastko.org.yu>
|
||||
Зоран Стефановић, председник пројекта ,,Растко``,
|
||||
<orfej на серверу rastko.org.yu>
|
||||
|
||||
правни савети:
|
||||
правни савети:
|
||||
|
||||
Марко Милосављевић, студент на Правном факултету у
|
||||
Београду.
|
||||
Марко Милосављевић, студент на Правном факултету у
|
||||
Београду.
|
||||
|
||||
Захваљујем се многим другима које овде нисам поменуо, а
|
||||
који су дали свој допринос настојањима да српска верзија
|
||||
ГНУ-ове ОЈЛ заживи. Превод је настао као пројекат Српског
|
||||
рачунарског друштва ,,УЛИКС``,
|
||||
Захваљујем се многим другима које овде нисам поменуо, а
|
||||
који су дали свој допринос настојањима да српска верзија
|
||||
ГНУ-ове ОЈЛ заживи. Превод је настао као пројекат Српског
|
||||
рачунарског друштва ,,УЛИКС``,
|
||||
<http://uliks.sourceforge.net/>.
|
||||
|
||||
[QueryBox]
|
||||
Прозори упита
|
||||
Прозори упита
|
||||
|
||||
У дијалозима упита можете да користите тастере са
|
||||
стрелицама или прво слово да бисте изабрали ставку или
|
||||
можете да притиснете дугме миша када се показивач налази
|
||||
изнад дугмета на екрану.
|
||||
У дијалозима упита можете да користите тастере са
|
||||
стрелицама или прво слово да бисте изабрали ставку или
|
||||
можете да притиснете дугме миша када се показивач налази
|
||||
изнад дугмета на екрану.
|
||||
|
||||
[How to use help]
|
||||
Како користити помоћ
|
||||
Како користити помоћ
|
||||
|
||||
Можете да користите курсорске тастере да бисте се кретали
|
||||
у оквиру прегледача помоћи. Притисните стрелицу надоле
|
||||
да бисте се померили на следећу ставку или клизали надоле.
|
||||
Притисните стрелицу нагоре да бисте се померили на
|
||||
претходну ставку или клизали нагоре. Притисните стрелицу
|
||||
надесно да бисте пратили текућу везу. Притисните
|
||||
стрелицу налево да бисте се вратили уназад у оквиру
|
||||
историје посећених чворова.
|
||||
Можете да користите курсорске тастере да бисте се кретали
|
||||
у оквиру прегледача помоћи. Притисните стрелицу надоле
|
||||
да бисте се померили на следећу ставку или клизали надоле.
|
||||
Притисните стрелицу нагоре да бисте се померили на
|
||||
претходну ставку или клизали нагоре. Притисните стрелицу
|
||||
надесно да бисте пратили текућу везу. Притисните
|
||||
стрелицу налево да бисте се вратили уназад у оквиру
|
||||
историје посећених чворова.
|
||||
|
||||
Ако ваш терминал не подржава курсорске тастере, можете да
|
||||
користите размакницу да бисте клизали унапред и b
|
||||
(латинично б) да бисте клизали уназад. Користите тастер
|
||||
TAB да бисте прешли на следећу ставку а ENTER да
|
||||
бисте пратили текућу везу. Тастер l (латинично л) се
|
||||
може користити за враћање уназад у историји чворова које
|
||||
сте посетили. Притисните тастер ESC да бисте изашли из
|
||||
прегледача помоћи.
|
||||
Ако ваш терминал не подржава курсорске тастере, можете да
|
||||
користите размакницу да бисте клизали унапред и b
|
||||
(латинично б) да бисте клизали уназад. Користите тастер
|
||||
TAB да бисте прешли на следећу ставку а ENTER да
|
||||
бисте пратили текућу везу. Тастер l (латинично л) се
|
||||
може користити за враћање уназад у историји чворова које
|
||||
сте посетили. Притисните тастер ESC да бисте изашли из
|
||||
прегледача помоћи.
|
||||
|
||||
Притиском на лево дугме миша ћете пратити везу или
|
||||
клизати. Притиском на десно дугме миша ћете се враћати
|
||||
уназад у историји чворова.
|
||||
Притиском на лево дугме миша ћете пратити везу или
|
||||
клизати. Притиском на десно дугме миша ћете се враћати
|
||||
уназад у историји чворова.
|
||||
|
||||
Потпун списак тастера прегледача помоћи:
|
||||
Потпун списак тастера прегледача помоћи:
|
||||
|
||||
Дозвољене су опште пречице за кретањеGeneral Movement Keys.
|
||||
Дозвољене су опште пречице за кретањеGeneral Movement Keys.
|
||||
|
||||
tab Помери се на следећу ставку.
|
||||
M-tab Помери се на претходну ставку.
|
||||
доле Помери се на след. ставку или клизај 1 ред надоле.
|
||||
горе Помери се на прет. ставку или клизај 1 ред нагоре.
|
||||
десно, enter Прати текућу везу.
|
||||
лево, l Врати се уназад у историји посећених чворова.
|
||||
F1 Прикажи помоћ око прегледача помоћи.
|
||||
n Иди на следећи чвор.
|
||||
p Иди на претходни чвор.
|
||||
c Иди на чвор `садржај'.
|
||||
F10, esc Излаз из прегледача помоћи.
|
||||
tab Помери се на следећу ставку.
|
||||
M-tab Помери се на претходну ставку.
|
||||
доле Помери се на след. ставку или клизај 1 ред надоле.
|
||||
горе Помери се на прет. ставку или клизај 1 ред нагоре.
|
||||
десно, enter Прати текућу везу.
|
||||
лево, l Врати се уназад у историји посећених чворова.
|
||||
F1 Прикажи помоћ око прегледача помоћи.
|
||||
n Иди на следећи чвор.
|
||||
p Иди на претходни чвор.
|
||||
c Иди на чвор `садржај'.
|
||||
F10, esc Излаз из прегледача помоћи.
|
||||
|
||||
Local variables:
|
||||
fill-column: 58
|
||||
|
180
edit/editmenu.c
180
edit/editmenu.c
@ -297,124 +297,124 @@ menu_user_menu_cmd (void)
|
||||
|
||||
static menu_entry FileMenu[] =
|
||||
{
|
||||
{' ', N_("&Open file..."), 'O', menu_load_cmd},
|
||||
{' ', N_("&New C-n"), 'N', menu_new_cmd},
|
||||
{' ', "", ' ', 0},
|
||||
{' ', N_("&Save F2"), 'S', menu_save_cmd},
|
||||
{' ', N_("Save &as... F12"), 'A', menu_save_as_cmd},
|
||||
{' ', "", ' ', 0},
|
||||
{' ', N_("&Insert file... F15"), 'I', menu_insert_file_cmd},
|
||||
{' ', N_("Copy to &file... C-f"), 'F', menu_cut_cmd},
|
||||
{' ', "", ' ', 0},
|
||||
{' ', N_("&User menu... F11"), 'U', menu_user_menu_cmd},
|
||||
{' ', "", ' ', 0},
|
||||
{' ', N_("A&bout... "), 'B', edit_about_cmd},
|
||||
{' ', "", ' ', 0},
|
||||
{' ', N_("&Quit F10"), 'Q', menu_quit_cmd}
|
||||
{' ', N_("&Open file..."), NULL_HOTKEY, menu_load_cmd},
|
||||
{' ', N_("&New C-n"), NULL_HOTKEY, menu_new_cmd},
|
||||
{' ', "", NULL_HOTKEY, 0},
|
||||
{' ', N_("&Save F2"), NULL_HOTKEY, menu_save_cmd},
|
||||
{' ', N_("Save &as... F12"), NULL_HOTKEY, menu_save_as_cmd},
|
||||
{' ', "", NULL_HOTKEY, 0},
|
||||
{' ', N_("&Insert file... F15"), NULL_HOTKEY, menu_insert_file_cmd},
|
||||
{' ', N_("Copy to &file... C-f"), NULL_HOTKEY, menu_cut_cmd},
|
||||
{' ', "", NULL_HOTKEY, 0},
|
||||
{' ', N_("&User menu... F11"), NULL_HOTKEY, menu_user_menu_cmd},
|
||||
{' ', "", NULL_HOTKEY, 0},
|
||||
{' ', N_("A&bout... "), NULL_HOTKEY, edit_about_cmd},
|
||||
{' ', "", NULL_HOTKEY, 0},
|
||||
{' ', N_("&Quit F10"), NULL_HOTKEY, menu_quit_cmd}
|
||||
};
|
||||
|
||||
static menu_entry FileMenuEmacs[] =
|
||||
{
|
||||
{' ', N_("&Open file..."), 'O', menu_load_cmd},
|
||||
{' ', N_("&New C-x k"), 'N', menu_new_cmd},
|
||||
{' ', "", ' ', 0},
|
||||
{' ', N_("&Save F2"), 'S', menu_save_cmd},
|
||||
{' ', N_("Save &as... F12"), 'A', menu_save_as_cmd},
|
||||
{' ', "", ' ', 0},
|
||||
{' ', N_("&Insert file... F15"), 'I', menu_insert_file_cmd},
|
||||
{' ', N_("Copy to &file... "), 'F', menu_cut_cmd},
|
||||
{' ', "", ' ', 0},
|
||||
{' ', N_("&User menu... F11"), 'U', menu_user_menu_cmd},
|
||||
{' ', "", ' ', 0},
|
||||
{' ', N_("A&bout... "), 'B', edit_about_cmd},
|
||||
{' ', "", ' ', 0},
|
||||
{' ', N_("&Quit F10"), 'Q', menu_quit_cmd}
|
||||
{' ', N_("&Open file..."), NULL_HOTKEY, menu_load_cmd},
|
||||
{' ', N_("&New C-x k"), NULL_HOTKEY, menu_new_cmd},
|
||||
{' ', "", NULL_HOTKEY, 0},
|
||||
{' ', N_("&Save F2"), NULL_HOTKEY, menu_save_cmd},
|
||||
{' ', N_("Save &as... F12"), NULL_HOTKEY, menu_save_as_cmd},
|
||||
{' ', "", NULL_HOTKEY, 0},
|
||||
{' ', N_("&Insert file... F15"), NULL_HOTKEY, menu_insert_file_cmd},
|
||||
{' ', N_("Copy to &file... "), NULL_HOTKEY, menu_cut_cmd},
|
||||
{' ', "", NULL_HOTKEY, 0},
|
||||
{' ', N_("&User menu... F11"), NULL_HOTKEY, menu_user_menu_cmd},
|
||||
{' ', "", NULL_HOTKEY, 0},
|
||||
{' ', N_("A&bout... "), NULL_HOTKEY, edit_about_cmd},
|
||||
{' ', "", NULL_HOTKEY, 0},
|
||||
{' ', N_("&Quit F10"), NULL_HOTKEY, menu_quit_cmd}
|
||||
};
|
||||
|
||||
static menu_entry EditMenu[] =
|
||||
{
|
||||
{' ', N_("&Toggle Mark F3"), 'T', menu_mark_cmd},
|
||||
{' ', N_("&Mark Columns S-F3"), 'T', menu_markcol_cmd},
|
||||
{' ', "", ' ', 0},
|
||||
{' ', N_("Toggle &ins/overw Ins"), 'I', menu_ins_cmd},
|
||||
{' ', "", ' ', 0},
|
||||
{' ', N_("&Copy F5"), 'C', menu_copy_cmd},
|
||||
{' ', N_("&Move F6"), 'M', menu_move_cmd},
|
||||
{' ', N_("&Delete F8"), 'D', menu_delete_cmd},
|
||||
{' ', "", ' ', 0},
|
||||
{' ', N_("&Undo C-u"), 'U', menu_undo_cmd},
|
||||
{' ', "", ' ', 0},
|
||||
{' ', N_("&Beginning C-PgUp"), 'B', menu_beginning_cmd},
|
||||
{' ', N_("&End C-PgDn"), 'E', menu_end_cmd}
|
||||
{' ', N_("&Toggle Mark F3"), NULL_HOTKEY, menu_mark_cmd},
|
||||
{' ', N_("&Mark Columns S-F3"), NULL_HOTKEY, menu_markcol_cmd},
|
||||
{' ', "", NULL_HOTKEY, 0},
|
||||
{' ', N_("Toggle &ins/overw Ins"), NULL_HOTKEY, menu_ins_cmd},
|
||||
{' ', "", NULL_HOTKEY, 0},
|
||||
{' ', N_("&Copy F5"), NULL_HOTKEY, menu_copy_cmd},
|
||||
{' ', N_("&Move F6"), NULL_HOTKEY, menu_move_cmd},
|
||||
{' ', N_("&Delete F8"), NULL_HOTKEY, menu_delete_cmd},
|
||||
{' ', "", NULL_HOTKEY, 0},
|
||||
{' ', N_("&Undo C-u"), NULL_HOTKEY, menu_undo_cmd},
|
||||
{' ', "", NULL_HOTKEY, 0},
|
||||
{' ', N_("&Beginning C-PgUp"), NULL_HOTKEY, menu_beginning_cmd},
|
||||
{' ', N_("&End C-PgDn"), NULL_HOTKEY, menu_end_cmd}
|
||||
};
|
||||
|
||||
#define EditMenuEmacs EditMenu
|
||||
|
||||
static menu_entry SearReplMenu[] =
|
||||
{
|
||||
{' ', N_("&Search... F7"), 'S', menu_search_cmd},
|
||||
{' ', N_("Search &again F17"), 'A', menu_search_again_cmd},
|
||||
{' ', N_("&Replace... F4"), 'R', menu_replace_cmd}
|
||||
{' ', N_("&Search... F7"), NULL_HOTKEY, menu_search_cmd},
|
||||
{' ', N_("Search &again F17"), NULL_HOTKEY, menu_search_again_cmd},
|
||||
{' ', N_("&Replace... F4"), NULL_HOTKEY, menu_replace_cmd}
|
||||
};
|
||||
|
||||
#define SearReplMenuEmacs SearReplMenu
|
||||
|
||||
static menu_entry CmdMenu[] =
|
||||
{
|
||||
{' ', N_("&Go to line... M-l"), 'G', menu_goto_line},
|
||||
{' ', N_("Go to matching &bracket M-b"), 'B', menu_goto_bracket},
|
||||
{' ', "", ' ', 0},
|
||||
{' ', N_("Insert &literal... C-q"), 'L', menu_lit_cmd},
|
||||
{' ', "", ' ', 0},
|
||||
{' ', N_("&Refresh screen C-l"), 'R', menu_refresh_cmd},
|
||||
{' ', "", ' ', 0},
|
||||
{' ', N_("&Start record macro C-r"), 'S', menu_begin_record_cmd},
|
||||
{' ', N_("&Finish record macro... C-r"), 'F', menu_end_record_cmd},
|
||||
{' ', N_("&Execute macro... C-a, KEY"), 'E', menu_exec_macro_cmd},
|
||||
{' ', N_("Delete macr&o... "), 'O', menu_exec_macro_delete_cmd},
|
||||
{' ', "", ' ', 0},
|
||||
{' ', N_("Insert &date/time "), 'D', menu_date_cmd},
|
||||
{' ', "", ' ', 0},
|
||||
{' ', N_("Format p&aragraph M-p"), 'A', menu_format_paragraph},
|
||||
{' ', N_("'ispell' s&pell check C-p"), 'P', menu_ispell_cmd},
|
||||
{' ', N_("Sor&t... M-t"), 'T', menu_sort_cmd},
|
||||
{' ', N_("Paste o&utput of... M-u"), 'U', menu_ext_cmd},
|
||||
{' ', N_("E&xternal Formatter F19"), 'C', menu_c_form_cmd},
|
||||
{' ', N_("&Mail... "), 'M', menu_mail_cmd}
|
||||
{' ', N_("&Go to line... M-l"), NULL_HOTKEY, menu_goto_line},
|
||||
{' ', N_("Go to matching &bracket M-b"), NULL_HOTKEY, menu_goto_bracket},
|
||||
{' ', "", NULL_HOTKEY, 0},
|
||||
{' ', N_("Insert &literal... C-q"), NULL_HOTKEY, menu_lit_cmd},
|
||||
{' ', "", NULL_HOTKEY, 0},
|
||||
{' ', N_("&Refresh screen C-l"), NULL_HOTKEY, menu_refresh_cmd},
|
||||
{' ', "", NULL_HOTKEY, 0},
|
||||
{' ', N_("&Start record macro C-r"), NULL_HOTKEY, menu_begin_record_cmd},
|
||||
{' ', N_("&Finish record macro... C-r"), NULL_HOTKEY, menu_end_record_cmd},
|
||||
{' ', N_("&Execute macro... C-a, KEY"), NULL_HOTKEY, menu_exec_macro_cmd},
|
||||
{' ', N_("Delete macr&o... "), NULL_HOTKEY, menu_exec_macro_delete_cmd},
|
||||
{' ', "", NULL_HOTKEY, 0},
|
||||
{' ', N_("Insert &date/time "), NULL_HOTKEY, menu_date_cmd},
|
||||
{' ', "", NULL_HOTKEY, 0},
|
||||
{' ', N_("Format p&aragraph M-p"), NULL_HOTKEY, menu_format_paragraph},
|
||||
{' ', N_("'ispell' s&pell check C-p"), NULL_HOTKEY, menu_ispell_cmd},
|
||||
{' ', N_("Sor&t... M-t"), NULL_HOTKEY, menu_sort_cmd},
|
||||
{' ', N_("Paste o&utput of... M-u"), NULL_HOTKEY, menu_ext_cmd},
|
||||
{' ', N_("E&xternal Formatter F19"), NULL_HOTKEY, menu_c_form_cmd},
|
||||
{' ', N_("&Mail... "), NULL_HOTKEY, menu_mail_cmd}
|
||||
};
|
||||
|
||||
static menu_entry CmdMenuEmacs[] =
|
||||
{
|
||||
{' ', N_("&Go to line... M-l"), 'G', menu_goto_line},
|
||||
{' ', N_("Go to matching &bracket M-b"), 'B', menu_goto_bracket},
|
||||
{' ', "", ' ', 0},
|
||||
{' ', N_("Insert &literal... C-q"), 'L', menu_lit_cmd},
|
||||
{' ', "", ' ', 0},
|
||||
{' ', N_("&Refresh screen C-l"), 'R', menu_refresh_cmd},
|
||||
{' ', "", ' ', 0},
|
||||
{' ', N_("&Start record macro C-r"), 'S', menu_begin_record_cmd},
|
||||
{' ', N_("&Finish record macro... C-r"), 'F', menu_end_record_cmd},
|
||||
{' ', N_("&Execute macro... C-x e, KEY"), 'E', menu_exec_macro_cmd},
|
||||
{' ', N_("Delete macr&o... "), 'o', menu_exec_macro_delete_cmd},
|
||||
{' ', "", ' ', 0},
|
||||
{' ', N_("Insert &date/time "), 'D', menu_date_cmd},
|
||||
{' ', "", ' ', 0},
|
||||
{' ', N_("Format p&aragraph M-p"), 'a', menu_format_paragraph},
|
||||
{' ', N_("'ispell' s&pell check M-$"), 'P', menu_ispell_cmd},
|
||||
{' ', N_("Sor&t... M-t"), 'T', menu_sort_cmd},
|
||||
{' ', N_("Paste o&utput of... M-u"), 'U', menu_ext_cmd},
|
||||
{' ', N_("E&xternal Formatter F19"), 'C', menu_c_form_cmd},
|
||||
{' ', N_("&Mail... "), 'M', menu_mail_cmd}
|
||||
{' ', N_("&Go to line... M-l"), NULL_HOTKEY, menu_goto_line},
|
||||
{' ', N_("Go to matching &bracket M-b"), NULL_HOTKEY, menu_goto_bracket},
|
||||
{' ', "", NULL_HOTKEY, 0},
|
||||
{' ', N_("Insert &literal... C-q"), NULL_HOTKEY, menu_lit_cmd},
|
||||
{' ', "", NULL_HOTKEY, 0},
|
||||
{' ', N_("&Refresh screen C-l"), NULL_HOTKEY, menu_refresh_cmd},
|
||||
{' ', "", NULL_HOTKEY, 0},
|
||||
{' ', N_("&Start record macro C-r"), NULL_HOTKEY, menu_begin_record_cmd},
|
||||
{' ', N_("&Finish record macro... C-r"), NULL_HOTKEY, menu_end_record_cmd},
|
||||
{' ', N_("&Execute macro... C-x e, KEY"), NULL_HOTKEY, menu_exec_macro_cmd},
|
||||
{' ', N_("Delete macr&o... "), NULL_HOTKEY, menu_exec_macro_delete_cmd},
|
||||
{' ', "", NULL_HOTKEY, 0},
|
||||
{' ', N_("Insert &date/time "), NULL_HOTKEY, menu_date_cmd},
|
||||
{' ', "", NULL_HOTKEY, 0},
|
||||
{' ', N_("Format p&aragraph M-p"), NULL_HOTKEY, menu_format_paragraph},
|
||||
{' ', N_("'ispell' s&pell check M-$"), NULL_HOTKEY, menu_ispell_cmd},
|
||||
{' ', N_("Sor&t... M-t"), NULL_HOTKEY, menu_sort_cmd},
|
||||
{' ', N_("Paste o&utput of... M-u"), NULL_HOTKEY, menu_ext_cmd},
|
||||
{' ', N_("E&xternal Formatter F19"), NULL_HOTKEY, menu_c_form_cmd},
|
||||
{' ', N_("&Mail... "), NULL_HOTKEY, menu_mail_cmd}
|
||||
};
|
||||
|
||||
static menu_entry OptMenu[] =
|
||||
{
|
||||
{' ', N_("&General... "), 'G', menu_options},
|
||||
{' ', N_("&Save mode..."), 'S', menu_save_mode_cmd},
|
||||
{' ', N_("Learn &Keys..."), 'K', learn_keys},
|
||||
{' ', N_("Syntax &Highlighting..."), 'H', menu_syntax},
|
||||
{' ', "", ' ', 0},
|
||||
{' ', N_("Save setu&p..."), 'p', save_setup_cmd}
|
||||
{' ', N_("&General... "), NULL_HOTKEY, menu_options},
|
||||
{' ', N_("&Save mode..."), NULL_HOTKEY, menu_save_mode_cmd},
|
||||
{' ', N_("Learn &Keys..."), NULL_HOTKEY, learn_keys},
|
||||
{' ', N_("Syntax &Highlighting..."), NULL_HOTKEY, menu_syntax},
|
||||
{' ', "", NULL_HOTKEY, 0},
|
||||
{' ', N_("Save setu&p..."), NULL_HOTKEY, save_setup_cmd}
|
||||
};
|
||||
|
||||
#define OptMenuEmacs OptMenu
|
||||
|
@ -10,3 +10,4 @@ CP852 CP 852
|
||||
CP866 CP 866
|
||||
KOI8-R KOI8-R
|
||||
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 p vloží na příkazovou řádku jméno aktuálního adresáře.
|
||||
Tip: K doplňování použijte M-Tab (nebo Esc+Tab). Dvojitým zadání získáte seznam.
|
||||
Tip: Použitím M-p nebo M-n se pohybujete v historii příkazů.
|
||||
Tip: Chcete zadat speciální znak(např. tabelátor)? Použijte Ctrl-Q a daný znak.
|
||||
Tip: Nechcete již vidět tipy? Vypněte je v Nastavení/Zobrazení/Další nastavení.
|
||||
Tip: Adresáře vyberete přidáním lomítka na konec vzorku.
|
||||
Tip: Pokud Váš terminál nezná nebo nemá funkční klávesy, použijte Esc+číslo.
|
||||
Tip: Domácí stránka programu Midnight Commander je http://www.midnight-commander.org/
|
||||
Tip: Zprávy o chybách posílejte na mc-devel@gnome.org (anglicky).
|
||||
Tip: Pomocí klávesy Tab změníte aktuální panel.
|
||||
Tip: Stiskem Enter na souboru .tar nebo .tar.gz si prohlédnete obsah.
|
||||
Tip: Existuje také manuálová stránka [mc(1)].
|
||||
Tip: Přejete si klávesy stejně jako v lynxu? Nastavte to v Nastavení.
|
||||
Tip: Makra uvozená % pracují na příkazové řádce.
|
||||
Tip: Pomocí M-! můžete spustit příkaz a prohlédnout si výstup v okně.
|
||||
Tip: Zobrazení v panelech může být upraveno. Z 'man mc' se dozvíte více.
|
||||
Tip: %D/%T se rozvine na soubory označené v druhém panelu.
|
||||
Tip: Chcete opět váš shell? Stiskněte C-o. Do MC se vrátíte opět přes C-o.
|
||||
Tip: Nastavením proměnné CDPATH můžete šetřit klávesnici.
|
||||
Tip: Pokud chcete vidět soubory začínající tečkou, řekněte to v Nastavení.
|
||||
Tip: Chcete vidět zálohy svých souborů (končí ~). Použijte Nastavení.
|
||||
Tip: Doplňování funguje ve vstupních řádkách všech dialogů. Použijte M-Tab.
|
||||
Tip: Na terminálech s pomalou odezvou skuste na parametr -s (mc -s).
|
||||
Tip: S nalezenými soubory můžete pracovat. Stiskněte tlačítko Panelizace.
|
||||
Tip: Pro opravdu složité operace zkuste příkaz Příkaz/Externí panelizace.
|
||||
Tip: Pokud chcete změnit adresář při práci na příkoazové řádce, zkuste M-c.
|
||||
Poznámka: Příkazy shellu nefungují, pokud nepracujete na lokální systému souborů.
|
||||
Tip: Smazaný text obnovíte C-y.
|
||||
Tip: Pokud některé klávesy nefungují, použijte menu Nastavení/učení kláves.
|
||||
Tip: F13 (nebo Shift-F3) vyvolá prohlížení bez zpracování obsahu souboru.
|
||||
Tip: Editor pro klávesu F4 určíte pomocí proměnné prostředí EDITOR.
|
||||
Tip: Externí prohlížeč určíte proměnnou PAGER.
|
||||
Tip: Všechny žádosti o potvrzení můžete zakázat v Nastavení/Potvrzování.
|
||||
Tip: K seznam často používaných adresářů se můžete dostat i přes C-\.
|
||||
Tip: Na anonymní FTP se připojíte pomocí 'cd /#ftp:stroj.domena.cz'
|
||||
Tip: MC má vestavěný FTP protokol. Podívejte se do menu Levý/Ftp spojení.
|
||||
Tip: M-t rychle mění formát zobrazení panelů.
|
||||
Tip: Při FTP spojení můžete zadat i jméno: 'cd /#ftp:jmeno@stroj.domena.cz'
|
||||
Tip: RPM soubory si prohlédnete stiskem Enter.
|
||||
Tip: Pokud chcete označit adresář, přidejte '/' (lomítko).
|
||||
Tip: Chcete-li použít myš pro zkopírování nebo vložení textu, stiskněte Shift.
|
||||
Tip: V seznamu adresářů můžete mít i často navštěvované ftp servery. Zkuste C-\.
|
||||
Tip: C-x t vloží na příkazovou řádku označené soubory.
|
||||
Tip: C-x p vloží na příkazovou řádku jméno aktuálního adresáře.
|
||||
Tip: K doplňování použijte M-Tab (nebo Esc+Tab). Dvojitým zadání získáte seznam.
|
||||
Tip: Použitím M-p nebo M-n se pohybujete v historii příkazů.
|
||||
Tip: Chcete zadat speciální znak(např. tabelátor)? Použijte Ctrl-Q a daný znak.
|
||||
Tip: Nechcete již vidět tipy? Vypněte je v Nastavení/Zobrazení/Další nastavení.
|
||||
Tip: Adresáře vyberete přidáním lomítka na konec vzorku.
|
||||
Tip: Pokud Váš terminál nezná nebo nemá funkční klávesy, použijte Esc+číslo.
|
||||
Tip: Domácí stránka programu Midnight Commander je http://www.midnight-commander.org/
|
||||
Tip: Zprávy o chybách posílejte na mc-devel@gnome.org (anglicky).
|
||||
Tip: Pomocí klávesy Tab změníte aktuální panel.
|
||||
Tip: Stiskem Enter na souboru .tar nebo .tar.gz si prohlédnete obsah.
|
||||
Tip: Existuje také manuálová stránka [mc(1)].
|
||||
Tip: Přejete si klávesy stejně jako v lynxu? Nastavte to v Nastavení.
|
||||
Tip: Makra uvozená % pracují na příkazové řádce.
|
||||
Tip: Pomocí M-! můžete spustit příkaz a prohlédnout si výstup v okně.
|
||||
Tip: Zobrazení v panelech může být upraveno. Z 'man mc' se dozvíte více.
|
||||
Tip: %D/%T se rozvine na soubory označené v druhém panelu.
|
||||
Tip: Chcete opět váš shell? Stiskněte C-o. Do MC se vrátíte opět přes C-o.
|
||||
Tip: Nastavením proměnné CDPATH můžete šetřit klávesnici.
|
||||
Tip: Pokud chcete vidět soubory začínající tečkou, řekněte to v Nastavení.
|
||||
Tip: Chcete vidět zálohy svých souborů (končí ~). Použijte Nastavení.
|
||||
Tip: Doplňování funguje ve vstupních řádkách všech dialogů. Použijte M-Tab.
|
||||
Tip: Na terminálech s pomalou odezvou skuste na parametr -s (mc -s).
|
||||
Tip: S nalezenými soubory můžete pracovat. Stiskněte tlačítko Panelizace.
|
||||
Tip: Pro opravdu složité operace zkuste příkaz Příkaz/Externí panelizace.
|
||||
Tip: Pokud chcete změnit adresář při práci na příkoazové řádce, zkuste M-c.
|
||||
Poznámka: Příkazy shellu nefungují, pokud nepracujete na lokální systému souborů.
|
||||
Tip: Smazaný text obnovíte C-y.
|
||||
Tip: Pokud některé klávesy nefungují, použijte menu Nastavení/učení kláves.
|
||||
Tip: F13 (nebo Shift-F3) vyvolá prohlížení bez zpracování obsahu souboru.
|
||||
Tip: Editor pro klávesu F4 určíte pomocí proměnné prostředí EDITOR.
|
||||
Tip: Externí prohlížeč určíte proměnnou PAGER.
|
||||
Tip: Všechny žádosti o potvrzení můžete zakázat v Nastavení/Potvrzování.
|
||||
Tip: K seznam často používaných adresářů se můžete dostat i přes C-\.
|
||||
Tip: Na anonymní FTP se připojíte pomocí 'cd /#ftp:stroj.domena.cz'
|
||||
Tip: MC má vestavěný FTP protokol. Podívejte se do menu Levý/Ftp spojení.
|
||||
Tip: M-t rychle mění formát zobrazení panelů.
|
||||
Tip: Při FTP spojení můžete zadat i jméno: 'cd /#ftp:jmeno@stroj.domena.cz'
|
||||
Tip: RPM soubory si prohlédnete stiskem Enter.
|
||||
Tip: Pokud chcete označit adresář, přidejte '/' (lomítko).
|
||||
Tip: Chcete-li použít myš pro zkopírování nebo vložení textu, stiskněte Shift.
|
||||
Tip: V seznamu adresářů můžete mít i často navštěvované ftp servery. Zkuste C-\.
|
||||
|
@ -1,45 +1,45 @@
|
||||
Ayudita: C-x t pone los archivos marcados en la línea de órdenes.
|
||||
Ayudita: C-x p copia la trayectoria completa en la línea de órdenes.
|
||||
Ayudita: C-x C-p copia la trayectoria del panel opuesto en la línea de órdenes.
|
||||
Ayudita: C-x t pone los archivos marcados en la línea de órdenes.
|
||||
Ayudita: C-x p copia la trayectoria completa en la línea de órdenes.
|
||||
Ayudita: C-x C-p copia la trayectoria del panel opuesto en la línea de órdenes.
|
||||
Ayudita: M-Tab (o Esc+Tab) completa nombres; dos veces y muestra una lista.
|
||||
Ayudita: M-p y M-n permiten acceder a la historia de órdenes.
|
||||
Ayudita: Para introducir un carácter especial: C-q y el caracter.
|
||||
Ayudita: ¿Harto de mensajitos? Se quitan en el menú Opciones/Presentación.
|
||||
Ayudita: Para seleccionar directorios añadir "/" tras el patrón a buscar.
|
||||
Ayudita: Si no funcionan las teclas de función, ESC+número sirve.
|
||||
Ayudita: El web del Midnight Commander está en http://www.midnight-commander.org/
|
||||
Ayudita: M-p y M-n permiten acceder a la historia de órdenes.
|
||||
Ayudita: Para introducir un carácter especial: C-q y el caracter.
|
||||
Ayudita: ¿Harto de mensajitos? Se quitan en el menú Opciones/Presentación.
|
||||
Ayudita: Para seleccionar directorios añadir "/" tras el patrón a buscar.
|
||||
Ayudita: Si no funcionan las teclas de función, ESC+número sirve.
|
||||
Ayudita: El web del Midnight Commander está en http://www.midnight-commander.org/
|
||||
Ayudita: El sitio oficial del Midnight Commander es http://www.midnight-commander.org/
|
||||
Ayudita: Comunique cualquier defecto a mc-devel@gnome.org
|
||||
Ayudita: El tabulador cambia de panel.
|
||||
Ayudita: ¡El mejor VFS! Al <entrar> en un archivo comprimido se ve su contenido.
|
||||
Ayudita: ¡El mejor VFS! Al <entrar> en un archivo comprimido se ve su contenido.
|
||||
Ayudita: El Midnight Commander tiene manual: "man mc"
|
||||
Ayudita: ¿Desea navegar con las flechas al estilo lynx? Está en Configuración.
|
||||
Ayudita: Las macros con % funcionan incluso en la línea de órdenes.
|
||||
Ayudita: ¿Desea navegar con las flechas al estilo lynx? Está en Configuración.
|
||||
Ayudita: Las macros con % funcionan incluso en la línea de órdenes.
|
||||
Ayudita: Con M-! puede ejecutar programas y ver la salida en el visor.
|
||||
Ayudita: El formato del listado se puede personalizar; "man mc" para ver pistas.
|
||||
Ayudita: %D/%T representa los archivos seleccionados en el panel opuesto.
|
||||
Ayudita: Con C-o se puede ir y volver a la shell de siempre.
|
||||
Ayudita: La variable CDPATH ahorra teclas al cambiar de directorios.
|
||||
Ayudita: Para ver los archivos .* basta indicarlo en Configuración.
|
||||
Ayudita: Para ver los archivos de seguridad tipo *~ ir a Configuración.
|
||||
Ayudita: Se puede auto-completar nombres también en los diálogos con M-Tab.
|
||||
Ayudita: En terminales lentos la opción -s puede ayudar.
|
||||
Ayudita: Para ver los archivos .* basta indicarlo en Configuración.
|
||||
Ayudita: Para ver los archivos de seguridad tipo *~ ir a Configuración.
|
||||
Ayudita: Se puede auto-completar nombres también en los diálogos con M-Tab.
|
||||
Ayudita: En terminales lentos la opción -s puede ayudar.
|
||||
Ayudita: Puede "Llevar al panel" los resultados de "Buscar archivos" y usarlos.
|
||||
Ayudita: Puede hacer y guardar búsquedas complejas con "Búsquedas externas".
|
||||
Ayudita: Con M-c cambiar de directorio es un poco más cómodo.
|
||||
Ayudita: Puede hacer y guardar búsquedas complejas con "Búsquedas externas".
|
||||
Ayudita: Con M-c cambiar de directorio es un poco más cómodo.
|
||||
Nota: Las instrucciones de la Shell no funcionan fuera del sistema local.
|
||||
Ayudita: Con C-y puede recuperar texto eliminado.
|
||||
Ayudita: ¿Alguna tecla rebelde? Puede educarla con "Redefinir teclas".
|
||||
Ayudita: ¿Alguna tecla rebelde? Puede educarla con "Redefinir teclas".
|
||||
Ayudita: Para ver la salida de una orden por el visor M-!
|
||||
Ayudita: F13 (o Mayúsculas-F3) invoca el visor en modo primitivo, sin formatos.
|
||||
Ayudita: F13 (o Mayúsculas-F3) invoca el visor en modo primitivo, sin formatos.
|
||||
Ayudita: F4 puede usar cualquier editor que indiquemos en la variable EDITOR.
|
||||
Ayudita: Se puede usar un visor externo indicado en la variable PAGER.
|
||||
Ayudita: Para deshabilitar los mensajes de Confirmación vaya al menú Opciones.
|
||||
Ayudita: Apunte los directorios y sitios más usados en "Favoritos".
|
||||
Ayudita: Para hacer un FTP anónimo con mc: 'cd /#ftp:maquina.dominio'
|
||||
Ayudita: FTP está integrado en Midnight Commander, en "conexión por FTP..."
|
||||
Ayudita: M-t permite cambiar rápidamente entre varios modos de listado.
|
||||
Ayudita: Para hacer un FTP no-anónimo: 'cd /#ftp:usuario@maquina.dominio'
|
||||
Ayudita: Para examinar un archivo RPM basta pulsar <intro> sobre él.
|
||||
Ayudita: Para copiar y pegar con ratón mantener presionada la tecla MAYÚSCULAS.
|
||||
Ayudita: Para deshabilitar los mensajes de Confirmación vaya al menú Opciones.
|
||||
Ayudita: Apunte los directorios y sitios más usados en "Favoritos".
|
||||
Ayudita: Para hacer un FTP anónimo con mc: 'cd /#ftp:maquina.dominio'
|
||||
Ayudita: FTP está integrado en Midnight Commander, en "conexión por FTP..."
|
||||
Ayudita: M-t permite cambiar rápidamente entre varios modos de listado.
|
||||
Ayudita: Para hacer un FTP no-anónimo: 'cd /#ftp:usuario@maquina.dominio'
|
||||
Ayudita: Para examinar un archivo RPM basta pulsar <intro> sobre él.
|
||||
Ayudita: Para copiar y pegar con ratón mantener presionada la tecla MAYÚSCULAS.
|
||||
Ayudita: Los ftp habituales se pueden guardar en "Favoritos".
|
||||
|
@ -1,44 +1,44 @@
|
||||
Tipp: A kijelölt fájlnevek parancssorba való másolása: C-x t
|
||||
Tipp: Az aktuális elérési út parancssorba való másolása: C-x p
|
||||
Tipp: Kiegészítés: M-Tab (vagy Esc Tab). Kétszer lenyomva listát ad.
|
||||
Tipp: Korábbi parancsok előhozása: M-p illetve M-n
|
||||
Tipp: Speciális karakter beírásához használja ezt: Control-q <karakter>
|
||||
Tipp: Az itt megjelenő üzenetek kikapcsolhatók a "Beállítások/Megjelenés"-nél.
|
||||
Tipp: Könyvtárak kijelölése a minta végére / jelet írva lehetséges.
|
||||
Tipp: Ha a terminálon nincsenek funkcióbillentyűk, használja ezt: Esc <szám>
|
||||
Tipp: A kijelölt fájlnevek parancssorba való másolása: C-x t
|
||||
Tipp: Az aktuális elérési út parancssorba való másolása: C-x p
|
||||
Tipp: Kiegészítés: M-Tab (vagy Esc Tab). Kétszer lenyomva listát ad.
|
||||
Tipp: Korábbi parancsok előhozása: M-p illetve M-n
|
||||
Tipp: Speciális karakter beírásához használja ezt: Control-q <karakter>
|
||||
Tipp: Az itt megjelenő üzenetek kikapcsolhatók a "Beállítások/Megjelenés"-nél.
|
||||
Tipp: Könyvtárak kijelölése a minta végére / jelet írva lehetséges.
|
||||
Tipp: Ha a terminálon nincsenek funkcióbillentyűk, használja ezt: Esc <szám>
|
||||
Tipp: A Midnight Commander honlapja: http://www.midnight-commander.org/
|
||||
Tipp: Hibabejelentéseket a következő címre lehet küldeni: mc-devel@gnome.org
|
||||
Tipp: A Tab billentyűvel lehet panelt váltani.
|
||||
Tipp: VFS-funkció: egy Tar-fájlon Entert nyomva megjelenik annak tartalma.
|
||||
Tipp: A Midnight Commandernek van "man" (kézikönyv) lapja is.
|
||||
Tipp: Szeretne Lynx-stílusú navigációt? Be lehet állítani az Alapbeállításoknál.
|
||||
Tipp: A % makrók még a parancssorban is használhatók.
|
||||
Tipp: Program végrehajtása a kimenetnek a fájlmegjelenítőbe való küldésével: M-!
|
||||
Tipp: A fájlok listázási módja beállítható; részletek a "man mc" paranccsal.
|
||||
Tipp: A %D/%T sztring a másik panel kijelölt fájljaival lesz helyettesítve.
|
||||
Tipp: A sima shell-t szeretné? Használja ezt: C-o (visszatérés MC-be: ugyanígy).
|
||||
Tipp: A CDPATH változó beállításával egyszerűbbé tehető a "cd" parancsok kiadása.
|
||||
Tipp: Ha látni szeretné a .* rejtett fájlokat, állítsa be az Alapbeállításoknál.
|
||||
Tipp: Ha látni szeretné a *~ másolatfájlokat, állítsa be az Alapbeállításoknál.
|
||||
Tipp: A kiegészítés minden ablak összes beviteli mezőjében működik: M-Tab
|
||||
Tipp: Lassú terminálokon a -s opció hasznos lehet.
|
||||
Tipp: Fájlkeresés: műveletek végzése a megtalált fájlokkal: "Listát a panelra".
|
||||
Tipp: Komplex keresések végzéséhez a "Külső panel-parancs" funkció javasolt.
|
||||
Tipp: Könyvtárváltás egy parancs begépelése közben: M-c (gyors könyvtárváltás).
|
||||
Megjegyzés: A shell-parancsok távoli fájlrendszereken nem használhatók.
|
||||
Tipp: A pufferben levő (például "C-k"-val oda tett) szöveg visszahozása: C-y
|
||||
Tipp: Ha nem működnek bizonyos billentyűk: "Beállítások/Billentyűk".
|
||||
Tipp: Egy parancs kimenetének megjelenítése a fájlmegjelenítőben: M-!
|
||||
Tipp: Az F13 (vagy Shift-F3) a fájlmegjelenítőt "nyers" módban indítja el.
|
||||
Tipp: Az F4-re használandó szerkesztőt az EDITOR shell-változóval lehet megadni.
|
||||
Tipp: A külső fájlmegjelenítőt a PAGER shell-változóval lehet megadni.
|
||||
Tipp: Az összes megerősítéskérés kikapcsolható: "Beállítások/Megerősítések".
|
||||
Tipp: Egyszerű módon elérhetők a gyakran használt könyvtárak: C-\
|
||||
Tipp: "Anonymous" FTP-zés végezhető ezzel a paranccsal: "cd /#ftp:gépnév.edu".
|
||||
Tipp: Az FTP be van építve a Midnight Commanderbe: "FTP-kapcsolat" menüpontok.
|
||||
Tipp: A listázási mód gyorsan váltható a következő billentyűkombinációval: M-t
|
||||
Tipp: FTP-zésnél felhasználónév is megadható: "cd /#ftp:felhasználó@gépnév.edu".
|
||||
Tipp: Az RPM-csomagfájlok böngészhetők, ehhez Entert kell nyomni az adott fájlon.
|
||||
Tipp: Könyvtárak kijelölése a "Kijelölés" ablakban: / jel hozzáfűzésével.
|
||||
Tipp: Az egérrel való szövegkimásoláshoz szükség lehet a Shift lenyomására.
|
||||
Tipp: A gyakran látogatott FTP-helyek betehetők a gyorslistába: C-\
|
||||
Tipp: Hibabejelentéseket a következő címre lehet küldeni: mc-devel@gnome.org
|
||||
Tipp: A Tab billentyűvel lehet panelt váltani.
|
||||
Tipp: VFS-funkció: egy Tar-fájlon Entert nyomva megjelenik annak tartalma.
|
||||
Tipp: A Midnight Commandernek van "man" (kézikönyv) lapja is.
|
||||
Tipp: Szeretne Lynx-stílusú navigációt? Be lehet állítani az Alapbeállításoknál.
|
||||
Tipp: A % makrók még a parancssorban is használhatók.
|
||||
Tipp: Program végrehajtása a kimenetnek a fájlmegjelenítőbe való küldésével: M-!
|
||||
Tipp: A fájlok listázási módja beállítható; részletek a "man mc" paranccsal.
|
||||
Tipp: A %D/%T sztring a másik panel kijelölt fájljaival lesz helyettesítve.
|
||||
Tipp: A sima shell-t szeretné? Használja ezt: C-o (visszatérés MC-be: ugyanígy).
|
||||
Tipp: A CDPATH változó beállításával egyszerűbbé tehető a "cd" parancsok kiadása.
|
||||
Tipp: Ha látni szeretné a .* rejtett fájlokat, állítsa be az Alapbeállításoknál.
|
||||
Tipp: Ha látni szeretné a *~ másolatfájlokat, állítsa be az Alapbeállításoknál.
|
||||
Tipp: A kiegészítés minden ablak összes beviteli mezőjében működik: M-Tab
|
||||
Tipp: Lassú terminálokon a -s opció hasznos lehet.
|
||||
Tipp: Fájlkeresés: műveletek végzése a megtalált fájlokkal: "Listát a panelra".
|
||||
Tipp: Komplex keresések végzéséhez a "Külső panel-parancs" funkció javasolt.
|
||||
Tipp: Könyvtárváltás egy parancs begépelése közben: M-c (gyors könyvtárváltás).
|
||||
Megjegyzés: A shell-parancsok távoli fájlrendszereken nem használhatók.
|
||||
Tipp: A pufferben levő (például "C-k"-val oda tett) szöveg visszahozása: C-y
|
||||
Tipp: Ha nem működnek bizonyos billentyűk: "Beállítások/Billentyűk".
|
||||
Tipp: Egy parancs kimenetének megjelenítése a fájlmegjelenítőben: M-!
|
||||
Tipp: Az F13 (vagy Shift-F3) a fájlmegjelenítőt "nyers" módban indítja el.
|
||||
Tipp: Az F4-re használandó szerkesztőt az EDITOR shell-változóval lehet megadni.
|
||||
Tipp: A külső fájlmegjelenítőt a PAGER shell-változóval lehet megadni.
|
||||
Tipp: Az összes megerősítéskérés kikapcsolható: "Beállítások/Megerősítések".
|
||||
Tipp: Egyszerű módon elérhetők a gyakran használt könyvtárak: C-\
|
||||
Tipp: "Anonymous" FTP-zés végezhető ezzel a paranccsal: "cd /#ftp:gépnév.edu".
|
||||
Tipp: Az FTP be van építve a Midnight Commanderbe: "FTP-kapcsolat" menüpontok.
|
||||
Tipp: A listázási mód gyorsan váltható a következő billentyűkombinációval: M-t
|
||||
Tipp: FTP-zésnél felhasználónév is megadható: "cd /#ftp:felhasználó@gépnév.edu".
|
||||
Tipp: Az RPM-csomagfájlok böngészhetők, ehhez Entert kell nyomni az adott fájlon.
|
||||
Tipp: Könyvtárak kijelölése a "Kijelölés" ablakban: / jel hozzáfűzésével.
|
||||
Tipp: Az egérrel való szövegkimásoláshoz szükség lehet a Shift lenyomására.
|
||||
Tipp: A gyakran látogatott FTP-helyek betehetők a gyorslistába: C-\
|
||||
|
@ -6,23 +6,23 @@ Dritta: devi inserire un carattere speciale? Usa C-q e il carattere.
|
||||
Dritta: stanco di questi messaggi? Disattivali dal menu Opzioni/Aspetto.
|
||||
Dritta: selezione directory: inserisci uno slash alla fine della selezione.
|
||||
Dritta: se al tuo terminale mancano i tasti funzione usa ESC+numero tasto.
|
||||
Dritta: l'URL del Midnight Commander è: http://www.midnight-commander.org/
|
||||
Dritta: l'URL del Midnight Commander è: http://www.midnight-commander.org/
|
||||
Dritta: la home page del Midnight Commander: http://www.midnight-commander.org/
|
||||
Dritta: prego spedire i bug report a mc-devel@gnome.org
|
||||
Dritta: tab cambia il pannello corrente.
|
||||
Dritta: magico VFS; premi invio su un file tar per esaminarne il contenuto.
|
||||
Dritta: c'è anche un bel manuale.
|
||||
Dritta: c'è anche un bel manuale.
|
||||
Dritta: navigazione stile lynx? Impostala in finestra di configurazione.
|
||||
Dritta: le macro % funzionano anche sulla linea di comando!
|
||||
Dritta: M-! permette di eseguire programmi e vedere il risultato nel viewer.
|
||||
Dritta: il formato della lista file è impostabile; "man mc" per i dettagli.
|
||||
Dritta: il formato della lista file è impostabile; "man mc" per i dettagli.
|
||||
Dritta: %D/%T espande i file selezionati nella directory opposta.
|
||||
Dritta: vuoi la tua shell? Premi C-o e torna nuovamente a MC con C-o.
|
||||
Dritta: impostare la variabile CDPATH può far risparmiare tasti nei comandi cd.
|
||||
Dritta: impostare la variabile CDPATH può far risparmiare tasti nei comandi cd.
|
||||
Dritta: se vuoi vedere i tuoi file .* impostalo nella Configurazione.
|
||||
Dritta: vuoi vedere i tuoi *~ file di backup? Impostalo nella Configurazione.
|
||||
Dritta: il completamento funziona su tutti gli input. Basta premere M-Tab.
|
||||
Dritta: con terminali lenti può aiutare la flag -s.
|
||||
Dritta: con terminali lenti può aiutare la flag -s.
|
||||
Dritta: trova file: puoi elaborare i file trovati usando il bottone Pannellizza.
|
||||
Dritta: vuoi fare ricerche complesse? Usa il comando Pannellizza.
|
||||
Dritta: per cambiare directory mentre batti un comando, usa M-c (cd rapido).
|
||||
@ -36,7 +36,7 @@ Dritta: puoi specificare il visualizzatore esterno con la variabile shell PAGER.
|
||||
Dritta: puoi disabilitare tutte le richieste di conferma in Opzioni/Conferme.
|
||||
Dritta: salta nelle directory usate frequentemente in un colpo con C-\.
|
||||
Dritta: puoi fare FTP anonimo con mc battendo 'cd /#ftp:macchina.edu'
|
||||
Dritta: l'FTP è integrato nel Midnight Commander, controlla il menu FTP.
|
||||
Dritta: l'FTP è integrato nel Midnight Commander, controlla il menu FTP.
|
||||
Dritta: M-t cambia velocemente il modo listato.
|
||||
Dritta: puoi dare il nome utente facendo ftp: 'cd /#ftp:utente@macchina.edu'
|
||||
Dritta: puoi navigare attraverso i file RPM battendo invio su di essi.
|
||||
|
@ -1,45 +1,45 @@
|
||||
Porada: Za pomocą C-x t kopiuje się nazwy zaznaczoych plików do wiersza poleceń.
|
||||
Porada: Za pomocą C-x p kopiuje się nazwę bieżącej ścieżki do wiersza poleceń.
|
||||
Porada: Uzupełnianie: M-Tab (lub Esc+Tab). Podwójne wciśnięcie wywołuje listę.
|
||||
Porada: M-p i M-n udostępnia historię poleceń.
|
||||
Porada: Cytowanie znaku można uzyskać naciskając Contrl-q i odpowiedni znak.
|
||||
Porada: Zmęczony poradami? Wyłącz je w menu Opcje|Układ...
|
||||
Porada: Wybieranie katalogów: dodaj ukośnik na końcu wzorca dopasowania.
|
||||
Porada: Jeśli w twoim terminalu brak klawiszy funkcyjnych, użyj Esc+numer.
|
||||
Porada: Za pomocą C-x t kopiuje się nazwy zaznaczoych plików do wiersza poleceń.
|
||||
Porada: Za pomocą C-x p kopiuje się nazwę bieżącej ścieżki do wiersza poleceń.
|
||||
Porada: Uzupełnianie: M-Tab (lub Esc+Tab). Podwójne wciśnięcie wywołuje listę.
|
||||
Porada: M-p i M-n udostępnia historię poleceń.
|
||||
Porada: Cytowanie znaku można uzyskać naciskając Contrl-q i odpowiedni znak.
|
||||
Porada: Zmęczony poradami? Wyłącz je w menu Opcje|Układ...
|
||||
Porada: Wybieranie katalogów: dodaj ukośnik na końcu wzorca dopasowania.
|
||||
Porada: Jeśli w twoim terminalu brak klawiszy funkcyjnych, użyj Esc+numer.
|
||||
Porada: Witryna Midnight Commandera jest pod adresem http://www.midnight-commander.org/
|
||||
Porada: Strona domowa Midnight Commandera pod adresem http://www.midnight-commander.org/
|
||||
Porada: Opis błędów (w języku angielskim) wysyłaj na mc-devel@gnome.org
|
||||
Porada: Za pomocą klawisza Tab zmienia się bieżący panel.
|
||||
Porada: VFS: naciśnij Enter na archiwum tar, aby obejrzeć jego zawartość.
|
||||
Porada: Na stronę podręcznikową też warto zajrzeć.
|
||||
Porada: Chcesz się poruszać tak jak w lynksie? Ustaw to w menu Konfiguracja...
|
||||
Porada: Makra % działają nawet w wierszu poleceń.
|
||||
Porada: M-! pozwala na podgląd wyjścia uruchamianych programów w przeglądarce.
|
||||
Porada: Tryb wyświetlania listy plików można dostosowywać: zobacz "man mc".
|
||||
Porada: Opis błędów (w języku angielskim) wysyłaj na mc-devel@gnome.org
|
||||
Porada: Za pomocą klawisza Tab zmienia się bieżący panel.
|
||||
Porada: VFS: naciśnij Enter na archiwum tar, aby obejrzeć jego zawartość.
|
||||
Porada: Na stronę podręcznikową też warto zajrzeć.
|
||||
Porada: Chcesz się poruszać tak jak w lynksie? Ustaw to w menu Konfiguracja...
|
||||
Porada: Makra % działają nawet w wierszu poleceń.
|
||||
Porada: M-! pozwala na podgląd wyjścia uruchamianych programów w przeglądarce.
|
||||
Porada: Tryb wyświetlania listy plików można dostosowywać: zobacz "man mc".
|
||||
Porada: %D/%T oznacza zazanaczone pliki w drugim panelu.
|
||||
Porada: Dostęp do zwykłej powłoki przez C-o. Powrót do MC przez ponowne C-o.
|
||||
Porada: Ustawienie zmiennej CDPATH może ci zaoszczędzić pisania.
|
||||
Porada: Jeśli chcesz zobaczyć pliki .*, zmień ustawienie w menu Konfiguracja...
|
||||
Porada: Jeśli chcesz zobaczyć pliki .*~, zmień ustawienie w menu Konfiguracja...
|
||||
Porada: Uzupełnianie działa wszędzie. Po prostu naciśnij M-Tab.
|
||||
Porada: Jeśli masz powolny terminal, spróbuj użyć opcji -s.
|
||||
Porada: Znajdź plik: na znalezionych plikach wykonujemy operacje poprzez Filtruj.
|
||||
Porada: Chcesz użyć złożonego wyszukiwania? Użyj polecenia Filtr zewnętrzny.
|
||||
Porada: Jeśli chcesz szybciej zmieniać ścieżkę, użyj M-c (szybka zmiana katalogu).
|
||||
Porada: Polecenia powłoki działają tylko w lokalnym systemie plików.
|
||||
Porada: Przywróć skasowany tekst za pomocą C-y.
|
||||
Porada: Niektóre klawisze nie działają? Patrz menu Opcje|Definiuj klawisze...
|
||||
Porada: Aby obejrzeć wyjście polecenia w przeglądarce użyj M-!
|
||||
Porada: F13 (lub Shift-F3) wywołuje przeglądarkę w trybie surowym.
|
||||
Porada: Możesz określić edytor pod F4 przez zmienną powłoki EDITOR.
|
||||
Porada: Możesz określić zewnętrzną przeglądarkę przez zmienną powłoki PAGER.
|
||||
Porada: Możesz wyłączyć żądania potwierdzenia przez menu Opcje|Potwierdzanie...
|
||||
Porada: Przejdź do listy najczęściej używanych katalogów przez C-\.
|
||||
Porada: Z anonimowego FTP korzystamy pisząc 'cd /#ftp:machine.edu'
|
||||
Porada: MC ma wbudowaną obsługę FTP; patrz menu Plik, Połączenie FTP...
|
||||
Porada: M-t przełącza tryby wyświetlania listy plików.
|
||||
Porada: Użytkownika FTP określamy przez: 'cd /#ftp:user@machine.edu'
|
||||
Porada: Pakiety RPM przeglądamy naciskając na nich Enter.
|
||||
Porada: Aby zazanaczyć katalogi w oknie dialogowym zaznaczania dodaj ukośnik.
|
||||
Porada: Używanie kopiowania i wklejania za pomocą myszy może wymagać Shifta.
|
||||
Porada: Klawiszem C-\ dopisz do podręcznej listy często odwiedzane zasoby FTP.
|
||||
Porada: Dostęp do zwykłej powłoki przez C-o. Powrót do MC przez ponowne C-o.
|
||||
Porada: Ustawienie zmiennej CDPATH może ci zaoszczędzić pisania.
|
||||
Porada: Jeśli chcesz zobaczyć pliki .*, zmień ustawienie w menu Konfiguracja...
|
||||
Porada: Jeśli chcesz zobaczyć pliki .*~, zmień ustawienie w menu Konfiguracja...
|
||||
Porada: Uzupełnianie działa wszędzie. Po prostu naciśnij M-Tab.
|
||||
Porada: Jeśli masz powolny terminal, spróbuj użyć opcji -s.
|
||||
Porada: Znajdź plik: na znalezionych plikach wykonujemy operacje poprzez Filtruj.
|
||||
Porada: Chcesz użyć złożonego wyszukiwania? Użyj polecenia Filtr zewnętrzny.
|
||||
Porada: Jeśli chcesz szybciej zmieniać ścieżkę, użyj M-c (szybka zmiana katalogu).
|
||||
Porada: Polecenia powłoki działają tylko w lokalnym systemie plików.
|
||||
Porada: Przywróć skasowany tekst za pomocą C-y.
|
||||
Porada: Niektóre klawisze nie działają? Patrz menu Opcje|Definiuj klawisze...
|
||||
Porada: Aby obejrzeć wyjście polecenia w przeglądarce użyj M-!
|
||||
Porada: F13 (lub Shift-F3) wywołuje przeglądarkę w trybie surowym.
|
||||
Porada: Możesz określić edytor pod F4 przez zmienną powłoki EDITOR.
|
||||
Porada: Możesz określić zewnętrzną przeglądarkę przez zmienną powłoki PAGER.
|
||||
Porada: Możesz wyłączyć żądania potwierdzenia przez menu Opcje|Potwierdzanie...
|
||||
Porada: Przejdź do listy najczęściej używanych katalogów przez C-\.
|
||||
Porada: Z anonimowego FTP korzystamy pisząc 'cd /#ftp:machine.edu'
|
||||
Porada: MC ma wbudowaną obsługę FTP; patrz menu Plik, Połączenie FTP...
|
||||
Porada: M-t przełącza tryby wyświetlania listy plików.
|
||||
Porada: Użytkownika FTP określamy przez: 'cd /#ftp:user@machine.edu'
|
||||
Porada: Pakiety RPM przeglądamy naciskając na nich Enter.
|
||||
Porada: Aby zazanaczyć katalogi w oknie dialogowym zaznaczania dodaj ukośnik.
|
||||
Porada: Używanie kopiowania i wklejania za pomocą myszy może wymagać Shifta.
|
||||
Porada: Klawiszem C-\ dopisz do podręcznej listy często odwiedzane zasoby FTP.
|
||||
|
@ -1,44 +1,44 @@
|
||||
Совет: Используйте C-x t для копирования помеченных файлов в командную строку.
|
||||
Совет: Используйте C-x p для копирования текущего пути в командную строку.
|
||||
Совет: Автодополнение: M-Tab (или Esc+Tab). Для получения списка нажать дважды.
|
||||
Совет: Используйте M-p и M-n для доступа к истории команд.
|
||||
Совет: Требуется вставить литерал? Нажмите Control-q и литерал.
|
||||
Совет: Устали от этих сообщений? Отключите их в меню Настройки/Внешний вид.
|
||||
Совет: Отметка каталогов: добавьте косую черту в конец соответствующего шаблона.
|
||||
Совет: Если ваш терминал без функц. клавиш, вам поможет ESC + цифра.
|
||||
Совет: Домашняя страница Midnight Commander: http://www.midnight-commander.org/
|
||||
Совет: Пожалуйста, шлите любые сообщения об ошибках на mc-devel@gnome.org
|
||||
Совет: Tab сменяет текущую панель.
|
||||
Совет: Удобство ВФС: нажать Enter на файле TAR для получения его содержимого.
|
||||
Совет: У нас также имеется толковая страница руководства.
|
||||
Совет: Вы хотите навигацию в стиле lynx? Установите это в диалоге Конфигурация.
|
||||
Совет: Макросы % работают даже в командной строке.
|
||||
Совет: M-! позволит вам выполнять программы и видеть вывод в просмотрщике.
|
||||
Совет: Формат списка файлов может быть изменен; наберите "man mc" для деталей.
|
||||
Совет: %D/%T expands to the tagged files in the opposite directory.
|
||||
Совет: Хотите простую оболочку? Нажмите C-o, и снова C-o для возврата в МС.
|
||||
Совет: Установив переменную CDPATH, вы сбережете усилия при наборе команды cd.
|
||||
Совет: Вы сможете видеть скрытые файлы .*, установив опцию в меню Конфигурация.
|
||||
Совет: Хотите видеть резервные файлы .~ - установите опцию в меню Конфигурация.
|
||||
Совет: Автодополнение работает во всех строках ввода. Просто нажмите M-Tab.
|
||||
Совет: На медленных терминалах может помочь флаг -s.
|
||||
Совет: Поиск файла: вы можете работать с найденными файлами при Панелизации.
|
||||
Совет: Want to do complex searches? Use the External Panelize command.
|
||||
Совет: Для смены каталога во время набора команды, нажмите M-c (быстрая смена).
|
||||
Заметка: Команды оболочки не выполняются, если вы не в локальной файл. системе.
|
||||
Совет: Удаленный текст можно вернуть с помощью C-y.
|
||||
Совет: Некоторые клавиши не работают? Зайдите в Настройки/Распознавание клавиш.
|
||||
Совет: Для получения вывода команды в окне просмотра, наберите M-!
|
||||
Совет: F13 (или Shift-F3) вызывают просмотрщик в режиме необработанных данных.
|
||||
Совет: Вы можете выбрать редактор для F4 с помощью переменной оболочки EDITOR.
|
||||
Совет: Внешний просмотрщик можно выбрать с помощью переменной оболочки PAGER.
|
||||
Совет: Вы можете отменить запросы на подтверждение в Настройки/Подтверждение.
|
||||
Совет: Переходите к часто используемым каталогам из справочника, набрав C-\.
|
||||
Совет: Вы можете использовать анонимный FTP с mc набрав 'cd /#ftp:machine.edu'
|
||||
Совет: FTP встроен в Midnight Commander, меню Панель/FTP-соединение.
|
||||
Совет: M-t быстро изменяет формат списка панели.
|
||||
Совет: Вы можете задать имя пользователя в команде: 'cd /#ftp:user@machine.edu'.
|
||||
Совет: Вы можете просматривать файлы RPM нажав Enter на файле RPM.
|
||||
Совет: Для отметки каталогов в диалоге выбора, добавьте косую черту.
|
||||
Совет: Вырезание и вставка с помощью мыши может требовать держать клавишу Shift.
|
||||
Совет: Храните список часто посещаемых FTP в справочнике каталогов: нажмите C-\.
|
||||
Совет: Используйте C-x t для копирования помеченных файлов в командную строку.
|
||||
Совет: Используйте C-x p для копирования текущего пути в командную строку.
|
||||
Совет: Автодополнение: M-Tab (или Esc+Tab). Для получения списка нажать дважды.
|
||||
Совет: Используйте M-p и M-n для доступа к истории команд.
|
||||
Совет: Требуется вставить литерал? Нажмите Control-q и литерал.
|
||||
Совет: Устали от этих сообщений? Отключите их в меню Настройки/Внешний вид.
|
||||
Совет: Отметка каталогов: добавьте косую черту в конец соответствующего шаблона.
|
||||
Совет: Если ваш терминал без функц. клавиш, вам поможет ESC + цифра.
|
||||
Совет: Домашняя страница Midnight Commander: http://www.midnight-commander.org/
|
||||
Совет: Пожалуйста, шлите любые сообщения об ошибках на mc-devel@gnome.org
|
||||
Совет: Tab сменяет текущую панель.
|
||||
Совет: Удобство ВФС: нажать Enter на файле TAR для получения его содержимого.
|
||||
Совет: У нас также имеется толковая страница руководства.
|
||||
Совет: Вы хотите навигацию в стиле lynx? Установите это в диалоге Конфигурация.
|
||||
Совет: Макросы % работают даже в командной строке.
|
||||
Совет: M-! позволит вам выполнять программы и видеть вывод в просмотрщике.
|
||||
Совет: Формат списка файлов может быть изменен; наберите "man mc" для деталей.
|
||||
Совет: %D/%T expands to the tagged files in the opposite directory.
|
||||
Совет: Хотите простую оболочку? Нажмите C-o, и снова C-o для возврата в МС.
|
||||
Совет: Установив переменную CDPATH, вы сбережете усилия при наборе команды cd.
|
||||
Совет: Вы сможете видеть скрытые файлы .*, установив опцию в меню Конфигурация.
|
||||
Совет: Хотите видеть резервные файлы .~ - установите опцию в меню Конфигурация.
|
||||
Совет: Автодополнение работает во всех строках ввода. Просто нажмите M-Tab.
|
||||
Совет: На медленных терминалах может помочь флаг -s.
|
||||
Совет: Поиск файла: вы можете работать с найденными файлами при Панелизации.
|
||||
Совет: Want to do complex searches? Use the External Panelize command.
|
||||
Совет: Для смены каталога во время набора команды, нажмите M-c (быстрая смена).
|
||||
Заметка: Команды оболочки не выполняются, если вы не в локальной файл. системе.
|
||||
Совет: Удаленный текст можно вернуть с помощью C-y.
|
||||
Совет: Некоторые клавиши не работают? Зайдите в Настройки/Распознавание клавиш.
|
||||
Совет: Для получения вывода команды в окне просмотра, наберите M-!
|
||||
Совет: F13 (или Shift-F3) вызывают просмотрщик в режиме необработанных данных.
|
||||
Совет: Вы можете выбрать редактор для F4 с помощью переменной оболочки EDITOR.
|
||||
Совет: Внешний просмотрщик можно выбрать с помощью переменной оболочки PAGER.
|
||||
Совет: Вы можете отменить запросы на подтверждение в Настройки/Подтверждение.
|
||||
Совет: Переходите к часто используемым каталогам из справочника, набрав C-\.
|
||||
Совет: Вы можете использовать анонимный FTP с mc набрав 'cd /#ftp:machine.edu'
|
||||
Совет: FTP встроен в Midnight Commander, меню Панель/FTP-соединение.
|
||||
Совет: M-t быстро изменяет формат списка панели.
|
||||
Совет: Вы можете задать имя пользователя в команде: 'cd /#ftp:user@machine.edu'.
|
||||
Совет: Вы можете просматривать файлы RPM нажав Enter на файле RPM.
|
||||
Совет: Для отметки каталогов в диалоге выбора, добавьте косую черту.
|
||||
Совет: Вырезание и вставка с помощью мыши может требовать держать клавишу Shift.
|
||||
Совет: Храните список часто посещаемых FTP в справочнике каталогов: нажмите C-\.
|
||||
|
@ -1,44 +1,44 @@
|
||||
Савет: Користите C-x t да бисте пренели изабране називе датотека у наредбени ред.
|
||||
Савет: Користите C-x p да бисте пренели текућу путању у наредбени ред.
|
||||
Савет: Допуна: користите M-Tab (или Esc+Tab). Притисните ово двапут да бисте добили списак.
|
||||
Савет: Користите M-p и M-n да бисте добили историју наредби.
|
||||
Савет: Хоћете да наведете знак? Користите Control-q и дотични знак.
|
||||
Савет: Сити сте ових порука? Искључите их из менија Избори/Поглед.
|
||||
Савет: Означавање директоријума: додајте косу црту на крај обрасца за претрагу.
|
||||
Савет: Ако ваш терминал не поседује функцијске тастере, користите комбинацију ESC+број.
|
||||
Савет: Домаћа страница ГНУ-овог Поноћног наредника: http://www.midnight-commander.org/
|
||||
Савет: Молимо да пошаљете пријаве грешака на mc-devel@gnome.org
|
||||
Савет: Тастер `Tab' мења текуће окно.
|
||||
Савет: Фазон ВСД-а: куцните `enter' над датотеком врсте tar да бисте прегледали њен садржај.
|
||||
Савет: Имамо и пристојну страницу упутства.
|
||||
Савет: Желите ли lynx-олико кретање? Подесите га у дијалогу Подешавања.
|
||||
Савет: Макрои `%' функционишу чак и у наредбеном реду.
|
||||
Савет: M-! ће вам омогућити да извршавате програме и прегледате излаз у прегледачу.
|
||||
Савет: Формат списка датотека се може подесити; извршите `man mc' за детаље.
|
||||
Савет: %D/%T се замењује списком означених датотека у супротном директоријуму.
|
||||
Савет: Желите ли вашу обичну љуску? Притисните C-o, а вратите се назад опет преко C-o.
|
||||
Савет: Постављање променљиве CDPATH вам може уштедети куцање у наредбама `cd'.
|
||||
Савет: Ако желите да видите ваше датотеке врсте `.*', реците то у дијалогу `Подешавање'.
|
||||
Савет: Желите ли да видите ваше резервне датотеке (*~)? Поставите ово у дијалогу `Подешавање'.
|
||||
Савет: Допуна функционише у свим редовима за унос у свим дијалозима. Само притисните M-Tab.
|
||||
Савет: на спорим терминалима може вам помоћи прекидач -s.
|
||||
Савет: Тражење датотека: можете радити са нађеним датотекама преко дугмета `Претвори у окно'.
|
||||
Савет: Желите ли сложене претраге? Користите наредбу `Критеријум попуне окна'.
|
||||
Савет: Да бисте променили директоријум у сред куцања наредбе, користите M-c (брза пром.дир.).
|
||||
Пажња: Наредбе љуске неће функционисати на не-локалном систему датотека.
|
||||
Савет: Васкрсните текст преко C-y.
|
||||
Савет: Неки од ваших тастера не функционишу? Погледајте Избори/Научи тастере.
|
||||
Савет: Да бисте погледали излаз наредбе у прегледачу, користите M-!
|
||||
Савет: F13 (или Shift-F3) покреће прегледач у сировом режиму.
|
||||
Савет: Можете задати уређивач за F4 преко променљиве љуске EDITOR.
|
||||
Савет: Можете задати спољашњи уређивач преко променљиве љуске PAGER.
|
||||
Савет: Можете искључити све захтеве за потврду преко ставке Избори/Потврда.
|
||||
Савет: Скочите на често коришћене директоријуме једним кораком преко C-\.
|
||||
Савет: Можете се анонимно пријавити на FTP куцајући `cd /#ftp:machine.edu'
|
||||
Савет: FTP је уграђен у Поноћног наредника, погледајте мени Лево/Повезивање FTP-а.
|
||||
Савет: M-t брзо мења режим списка.
|
||||
Савет: Можете задати корисничко име за ftps: `cd /#ftp:user@machine.edu'
|
||||
Савет: Можете прегледати датотеке врсте RPM куцнувши `enter' над датотеком врсте `rpm'.
|
||||
Савет: Да бисте означили директоријуме у дијалогу за избор, додајте косу црту.
|
||||
Савет: Да бисте исецали и лепили помоћу миша, можда ће бити потребно да држите тастер `shift'
|
||||
Савет: Укуцајте често посећивана места ftp-а у брзи списак: притисните C-\.
|
||||
Савет: Користите C-x t да бисте пренели изабране називе датотека у наредбени ред.
|
||||
Савет: Користите C-x p да бисте пренели текућу путању у наредбени ред.
|
||||
Савет: Допуна: користите M-Tab (или Esc+Tab). Притисните ово двапут да бисте добили списак.
|
||||
Савет: Користите M-p и M-n да бисте добили историју наредби.
|
||||
Савет: Хоћете да наведете знак? Користите Control-q и дотични знак.
|
||||
Савет: Сити сте ових порука? Искључите их из менија Избори/Поглед.
|
||||
Савет: Означавање директоријума: додајте косу црту на крај обрасца за претрагу.
|
||||
Савет: Ако ваш терминал не поседује функцијске тастере, користите комбинацију ESC+број.
|
||||
Савет: Домаћа страница ГНУ-овог Поноћног наредника: http://www.midnight-commander.org/
|
||||
Савет: Молимо да пошаљете пријаве грешака на mc-devel@gnome.org
|
||||
Савет: Тастер `Tab' мења текуће окно.
|
||||
Савет: Фазон ВСД-а: куцните `enter' над датотеком врсте tar да бисте прегледали њен садржај.
|
||||
Савет: Имамо и пристојну страницу упутства.
|
||||
Савет: Желите ли lynx-олико кретање? Подесите га у дијалогу Подешавања.
|
||||
Савет: Макрои `%' функционишу чак и у наредбеном реду.
|
||||
Савет: M-! ће вам омогућити да извршавате програме и прегледате излаз у прегледачу.
|
||||
Савет: Формат списка датотека се може подесити; извршите `man mc' за детаље.
|
||||
Савет: %D/%T се замењује списком означених датотека у супротном директоријуму.
|
||||
Савет: Желите ли вашу обичну љуску? Притисните C-o, а вратите се назад опет преко C-o.
|
||||
Савет: Постављање променљиве CDPATH вам може уштедети куцање у наредбама `cd'.
|
||||
Савет: Ако желите да видите ваше датотеке врсте `.*', реците то у дијалогу `Подешавање'.
|
||||
Савет: Желите ли да видите ваше резервне датотеке (*~)? Поставите ово у дијалогу `Подешавање'.
|
||||
Савет: Допуна функционише у свим редовима за унос у свим дијалозима. Само притисните M-Tab.
|
||||
Савет: на спорим терминалима може вам помоћи прекидач -s.
|
||||
Савет: Тражење датотека: можете радити са нађеним датотекама преко дугмета `Претвори у окно'.
|
||||
Савет: Желите ли сложене претраге? Користите наредбу `Критеријум попуне окна'.
|
||||
Савет: Да бисте променили директоријум у сред куцања наредбе, користите M-c (брза пром.дир.).
|
||||
Пажња: Наредбе љуске неће функционисати на не-локалном систему датотека.
|
||||
Савет: Васкрсните текст преко C-y.
|
||||
Савет: Неки од ваших тастера не функционишу? Погледајте Избори/Научи тастере.
|
||||
Савет: Да бисте погледали излаз наредбе у прегледачу, користите M-!
|
||||
Савет: F13 (или Shift-F3) покреће прегледач у сировом режиму.
|
||||
Савет: Можете задати уређивач за F4 преко променљиве љуске EDITOR.
|
||||
Савет: Можете задати спољашњи уређивач преко променљиве љуске PAGER.
|
||||
Савет: Можете искључити све захтеве за потврду преко ставке Избори/Потврда.
|
||||
Савет: Скочите на често коришћене директоријуме једним кораком преко C-\.
|
||||
Савет: Можете се анонимно пријавити на FTP куцајући `cd /#ftp:machine.edu'
|
||||
Савет: FTP је уграђен у Поноћног наредника, погледајте мени Лево/Повезивање FTP-а.
|
||||
Савет: M-t брзо мења режим списка.
|
||||
Савет: Можете задати корисничко име за ftps: `cd /#ftp:user@machine.edu'
|
||||
Савет: Можете прегледати датотеке врсте RPM куцнувши `enter' над датотеком врсте `rpm'.
|
||||
Савет: Да бисте означили директоријуме у дијалогу за избор, додајте косу црту.
|
||||
Савет: Да бисте исецали и лепили помоћу миша, можда ће бити потребно да држите тастер `shift'
|
||||
Савет: Укуцајте често посећивана места ftp-а у брзи списак: притисните C-\.
|
||||
|
@ -1,45 +1,45 @@
|
||||
Порада: Користуйтесь C-x t для коп╕ювання позначених файл╕в у командний рядок.
|
||||
Порада: Користуйтесь C-x p для коп╕ювання поточного шляху в командний рядок.
|
||||
Порада: Автодоповнення: M-Tab (Esc+Tab). Для одержання списку натисн╕ть дв╕ч╕.
|
||||
Порада: Користуйтесь M-p ╕ M-n для доступу до ╕стор╕╖ команд.
|
||||
Порада: Потр╕бно вставити л╕терал? Натисн╕ть Control-q та л╕терал.
|
||||
Порада: Набридли ц╕ поради? В╕дключ╕ть ╖х у меню Options|Layout.
|
||||
Порада: В╕дм╕тка каталог╕в: додайте похилу риску в к╕нець в╕дпов╕дного шаблону.
|
||||
Порада: Якщо вашому терм╕налу браку╓ функц. клав╕ш, використовуйте ESC+цифра.
|
||||
Порада: Сайт Midnight Commander в ╤нтернет╕: http://www.midnight-commander.org/
|
||||
Порада: Домашня стор╕нка Midnight Commander: http://www.midnight-commander.org/
|
||||
Порада: Будь ласка, шл╕ть пов╕домлення про помилки на mc-devel@gnome.org
|
||||
Порада: Tab зм╕ню╓ поточну панель.
|
||||
Порада: Зручн╕сть ВФС: натисн╕ть Enter на файл╕ TAR для одержання його зм╕сту.
|
||||
Порада: У нас також ╓ непогана стор╕нка п╕дручника.
|
||||
Порада: Ви хочете нав╕гац╕ю в стил╕ lynx? Встанов╕ть це в Options|Configuration.
|
||||
Порада: Макроси % працюють нав╕ть у командному рядку.
|
||||
Порада: M-! дозволить виконати програму ╕ бачити результат у в╕кн╕ перегляду.
|
||||
Порада: Формат списку файл╕в може бути зм╕нений; набер╕ть "man mc" для деталей.
|
||||
Порада: %D/%T означа╓ позначен╕ файли на протилежн╕й панел╕.
|
||||
Порада: Бажа╓те звичайний shell? Натисн╕ть C-o, ╕ знову C-o для повернення в МС.
|
||||
Порада: Встановивши зм╕нну CDPATH, ви збережете зусилля при набор╕ команди cd.
|
||||
Порада: Щоб бачити прихован╕ файли .*, встанов╕ть опц╕ю в Options|Configuration.
|
||||
Порада: Щоб бачити резервн╕ файли .*~, встанов╕ть опц╕ю в Options|Configuration.
|
||||
Порада: Автодоповнення працю╓ у вс╕х рядках уведення. Просто натисн╕ть M-Tab.
|
||||
Порада: На пов╕льних терм╕налах може допомогти опц╕я -s.
|
||||
Порада: Пошук файлу: щоб працювати ╕з знайденими файлами, натисн╕ть Panelize.
|
||||
Порада: Бажа╓те виконати складний пошук? Скористайтеся Extermal Panelize.
|
||||
Порада: Для зм╕ни каталогу п╕д час набору команди, натисн╕ть M-c (швидка зм╕на).
|
||||
Порада: Команди shell не виконуються, якщо ви не в локальн╕й файлов╕й систем╕.
|
||||
Порада: Вилучений текст можна повернути за допомогою C-u.
|
||||
Порада: Деяк╕ клав╕ш╕ не працюють? Скористайтесь меню Options|Learn keys.
|
||||
Порада: Для одержання результату команди у в╕кн╕ перегляду, набер╕ть M-!
|
||||
Порада: F13 (або Shift-F3) викликають переглядач у режим╕ необроблених даних.
|
||||
Порада: Ви можете вибрати редактор для F4 за допомогою зм╕нно╖ оболонки EDITOR.
|
||||
Порада: Зовн╕шн╕й переглядач можна вибрати за допомогою зм╕нно╖ оболонки PAGER.
|
||||
Порада: Ви можете скасувати запити на п╕дтвердження в Options|Confirmation.
|
||||
Порада: Переходьте до часто використовуваних каталог╕в набравши C-\.
|
||||
Порада: Анон╕мний FTP можна виконати з mc набравши 'cd /#ftp:machine.edu'
|
||||
Порада: FTP вбудований у Midnight Commander, меню Панель/FTP-з'╓днання.
|
||||
Порада: M-t швидко зм╕ню╓ формат списку панел╕.
|
||||
Порада: Ви можете задати ╕м'я користувача ftpfs: 'cd /#ftp:user@machine.edu'.
|
||||
Порада: Файли RPM можна переглядати натиснувши Enter на файл╕ RPM.
|
||||
Порада: Для в╕дм╕тки каталог╕в у д╕алоговому в╕кн╕ вибору, додайте похилу риску.
|
||||
Порада: Для вир╕зання ╕ вставки за допомогою миш╕ тримайте клав╕шу Shift.
|
||||
Порада: Збер╕гайте часто в╕дв╕дуван╕ FTP у списку каталог╕в: натисн╕ть C-\.
|
||||
Порада: Користуйтесь C-x t для копіювання позначених файлів у командний рядок.
|
||||
Порада: Користуйтесь C-x p для копіювання поточного шляху в командний рядок.
|
||||
Порада: Автодоповнення: M-Tab (Esc+Tab). Для одержання списку натисніть двічі.
|
||||
Порада: Користуйтесь M-p і M-n для доступу до історії команд.
|
||||
Порада: Потрібно вставити літерал? Натисніть Control-q та літерал.
|
||||
Порада: Набридли ці поради? Відключіть їх у меню Options|Layout.
|
||||
Порада: Відмітка каталогів: додайте похилу риску в кінець відповідного шаблону.
|
||||
Порада: Якщо вашому терміналу бракує функц. клавіш, використовуйте ESC+цифра.
|
||||
Порада: Сайт Midnight Commander в Інтернеті: http://www.midnight-commander.org/
|
||||
Порада: Домашня сторінка Midnight Commander: http://www.midnight-commander.org/
|
||||
Порада: Будь ласка, шліть повідомлення про помилки на mc-devel@gnome.org
|
||||
Порада: Tab змінює поточну панель.
|
||||
Порада: Зручність ВФС: натисніть Enter на файлі TAR для одержання його змісту.
|
||||
Порада: У нас також є непогана сторінка підручника.
|
||||
Порада: Ви хочете навігацію в стилі lynx? Встановіть це в Options|Configuration.
|
||||
Порада: Макроси % працюють навіть у командному рядку.
|
||||
Порада: M-! дозволить виконати програму і бачити результат у вікні перегляду.
|
||||
Порада: Формат списку файлів може бути змінений; наберіть "man mc" для деталей.
|
||||
Порада: %D/%T означає позначені файли на протилежній панелі.
|
||||
Порада: Бажаєте звичайний shell? Натисніть C-o, і знову C-o для повернення в МС.
|
||||
Порада: Встановивши змінну CDPATH, ви збережете зусилля при наборі команди cd.
|
||||
Порада: Щоб бачити приховані файли .*, встановіть опцію в Options|Configuration.
|
||||
Порада: Щоб бачити резервні файли .*~, встановіть опцію в Options|Configuration.
|
||||
Порада: Автодоповнення працює у всіх рядках уведення. Просто натисніть M-Tab.
|
||||
Порада: На повільних терміналах може допомогти опція -s.
|
||||
Порада: Пошук файлу: щоб працювати із знайденими файлами, натисніть Panelize.
|
||||
Порада: Бажаєте виконати складний пошук? Скористайтеся Extermal Panelize.
|
||||
Порада: Для зміни каталогу під час набору команди, натисніть M-c (швидка зміна).
|
||||
Порада: Команди shell не виконуються, якщо ви не в локальній файловій системі.
|
||||
Порада: Вилучений текст можна повернути за допомогою C-u.
|
||||
Порада: Деякі клавіші не працюють? Скористайтесь меню Options|Learn keys.
|
||||
Порада: Для одержання результату команди у вікні перегляду, наберіть M-!
|
||||
Порада: F13 (або Shift-F3) викликають переглядач у режимі необроблених даних.
|
||||
Порада: Ви можете вибрати редактор для F4 за допомогою змінної оболонки EDITOR.
|
||||
Порада: Зовнішній переглядач можна вибрати за допомогою змінної оболонки PAGER.
|
||||
Порада: Ви можете скасувати запити на підтвердження в Options|Confirmation.
|
||||
Порада: Переходьте до часто використовуваних каталогів набравши C-\.
|
||||
Порада: Анонімний FTP можна виконати з mc набравши 'cd /#ftp:machine.edu'
|
||||
Порада: FTP вбудований у Midnight Commander, меню Панель/FTP-з'єднання.
|
||||
Порада: M-t швидко змінює формат списку панелі.
|
||||
Порада: Ви можете задати ім'я користувача ftpfs: 'cd /#ftp:user@machine.edu'.
|
||||
Порада: Файли RPM можна переглядати натиснувши Enter на файлі RPM.
|
||||
Порада: Для відмітки каталогів у діалоговому вікні вибору, додайте похилу риску.
|
||||
Порада: Для вирізання і вставки за допомогою миші тримайте клавішу Shift.
|
||||
Порада: Зберігайте часто відвідувані FTP у списку каталогів: натисніть C-\.
|
||||
|
@ -1,45 +1,45 @@
|
||||
提示:使用 C-x t 來複製已選擇的檔案名稱到指令列。
|
||||
提示:使用 C-x p 來將目前的路徑名稱複製到指令列。
|
||||
提示:補齊:使用 M-Tab(或 Esc+Tab)。按兩次看整個列表。
|
||||
提示:使用 M-p 和 M-n 來存取指令使用紀錄。
|
||||
提示:要使用跳出字元(escape cahracter)?可使用 Control-q 再加上要輸入的字元。
|
||||
提示:是否對這些訊息厭倦了?可在「選項/配置」選單中關閉它。
|
||||
提示:選擇目錄:在要找尋的樣式後加入 "/"。
|
||||
提示:如果你的終端機沒有功能鍵,可以使用 ESC + 數字按鍵。
|
||||
提示:Midnight Commander URL:http://www.midnight-commander.org/
|
||||
提示:Midnight Commander 網頁:http://www.midnight-commander.org/
|
||||
提示:請送出錯誤報告到 mc-devel@gnome.org
|
||||
提示:Tab 會切換使用中的面板。
|
||||
提示:VFS 的好處:在 tar 檔案上按 enter 可查看它的內容。
|
||||
提示:我們有一個不錯的手冊頁。
|
||||
提示:你是否想使用 lynx 的瀏覽方式?請到設定對話窗中設定。
|
||||
提示:% 巨集在指令列也可使用。
|
||||
提示:M-! 可讓你執行指令並在檢視器看到它的輸出。
|
||||
提示:你可自訂檔案列表的格式;輸入 "man mc" 可獲得更多細節。
|
||||
提示:%D/%T 會擴展成另一邊面板中已標記的檔案。
|
||||
提示:想使用平常的命令殼?可按 C-o,再按一次就會返回 MC。
|
||||
提示:設定 CDPATH 環境變數可以令使用 cd 指令時省卻一點按鍵。
|
||||
提示:若想看你的 .* 檔案,請到設定對話窗中設定。
|
||||
提示:想看你的 *~ 備份檔?請到設定對話窗中設定。
|
||||
提示:補齊可在任何對話窗中的任何輸入欄位中使用。只要按下 M-Tab 就可以了。
|
||||
提示:在緩慢的終端機裡使用 -s 選項或會有幫助。
|
||||
提示:搜尋檔案:你可以使用「面板化」選項來處理搜尋到的檔案。
|
||||
提示:想處理較複雜的檔案搜尋?可使用「外部面板化」指令。
|
||||
提示:要在輸入指令途早改變目錄,可使用 M-c(快速切換目錄)。
|
||||
注意:在非本機的檔案系統裡無法使用命令殼指令。
|
||||
提示:可用 C-y 將已刪除的文字重新顯示出來。
|
||||
提示:是否有些按鍵無法使用?可看看「選項/認識按鍵」中的按鍵。
|
||||
提示:要在檢視器裡看到指令的輸出,使用 M-!
|
||||
提示:F13(或 Shift-F3)會使用原始模式開啟檢視器。
|
||||
提示:你可以使用環境變數 EDITOR 來指定按下 F4 後開啟的編輯器。
|
||||
提示:你可以使用環境變數 PAGER 來指定外部的檢視器。
|
||||
提示:你可以在「選項/確認」裡關閉所有確認的要求。
|
||||
提示:使用 C-\ 可以即時跳到經常使用的目錄。
|
||||
提示:你可以在 mc 使用無名氏模式 FTP,方法是輸入 'cd /#ftp:machine.edu'
|
||||
提示:FTP 是 Midnight Commander 的內建功能,請檢查「檔案/FTP 連線」選單。
|
||||
提示:M-t 可快速地切換列表模式。
|
||||
提示:你可以在使用 ftp 時指定使用者名稱,例如:'cd /#ftp:user@machine.edu'
|
||||
提示:你可以在 rpm 檔上按 enter 來瀏覽 rpm 裡的檔案。
|
||||
提示:在選擇對話盒中選取目錄時,要在後面加一 "/"。
|
||||
提示:要使用滑鼠剪貼功能需要你按下 shift 鍵
|
||||
提示:要將常到的網站輸入常用列表裡:鍵入 C-\。
|
||||
提示:使用 C-x t 來複製已選擇的檔案名稱到指令列。
|
||||
提示:使用 C-x p 來將目前的路徑名稱複製到指令列。
|
||||
提示:補齊:使用 M-Tab(或 Esc+Tab)。按兩次看整個列表。
|
||||
提示:使用 M-p 和 M-n 來存取指令使用紀錄。
|
||||
提示:要使用跳出字元(escape cahracter)?可使用 Control-q 再加上要輸入的字元。
|
||||
提示:是否對這些訊息厭倦了?可在「選項/配置」選單中關閉它。
|
||||
提示:選擇目錄:在要找尋的樣式後加入 "/"。
|
||||
提示:如果你的終端機沒有功能鍵,可以使用 ESC + 數字按鍵。
|
||||
提示:Midnight Commander URL:http://www.midnight-commander.org/
|
||||
提示:Midnight Commander 網頁:http://www.midnight-commander.org/
|
||||
提示:請送出錯誤報告到 mc-devel@gnome.org
|
||||
提示:Tab 會切換使用中的面板。
|
||||
提示:VFS 的好處:在 tar 檔案上按 enter 可查看它的內容。
|
||||
提示:我們有一個不錯的手冊頁。
|
||||
提示:你是否想使用 lynx 的瀏覽方式?請到設定對話窗中設定。
|
||||
提示:% 巨集在指令列也可使用。
|
||||
提示:M-! 可讓你執行指令並在檢視器看到它的輸出。
|
||||
提示:你可自訂檔案列表的格式;輸入 "man mc" 可獲得更多細節。
|
||||
提示:%D/%T 會擴展成另一邊面板中已標記的檔案。
|
||||
提示:想使用平常的命令殼?可按 C-o,再按一次就會返回 MC。
|
||||
提示:設定 CDPATH 環境變數可以令使用 cd 指令時省卻一點按鍵。
|
||||
提示:若想看你的 .* 檔案,請到設定對話窗中設定。
|
||||
提示:想看你的 *~ 備份檔?請到設定對話窗中設定。
|
||||
提示:補齊可在任何對話窗中的任何輸入欄位中使用。只要按下 M-Tab 就可以了。
|
||||
提示:在緩慢的終端機裡使用 -s 選項或會有幫助。
|
||||
提示:搜尋檔案:你可以使用「面板化」選項來處理搜尋到的檔案。
|
||||
提示:想處理較複雜的檔案搜尋?可使用「外部面板化」指令。
|
||||
提示:要在輸入指令途早改變目錄,可使用 M-c(快速切換目錄)。
|
||||
注意:在非本機的檔案系統裡無法使用命令殼指令。
|
||||
提示:可用 C-y 將已刪除的文字重新顯示出來。
|
||||
提示:是否有些按鍵無法使用?可看看「選項/認識按鍵」中的按鍵。
|
||||
提示:要在檢視器裡看到指令的輸出,使用 M-!
|
||||
提示:F13(或 Shift-F3)會使用原始模式開啟檢視器。
|
||||
提示:你可以使用環境變數 EDITOR 來指定按下 F4 後開啟的編輯器。
|
||||
提示:你可以使用環境變數 PAGER 來指定外部的檢視器。
|
||||
提示:你可以在「選項/確認」裡關閉所有確認的要求。
|
||||
提示:使用 C-\ 可以即時跳到經常使用的目錄。
|
||||
提示:你可以在 mc 使用無名氏模式 FTP,方法是輸入 'cd /#ftp:machine.edu'
|
||||
提示:FTP 是 Midnight Commander 的內建功能,請檢查「檔案/FTP 連線」選單。
|
||||
提示:M-t 可快速地切換列表模式。
|
||||
提示:你可以在使用 ftp 時指定使用者名稱,例如:'cd /#ftp:user@machine.edu'
|
||||
提示:你可以在 rpm 檔上按 enter 來瀏覽 rpm 裡的檔案。
|
||||
提示:在選擇對話盒中選取目錄時,要在後面加一 "/"。
|
||||
提示:要使用滑鼠剪貼功能需要你按下 shift 鍵
|
||||
提示:要將常到的網站輸入常用列表裡:鍵入 C-\。
|
||||
|
@ -59,7 +59,8 @@ SRCS = achown.c achown.h background.c background.h boxes.c boxes.h \
|
||||
tree.c tree.h treestore.c treestore.h timefmt.h tty.c tty.h user.c \
|
||||
user.h util.c util.h utilunix.c view.c view.h vfsdummy.h widget.c \
|
||||
widget.h win.c win.h wtools.c wtools.h unixcompat.h \
|
||||
x11conn.h x11conn.c ecs.h ecs.c
|
||||
x11conn.h x11conn.c ecs.h ecs.c \
|
||||
strutil.h strutil.c strutilascii.c strutil8bit.c strutilutf8.c
|
||||
|
||||
if CHARSET
|
||||
mc_SOURCES = $(SRCS) $(CHARSET_SRC)
|
||||
|
15
src/achown.c
15
src/achown.c
@ -35,6 +35,7 @@
|
||||
#include "widget.h"
|
||||
#include "wtools.h" /* For init_box_colors() */
|
||||
#include "key.h" /* XCTRL and ALT macros */
|
||||
#include "strutil.h"
|
||||
|
||||
#include "dir.h"
|
||||
#include "panel.h" /* Needed for the externs */
|
||||
@ -139,9 +140,9 @@ static void set_perm_by_flags (char *s, int f_p)
|
||||
|
||||
static void update_permissions (void)
|
||||
{
|
||||
set_perm_by_flags (b_att[0]->text, 0);
|
||||
set_perm_by_flags (b_att[1]->text, 3);
|
||||
set_perm_by_flags (b_att[2]->text, 6);
|
||||
set_perm_by_flags (b_att[0]->text.start, 0);
|
||||
set_perm_by_flags (b_att[1]->text.start, 3);
|
||||
set_perm_by_flags (b_att[2]->text.start, 6);
|
||||
}
|
||||
|
||||
static mode_t get_perm (char *s, int base)
|
||||
@ -373,7 +374,7 @@ static void chown_info_update (void)
|
||||
|
||||
/* name && mode */
|
||||
dlg_move (ch_dlg, 3, 8);
|
||||
tty_printf ("%s", name_trunc (fname, 45));
|
||||
addstr (str_fit_to_term (fname, 45, J_LEFT_FIT));
|
||||
dlg_move (ch_dlg, BY + 2, 9);
|
||||
tty_printf ("%12o", get_mode ());
|
||||
|
||||
@ -484,7 +485,7 @@ advanced_chown_callback (Dlg_head *h, dlg_msg_t msg, int parm)
|
||||
if (f_pos > 2)
|
||||
break;
|
||||
flag_pos = f_pos * 3 + i; /* (strchr(ch_perm,parm)-ch_perm); */
|
||||
if (((WButton *) h->current)->text[(flag_pos % 3)] ==
|
||||
if (((WButton *) h->current)->text.start[(flag_pos % 3)] ==
|
||||
'-')
|
||||
ch_flags[flag_pos] = '+';
|
||||
else
|
||||
@ -545,7 +546,7 @@ init_chown_advanced (void)
|
||||
int dx, cx;
|
||||
for (i = 0 ; i < n_elem ; i++) {
|
||||
chown_advanced_but[i].text = _(chown_advanced_but[i].text);
|
||||
i18n_len += strlen (chown_advanced_but[i].text) + 3;
|
||||
i18n_len += str_term_width1 (chown_advanced_but[i].text) + 3;
|
||||
if (DEFPUSH_BUTTON == chown_advanced_but[i].flags)
|
||||
i18n_len += 2; /* "<>" */
|
||||
}
|
||||
@ -554,7 +555,7 @@ init_chown_advanced (void)
|
||||
/* Reversed order */
|
||||
for (i = n_elem - 1; i >= 0; i--) {
|
||||
chown_advanced_but[i].x = cx;
|
||||
cx += strlen (chown_advanced_but[i].text) + 3 + dx;
|
||||
cx += str_term_width1 (chown_advanced_but[i].text) + 3 + dx;
|
||||
}
|
||||
}
|
||||
#endif /* ENABLE_NLS */
|
||||
|
55
src/boxes.c
55
src/boxes.c
@ -48,6 +48,7 @@
|
||||
#include "tree.h"
|
||||
#include "layout.h" /* for get_nth_panel_name proto */
|
||||
#include "background.h" /* task_list */
|
||||
#include "strutil.h"
|
||||
|
||||
#ifdef HAVE_CHARSET
|
||||
#include "charsets.h"
|
||||
@ -118,7 +119,7 @@ display_callback (struct Dlg_head *h, dlg_msg_t msg, int parm)
|
||||
}
|
||||
}
|
||||
|
||||
if (tolower (parm) == user_hotkey && dlg_widget_active (user)
|
||||
if (g_ascii_tolower (parm) == user_hotkey && dlg_widget_active (user)
|
||||
&& dlg_widget_active (status)) {
|
||||
my_radio->sel = 3;
|
||||
dlg_select_widget (my_radio); /* force redraw */
|
||||
@ -153,23 +154,23 @@ display_init (int radio_sel, char *init_text, int _check_status,
|
||||
display_title = _(display_title);
|
||||
for (i = 0; i < LIST_TYPES; i++) {
|
||||
displays[i] = _(displays[i]);
|
||||
if ((l = strlen (displays[i])) > maxlen)
|
||||
if ((l = str_term_width1 (displays[i])) > maxlen)
|
||||
maxlen = l;
|
||||
}
|
||||
|
||||
i = strlen (ok_button) + 5;
|
||||
l = strlen (cancel_button) + 3;
|
||||
i = str_term_width1 (ok_button) + 5;
|
||||
l = str_term_width1 (cancel_button) + 3;
|
||||
l = max (i, l);
|
||||
|
||||
i = maxlen + l + 16;
|
||||
if (i > DISPLAY_X)
|
||||
DISPLAY_X = i;
|
||||
|
||||
i = strlen (user_mini_status) + 13;
|
||||
i = str_term_width1 (user_mini_status) + 13;
|
||||
if (i > DISPLAY_X)
|
||||
DISPLAY_X = i;
|
||||
|
||||
i = strlen (display_title) + 10;
|
||||
i = str_term_width1 (display_title) + 10;
|
||||
if (i > DISPLAY_X)
|
||||
DISPLAY_X = i;
|
||||
|
||||
@ -178,7 +179,7 @@ display_init (int radio_sel, char *init_text, int _check_status,
|
||||
/* get hotkey of user-defined format string */
|
||||
cp = strchr (displays[USER_TYPE], '&');
|
||||
if (cp != NULL && *++cp != '\0')
|
||||
user_hotkey = tolower ((unsigned char) *cp);
|
||||
user_hotkey = g_ascii_tolower ((gchar) cp[0]);
|
||||
|
||||
i18n_displays_flag = 1;
|
||||
}
|
||||
@ -289,20 +290,20 @@ sort_box (sortfn *sort_fn, int *reverse, int *case_sensitive, int *exec_first)
|
||||
int maxlen = 0;
|
||||
for (i = SORT_TYPES - 1; i >= 0; i--) {
|
||||
sort_orders_names[i] = _(sort_orders[i].sort_name);
|
||||
r = strlen (sort_orders_names[i]);
|
||||
r = str_term_width1 (sort_orders_names[i]);
|
||||
if (r > maxlen)
|
||||
maxlen = r;
|
||||
}
|
||||
|
||||
check_pos = maxlen + 9;
|
||||
|
||||
r = strlen (reverse_label) + 4;
|
||||
i = strlen (case_label) + 4;
|
||||
r = str_term_width1 (reverse_label) + 4;
|
||||
i = str_term_width1 (case_label) + 4;
|
||||
if (i > r)
|
||||
r = i;
|
||||
|
||||
l = strlen (ok_button) + 6;
|
||||
i = strlen (cancel_button) + 4;
|
||||
l = str_term_width1 (ok_button) + 6;
|
||||
i = str_term_width1 (cancel_button) + 4;
|
||||
if (i > l)
|
||||
l = i;
|
||||
|
||||
@ -311,7 +312,7 @@ sort_box (sortfn *sort_fn, int *reverse, int *case_sensitive, int *exec_first)
|
||||
if (i > SORT_X)
|
||||
SORT_X = i;
|
||||
|
||||
i = strlen (sort_title) + 6;
|
||||
i = str_term_width1 (sort_title) + 6;
|
||||
if (i > SORT_X)
|
||||
SORT_X = i;
|
||||
|
||||
@ -412,7 +413,7 @@ confirm_box (void)
|
||||
while (i--)
|
||||
{
|
||||
conf_widgets [i].text = _(conf_widgets [i].text);
|
||||
l1 = strlen (conf_widgets [i].text) + 3;
|
||||
l1 = str_term_width1 (conf_widgets [i].text) + 3;
|
||||
if (l1 > maxlen)
|
||||
maxlen = l1;
|
||||
}
|
||||
@ -427,8 +428,8 @@ confirm_box (void)
|
||||
* And this for the case when buttons with some space to the right
|
||||
* do not fit within 2/6
|
||||
*/
|
||||
l1 = strlen (conf_widgets [0].text) + 3;
|
||||
i = strlen (conf_widgets [1].text) + 5;
|
||||
l1 = str_term_width1 (conf_widgets [0].text) + 3;
|
||||
i = str_term_width1 (conf_widgets [1].text) + 5;
|
||||
if (i > l1)
|
||||
l1 = i;
|
||||
|
||||
@ -501,11 +502,11 @@ display_bits_box (void)
|
||||
{
|
||||
display_widgets [i].text = _(display_widgets[i].text);
|
||||
display_bits_str [i] = _(display_bits_str [i]);
|
||||
l1 = strlen (display_bits_str [i]);
|
||||
l1 = str_term_width1 (display_bits_str [i]);
|
||||
if (l1 > maxlen)
|
||||
maxlen = l1;
|
||||
}
|
||||
l1 = strlen (display_widgets [2].text);
|
||||
l1 = str_term_width1 (display_widgets [2].text);
|
||||
if (l1 > maxlen)
|
||||
maxlen = l1;
|
||||
|
||||
@ -513,8 +514,8 @@ display_bits_box (void)
|
||||
display_bits.xlen = (maxlen + 5) * 6 / 4;
|
||||
|
||||
/* See above confirm_box */
|
||||
l1 = strlen (display_widgets [0].text) + 3;
|
||||
i = strlen (display_widgets [1].text) + 5;
|
||||
l1 = str_term_width1 (display_widgets [0].text) + 3;
|
||||
i = str_term_width1 (display_widgets [1].text) + 5;
|
||||
if (i > l1)
|
||||
l1 = i;
|
||||
|
||||
@ -609,7 +610,7 @@ init_disp_bits_box (void)
|
||||
|
||||
cpname = _("&Select");
|
||||
add_widget (dbits_dlg,
|
||||
button_new (4, DISPX - 8 - strlen (cpname), B_USER,
|
||||
button_new (4, DISPX - 8 - str_term_width1 (cpname), B_USER,
|
||||
NORMAL_BUTTON, cpname, sel_charset_button));
|
||||
|
||||
return dbits_dlg;
|
||||
@ -820,7 +821,7 @@ cd_dialog (void)
|
||||
quick_widgets [1].y_divisions =
|
||||
quick_widgets [0].y_divisions = Quick_input.ylen = 5;
|
||||
|
||||
len = strlen (quick_widgets [1].text);
|
||||
len = str_term_width1 (quick_widgets [1].text);
|
||||
|
||||
quick_widgets [0].relative_x =
|
||||
quick_widgets [1].relative_x + len + 1;
|
||||
@ -979,7 +980,7 @@ jobs_cmd (void)
|
||||
{
|
||||
job_buttons [i].name = _(job_buttons [i].name);
|
||||
|
||||
len = strlen (job_buttons [i].name) + 4;
|
||||
len = str_term_width1 (job_buttons [i].name) + 4;
|
||||
JOBS_X = max (JOBS_X, startx + len + 3);
|
||||
|
||||
job_buttons [i].xpos = startx;
|
||||
@ -988,7 +989,7 @@ jobs_cmd (void)
|
||||
|
||||
/* Last button - Ok a.k.a. Cancel :) */
|
||||
job_buttons [n_buttons - 1].xpos =
|
||||
JOBS_X - strlen (job_buttons [n_buttons - 1].name) - 7;
|
||||
JOBS_X - str_term_width1 (job_buttons [n_buttons - 1].name) - 7;
|
||||
|
||||
i18n_flag = 1;
|
||||
}
|
||||
@ -1046,7 +1047,7 @@ vfs_smb_get_authinfo (const char *host, const char *share, const char *domain,
|
||||
|
||||
while (i--)
|
||||
{
|
||||
l1 = strlen (labs [i] = _(labs [i]));
|
||||
l1 = str_term_width1 (labs [i] = _(labs [i]));
|
||||
if (l1 > maxlen)
|
||||
maxlen = l1;
|
||||
}
|
||||
@ -1056,7 +1057,7 @@ vfs_smb_get_authinfo (const char *host, const char *share, const char *domain,
|
||||
|
||||
for (i = sizeof(buts)/sizeof(buts[0]), l1 = 0; i--; )
|
||||
{
|
||||
l1 += strlen (buts [i] = _(buts [i]));
|
||||
l1 += str_term_width1 (buts [i] = _(buts [i]));
|
||||
}
|
||||
l1 += 15;
|
||||
if (l1 > dialog_x)
|
||||
@ -1065,7 +1066,7 @@ vfs_smb_get_authinfo (const char *host, const char *share, const char *domain,
|
||||
ilen = dialog_x - 7 - maxlen; /* for the case of very long buttons :) */
|
||||
istart = dialog_x - 3 - ilen;
|
||||
|
||||
b2 = dialog_x - (strlen(buts[1]) + 6);
|
||||
b2 = dialog_x - (str_term_width1 (buts[1]) + 6);
|
||||
|
||||
i18n_flag = 1;
|
||||
}
|
||||
|
@ -36,6 +36,7 @@
|
||||
#include "panel.h" /* do_file_mark() */
|
||||
#include "main.h" /* update_panels() */
|
||||
#include "chmod.h"
|
||||
#include "strutil.h"
|
||||
|
||||
static int single_set;
|
||||
|
||||
@ -296,11 +297,11 @@ void chmod_cmd (void)
|
||||
}
|
||||
|
||||
/* Set the labels */
|
||||
c_fname = name_trunc (fname, 21);
|
||||
c_fname = str_trunc (fname, 21);
|
||||
add_widget (ch_dlg, label_new (FY+2, FX+2, c_fname));
|
||||
c_fown = name_trunc (get_owner (sf_stat.st_uid), 21);
|
||||
c_fown = str_trunc (get_owner (sf_stat.st_uid), 21);
|
||||
add_widget (ch_dlg, label_new (FY+6, FX+2, c_fown));
|
||||
c_fgrp = name_trunc (get_group (sf_stat.st_gid), 21);
|
||||
c_fgrp = str_trunc (get_group (sf_stat.st_gid), 21);
|
||||
add_widget (ch_dlg, label_new (FY+8, FX+2, c_fgrp));
|
||||
g_snprintf (buffer, sizeof (buffer), "%o", c_stat);
|
||||
statl = label_new (FY+4, FX+2, buffer);
|
||||
|
@ -33,6 +33,7 @@
|
||||
#include "color.h"
|
||||
#include "dialog.h"
|
||||
#include "widget.h"
|
||||
#include "strutil.h"
|
||||
|
||||
/* Needed for the extern declarations of integer parameters */
|
||||
#include "dir.h"
|
||||
@ -268,9 +269,9 @@ chown_cmd (void)
|
||||
if (fe)
|
||||
listbox_select_entry (l_group, fe);
|
||||
|
||||
chown_label (0, name_trunc (fname, 15));
|
||||
chown_label (1, name_trunc (get_owner (sf_stat.st_uid), 15));
|
||||
chown_label (2, name_trunc (get_group (sf_stat.st_gid), 15));
|
||||
chown_label (0, str_trunc (fname, 15));
|
||||
chown_label (1, str_trunc (get_owner (sf_stat.st_uid), 15));
|
||||
chown_label (2, str_trunc (get_group (sf_stat.st_gid), 15));
|
||||
size_trunc_len (buffer, 15, sf_stat.st_size, 0);
|
||||
chown_label (3, buffer);
|
||||
chown_label (4, string_perm (sf_stat.st_mode));
|
||||
|
83
src/cmd.c
83
src/cmd.c
@ -62,6 +62,7 @@
|
||||
#include "profile.h" /* PROFILE_NAME */
|
||||
#include "execute.h" /* toggle_panels() */
|
||||
#include "history.h"
|
||||
#include "strutil.h"
|
||||
|
||||
#ifndef MAP_FILE
|
||||
# define MAP_FILE 0
|
||||
@ -431,7 +432,7 @@ set_panel_filter (WPanel *p)
|
||||
{
|
||||
char *reg_exp;
|
||||
const char *x;
|
||||
|
||||
|
||||
x = p->filter ? p->filter : easy_patterns ? "*" : ".";
|
||||
|
||||
reg_exp = input_dialog_help (_(" Filter "),
|
||||
@ -916,7 +917,7 @@ do_link (int symbolic_link, const char *fname)
|
||||
char *dest = NULL, *src = NULL;
|
||||
|
||||
if (!symbolic_link) {
|
||||
src = g_strdup_printf (_("Link %s to:"), name_trunc (fname, 46));
|
||||
src = g_strdup_printf (_("Link %s to:"), str_trunc (fname, 46));
|
||||
dest = input_expand_dialog (_(" Link "), src, MC_HISTORY_FM_LINK, "");
|
||||
if (!dest || !*dest)
|
||||
goto cleanup;
|
||||
@ -981,7 +982,7 @@ void edit_symlink_cmd (void)
|
||||
|
||||
p = selection (current_panel)->fname;
|
||||
|
||||
q = g_strdup_printf (_(" Symlink `%s\' points to: "), name_trunc (p, 32));
|
||||
q = g_strdup_printf (_(" Symlink `%s\' points to: "), str_trunc (p, 32));
|
||||
|
||||
i = readlink (p, buffer, MC_MAXPATHLEN - 1);
|
||||
if (i > 0) {
|
||||
@ -1062,11 +1063,13 @@ char *guess_message_value (void)
|
||||
char *
|
||||
get_random_hint (int force)
|
||||
{
|
||||
char *data, *result, *eol;
|
||||
char *data, *result = NULL, *eol;
|
||||
int len;
|
||||
int start;
|
||||
static int last_sec;
|
||||
static struct timeval tv;
|
||||
str_conv_t conv;
|
||||
struct str_buffer *buffer;
|
||||
|
||||
/* Do not change hints more often than one minute */
|
||||
gettimeofday (&tv, NULL);
|
||||
@ -1092,7 +1095,20 @@ get_random_hint (int force)
|
||||
eol = strchr (&data[start], '\n');
|
||||
if (eol)
|
||||
*eol = 0;
|
||||
result = g_strdup (&data[start]);
|
||||
|
||||
/* hint files are stored in utf-8 */
|
||||
/* try convert hint file from utf-8 to terminal encoding */
|
||||
conv = str_crt_conv_from ("UTF-8");
|
||||
if (conv != INVALID_CONV) {
|
||||
buffer = str_get_buffer ();
|
||||
if (str_convert (conv, &data[start], buffer) != ESTR_FAILURE) {
|
||||
result = g_strdup (buffer->data);
|
||||
}
|
||||
|
||||
str_release_buffer (buffer);
|
||||
str_close_conv (conv);
|
||||
}
|
||||
|
||||
g_free (data);
|
||||
return result;
|
||||
}
|
||||
@ -1369,3 +1385,60 @@ toggle_listing_cmd (void)
|
||||
set_basic_panel_listing_to (current, (p->list_type + 1) % LIST_TYPES);
|
||||
}
|
||||
|
||||
/* add "#enc:encodning" to end of path */
|
||||
/* if path end width a previous #enc:, only encoding is changed no additional
|
||||
* #enc: is appended
|
||||
* retun new string
|
||||
*/
|
||||
static char
|
||||
*add_encoding_to_path (const char *path, const char *encoding)
|
||||
{
|
||||
char *result;
|
||||
char *semi;
|
||||
char *slash;
|
||||
|
||||
semi = g_strrstr (path, "#enc:");
|
||||
|
||||
if (semi != NULL) {
|
||||
slash = strchr (semi, PATH_SEP);
|
||||
if (slash != NULL) {
|
||||
result = g_strconcat (path, "/#enc:", encoding, NULL);
|
||||
} else {
|
||||
*semi = 0;
|
||||
result = g_strconcat (path, "/#enc:", encoding, NULL);
|
||||
*semi = '#';
|
||||
}
|
||||
} else {
|
||||
result = g_strconcat (path, "/#enc:", encoding, NULL);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static void
|
||||
set_panel_encoding (WPanel *panel)
|
||||
{
|
||||
char *encoding;
|
||||
char *cd_path;
|
||||
|
||||
encoding = input_dialog ("Encoding", "Select encoding", NULL, "");
|
||||
|
||||
if (encoding) {
|
||||
cd_path = add_encoding_to_path (panel->cwd, encoding);
|
||||
if (!do_panel_cd (MENU_PANEL, cd_path, 0))
|
||||
message (1, MSG_ERROR, _(" Cannot chdir to %s "), cd_path);
|
||||
g_free (cd_path);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
encoding_cmd (void)
|
||||
{
|
||||
WPanel *panel;
|
||||
|
||||
if (!SELECTED_IS_PANEL)
|
||||
return;
|
||||
|
||||
panel = MENU_PANEL;
|
||||
set_panel_encoding (panel);
|
||||
}
|
||||
|
@ -57,5 +57,6 @@ void quick_cmd_no_menu (void);
|
||||
void info_cmd_no_menu (void);
|
||||
void quick_view_cmd (void);
|
||||
void toggle_listing_cmd (void);
|
||||
void encoding_cmd (void);
|
||||
|
||||
#endif
|
||||
|
414
src/complete.c
414
src/complete.c
@ -40,6 +40,7 @@
|
||||
#include "main.h"
|
||||
#include "util.h"
|
||||
#include "key.h" /* XCTRL and ALT macros */
|
||||
#include "strutil.h"
|
||||
|
||||
typedef char *CompletionFunction (char * text, int state, INPUT_COMPLETE_FLAGS flags);
|
||||
|
||||
@ -119,6 +120,8 @@ filename_completion_function (char *text, int state, INPUT_COMPLETE_FLAGS flags)
|
||||
/* Now that we have some state, we can read the directory. */
|
||||
|
||||
while (directory && (entry = mc_readdir (directory))){
|
||||
if (!str_is_valid_string (entry->d_name)) continue;
|
||||
|
||||
/* Special case for no filename.
|
||||
All entries except "." and ".." match. */
|
||||
if (!filename_len){
|
||||
@ -307,20 +310,24 @@ static void fetch_hosts (const char *filename)
|
||||
{
|
||||
FILE *file = fopen (filename, "r");
|
||||
char buffer[256], *name;
|
||||
register int i, start;
|
||||
char *start;
|
||||
char *bi;
|
||||
|
||||
if (!file)
|
||||
return;
|
||||
|
||||
while (fgets (buffer, 255, file) != NULL){
|
||||
/* Skip to first character. */
|
||||
for (i = 0; buffer[i] && cr_whitespace (buffer[i]); i++);
|
||||
for (bi = buffer;
|
||||
bi[0] != '\0' && str_isspace (bi);
|
||||
str_next_char (&bi));
|
||||
|
||||
/* Ignore comments... */
|
||||
if (buffer[i] == '#')
|
||||
if (bi[0] == '#')
|
||||
continue;
|
||||
/* Handle $include. */
|
||||
if (!strncmp (buffer + i, "$include ", 9)){
|
||||
char *includefile = buffer + i + 9;
|
||||
if (!strncmp (bi, "$include ", 9)){
|
||||
char *includefile = bi + 9;
|
||||
char *t;
|
||||
|
||||
/* Find start of filename. */
|
||||
@ -329,8 +336,8 @@ static void fetch_hosts (const char *filename)
|
||||
t = includefile;
|
||||
|
||||
/* Find end of filename. */
|
||||
while (*t && !cr_whitespace (*t))
|
||||
t++;
|
||||
while (t[0] != '\0' && !str_isspace (t))
|
||||
str_next_char (&t);
|
||||
*t = '\0';
|
||||
|
||||
fetch_hosts (includefile);
|
||||
@ -338,19 +345,22 @@ static void fetch_hosts (const char *filename)
|
||||
}
|
||||
|
||||
/* Skip IP #s. */
|
||||
while (buffer[i] && !cr_whitespace (buffer[i]))
|
||||
i++;
|
||||
while (bi[0] != '\0' && !str_isspace (bi))
|
||||
str_next_char (&bi);
|
||||
|
||||
/* Get the host names separated by white space. */
|
||||
while (buffer[i] && buffer[i] != '#'){
|
||||
while (buffer[i] && cr_whitespace (buffer[i]))
|
||||
i++;
|
||||
if (buffer[i] == '#')
|
||||
while (bi[0] != '\0' && bi[0] != '#'){
|
||||
while (bi[0] != '\0' && str_isspace (bi))
|
||||
str_next_char (&bi);
|
||||
if (bi[0] == '#')
|
||||
continue;
|
||||
for (start = i; buffer[i] && !cr_whitespace (buffer[i]); i++);
|
||||
if (i - start == 0)
|
||||
continue;
|
||||
name = g_strndup (buffer + start, i - start);
|
||||
for (start = bi;
|
||||
bi[0] != '\0' && !str_isspace (bi);
|
||||
str_next_char (&bi));
|
||||
|
||||
if (bi - start == 0) continue;
|
||||
|
||||
name = g_strndup (start, bi - start);
|
||||
{
|
||||
char **host_p;
|
||||
|
||||
@ -609,19 +619,30 @@ completion_matches (char *text, CompletionFunction entry_function, INPUT_COMPLET
|
||||
j = i + 1;
|
||||
while (j < matches + 1)
|
||||
{
|
||||
register int c1, c2, si;
|
||||
char *si, *sj;
|
||||
char *ni, *nj;
|
||||
|
||||
for (si = 0;(c1 = match_list [i][si]) && (c2 = match_list [j][si]); si++)
|
||||
if (c1 != c2) break;
|
||||
for (si = match_list[i], sj = match_list[j];
|
||||
si[0] && sj[0];) {
|
||||
|
||||
ni = str_get_next_char (si);
|
||||
nj = str_get_next_char (sj);
|
||||
|
||||
if (!c1 && !match_list [j][si]){ /* Two equal strings */
|
||||
if (ni - si != nj - sj) break;
|
||||
if (strncmp (si, sj, ni - si) != 0) break;
|
||||
|
||||
si = ni;
|
||||
sj = nj;
|
||||
}
|
||||
|
||||
if (si[0] == '\0' && sj[0] == '\0'){ /* Two equal strings */
|
||||
g_free (match_list [j]);
|
||||
j++;
|
||||
if (j > matches)
|
||||
break;
|
||||
continue; /* Look for a run of equal strings */
|
||||
} else
|
||||
if (low > si) low = si;
|
||||
if (low > si - match_list[i]) low = si - match_list[i];
|
||||
if (i + 1 != j) /* So there's some gap */
|
||||
match_list [i + 1] = match_list [j];
|
||||
i++; j++;
|
||||
@ -641,21 +662,26 @@ completion_matches (char *text, CompletionFunction entry_function, INPUT_COMPLET
|
||||
static int
|
||||
check_is_cd (const char *text, int start, INPUT_COMPLETE_FLAGS flags)
|
||||
{
|
||||
const char *p, *q;
|
||||
char *p, *q;
|
||||
int test = 0;
|
||||
|
||||
SHOW_C_CTX("check_is_cd");
|
||||
if (!(flags & INPUT_COMPLETE_CD))
|
||||
return 0;
|
||||
|
||||
/* Skip initial spaces */
|
||||
p = text;
|
||||
q = text + start;
|
||||
while (p < q && *p && isspace ((unsigned char) *p))
|
||||
p++;
|
||||
p = (char*)text;
|
||||
q = (char*)text + start;
|
||||
while (p < q && p[0] != '\0' && str_isspace (p))
|
||||
str_next_char (&p);
|
||||
|
||||
/* Check if the command is "cd" and the cursor is after it */
|
||||
if (p[0] == 'c' && p[1] == 'd' && isspace ((unsigned char) p[2])
|
||||
&& (p + 2 < q))
|
||||
text+= p[0] == 'c';
|
||||
str_next_char (&p);
|
||||
text+= p[0] == 'd';
|
||||
str_next_char (&p);
|
||||
text+= str_isspace (p);
|
||||
if (test == 3 && (p < q))
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
@ -666,51 +692,42 @@ static char **
|
||||
try_complete (char *text, int *start, int *end, INPUT_COMPLETE_FLAGS flags)
|
||||
{
|
||||
int in_command_position = 0;
|
||||
char *word, c;
|
||||
char *word;
|
||||
char **matches = NULL;
|
||||
const char *command_separator_chars = ";|&{(`";
|
||||
char *p = NULL, *q = NULL, *r = NULL;
|
||||
int is_cd = check_is_cd (text, *start, flags);
|
||||
char *ti;
|
||||
|
||||
SHOW_C_CTX("try_complete");
|
||||
|
||||
c = text [*end];
|
||||
text [*end] = 0;
|
||||
word = g_strdup (text + *start);
|
||||
text [*end] = c;
|
||||
word = g_strndup (text + *start, *end - *start);
|
||||
|
||||
/* Determine if this could be a command word. It is if it appears at
|
||||
the start of the line (ignoring preceding whitespace), or if it
|
||||
appears after a character that separates commands. And we have to
|
||||
be in a INPUT_COMPLETE_COMMANDS flagged Input line. */
|
||||
if (!is_cd && (flags & INPUT_COMPLETE_COMMANDS)){
|
||||
int i = *start - 1;
|
||||
for (i = *start - 1; i > -1; i--) {
|
||||
if (text[i] == ' ' || text[i] == '\t'){
|
||||
if (i == 0 ) continue;
|
||||
if (text[i-1] != '\\') {
|
||||
i--;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (i < 0)
|
||||
in_command_position++;
|
||||
else if (strchr (command_separator_chars, text[i])){
|
||||
ti = str_get_prev_char (&text[*start]);
|
||||
while (ti > text && (ti[0] == ' ' || ti[0] == '\t'))
|
||||
str_prev_char (&ti);
|
||||
if (ti <= text&& (ti[0] == ' ' || ti[0] == '\t'))
|
||||
in_command_position++;
|
||||
else if (strchr (command_separator_chars, ti[0])){
|
||||
register int this_char, prev_char;
|
||||
|
||||
in_command_position++;
|
||||
|
||||
if (i){
|
||||
|
||||
if (ti > text){
|
||||
/* Handle the two character tokens `>&', `<&', and `>|'.
|
||||
We are not in a command position after one of these. */
|
||||
this_char = text[i];
|
||||
prev_char = text[i - 1];
|
||||
this_char = ti[0];
|
||||
prev_char = str_get_prev_char (ti)[0];
|
||||
|
||||
if ((this_char == '&' && (prev_char == '<' || prev_char == '>')) ||
|
||||
(this_char == '|' && prev_char == '>'))
|
||||
in_command_position = 0;
|
||||
else if (i > 0 && text [i-1] == '\\') /* Quoted */
|
||||
|
||||
else if (ti > text && str_get_prev_char (ti)[0] == '\\') /* Quoted */
|
||||
in_command_position = 0;
|
||||
}
|
||||
}
|
||||
@ -723,17 +740,19 @@ try_complete (char *text, int *start, int *end, INPUT_COMPLETE_FLAGS flags)
|
||||
if (flags & INPUT_COMPLETE_HOSTNAMES)
|
||||
r = strrchr (word, '@');
|
||||
if (q && q [1] == '(' && INPUT_COMPLETE_COMMANDS){
|
||||
if (q > p)
|
||||
p = q + 1;
|
||||
q = NULL;
|
||||
if (q > p)
|
||||
p = str_get_next_char (q);
|
||||
q = NULL;
|
||||
}
|
||||
|
||||
/* Command substitution? */
|
||||
if (p > q && p > r){
|
||||
SHOW_C_CTX("try_complete:cmd_backq_subst");
|
||||
matches = completion_matches (p + 1, command_completion_function, flags & (~INPUT_COMPLETE_FILENAMES));
|
||||
matches = completion_matches (str_get_next_char (p),
|
||||
command_completion_function,
|
||||
flags & (~INPUT_COMPLETE_FILENAMES));
|
||||
if (matches)
|
||||
*start += p + 1 - word;
|
||||
*start += str_get_next_char (p) - word;
|
||||
}
|
||||
|
||||
/* Variable name? */
|
||||
@ -752,7 +771,7 @@ try_complete (char *text, int *start, int *end, INPUT_COMPLETE_FLAGS flags)
|
||||
if (matches)
|
||||
*start += r - word;
|
||||
}
|
||||
|
||||
|
||||
/* Starts with `~' and there is no slash in the word, then
|
||||
try completing this word as a username. */
|
||||
if (!matches && *word == '~' && (flags & INPUT_COMPLETE_USERNAMES) && !strchr (word, PATH_SEP))
|
||||
@ -770,33 +789,18 @@ try_complete (char *text, int *start, int *end, INPUT_COMPLETE_FLAGS flags)
|
||||
SHOW_C_CTX("try_complete:cmd_subst");
|
||||
matches = completion_matches (word, command_completion_function, flags & (~INPUT_COMPLETE_FILENAMES));
|
||||
}
|
||||
|
||||
|
||||
else if (!matches && (flags & INPUT_COMPLETE_FILENAMES)){
|
||||
if (is_cd)
|
||||
flags &= ~(INPUT_COMPLETE_FILENAMES | INPUT_COMPLETE_COMMANDS);
|
||||
SHOW_C_CTX("try_complete:filename_subst_1");
|
||||
matches = completion_matches (word, filename_completion_function, flags);
|
||||
if (!matches && is_cd && *word != PATH_SEP && *word != '~'){
|
||||
char *p, *q = text + *start;
|
||||
|
||||
for (p = text; *p && p < q; p++){
|
||||
if (*p == ' ' || *p == '\t') {
|
||||
if (p == text) continue;
|
||||
if (*(p-1) == '\\') {
|
||||
p--;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!strncmp (p, "cd", 2))
|
||||
for (p += 2; *p && p < q && (*p == ' ' || *p == '\t'); p++){
|
||||
if (p == text) continue;
|
||||
if (*(p-1) == '\\') {
|
||||
p--;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (p == q){
|
||||
if (!matches && is_cd && *word != PATH_SEP && *word != '~'){
|
||||
char *p, *q = text + *start;
|
||||
for (p = text; *p && p < q && (*p == ' ' || *p == '\t'); str_next_char (&p));
|
||||
if (!strncmp (p, "cd", 2))
|
||||
for (p += 2; *p && p < q && (*p == ' ' || *p == '\t'); str_next_char (&p));
|
||||
if (p == q){
|
||||
char * const cdpath_ref = g_strdup (getenv ("CDPATH"));
|
||||
char *cdpath = cdpath_ref;
|
||||
char c, *s, *r;
|
||||
@ -818,11 +822,11 @@ try_complete (char *text, int *start, int *end, INPUT_COMPLETE_FLAGS flags)
|
||||
g_free (r);
|
||||
}
|
||||
*s = c;
|
||||
cdpath = s + 1;
|
||||
cdpath = str_get_next_char (s);
|
||||
}
|
||||
g_free (cdpath_ref);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
g_free (word);
|
||||
@ -833,7 +837,7 @@ try_complete (char *text, int *start, int *end, INPUT_COMPLETE_FLAGS flags)
|
||||
void free_completions (WInput *in)
|
||||
{
|
||||
char **p;
|
||||
|
||||
|
||||
if (!in->completions)
|
||||
return;
|
||||
for (p=in->completions; *p; p++)
|
||||
@ -847,49 +851,57 @@ static WInput *input;
|
||||
static int min_end;
|
||||
static int start, end;
|
||||
|
||||
static int insert_text (WInput *in, char *text, ssize_t len)
|
||||
static int insert_text (WInput *in, char *text, ssize_t size)
|
||||
{
|
||||
len = min (len, (ssize_t) strlen (text)) + start - end;
|
||||
if (strlen (in->buffer) + len >= (size_t) in->current_max_len){
|
||||
int buff_len = str_length (in->buffer);
|
||||
|
||||
size = min (size, (ssize_t) strlen (text)) + start - end;
|
||||
if (strlen (in->buffer) + size >= (size_t) in->current_max_size){
|
||||
/* Expand the buffer */
|
||||
char *narea = g_realloc (in->buffer, in->current_max_len + len + in->field_len);
|
||||
char *narea = g_realloc (in->buffer, in->current_max_size
|
||||
+ size + in->field_width);
|
||||
if (narea){
|
||||
in->buffer = narea;
|
||||
in->current_max_len += len + in->field_len;
|
||||
in->current_max_size += size + in->field_width;
|
||||
}
|
||||
}
|
||||
if (strlen (in->buffer)+1 < (size_t) in->current_max_len){
|
||||
if (len > 0){
|
||||
if (strlen (in->buffer)+1 < (size_t) in->current_max_size){
|
||||
if (size > 0){
|
||||
int i = strlen (&in->buffer [end]);
|
||||
for (; i >= 0; i--)
|
||||
in->buffer [end + len + i] = in->buffer [end + i];
|
||||
} else if (len < 0){
|
||||
char *p = in->buffer + end + len, *q = in->buffer + end;
|
||||
in->buffer [end + size + i] = in->buffer [end + i];
|
||||
} else if (size < 0){
|
||||
char *p = in->buffer + end + size, *q = in->buffer + end;
|
||||
while (*q)
|
||||
*(p++) = *(q++);
|
||||
*p = 0;
|
||||
}
|
||||
memcpy (in->buffer + start, text, len - start + end);
|
||||
in->point += len;
|
||||
memcpy (in->buffer + start, text, size - start + end);
|
||||
in->point+= str_length (in->buffer) - buff_len;
|
||||
update_input (in, 1);
|
||||
end += len;
|
||||
end+= size;
|
||||
}
|
||||
return len != 0;
|
||||
return size != 0;
|
||||
}
|
||||
|
||||
static cb_ret_t
|
||||
query_callback (Dlg_head *h, dlg_msg_t msg, int parm)
|
||||
{
|
||||
static char buff[MB_LEN_MAX] = "";
|
||||
static int bl = 0;
|
||||
|
||||
switch (msg) {
|
||||
case DLG_KEY:
|
||||
switch (parm) {
|
||||
case KEY_LEFT:
|
||||
case KEY_RIGHT:
|
||||
bl = 0;
|
||||
h->ret_value = 0;
|
||||
dlg_stop (h);
|
||||
return MSG_HANDLED;
|
||||
|
||||
case KEY_BACKSPACE:
|
||||
bl = 0;
|
||||
if (end == min_end) {
|
||||
h->ret_value = 0;
|
||||
dlg_stop (h);
|
||||
@ -899,13 +911,13 @@ query_callback (Dlg_head *h, dlg_msg_t msg, int parm)
|
||||
|
||||
e1 = e = ((WListbox *) (h->current))->list;
|
||||
do {
|
||||
if (!strncmp
|
||||
(input->buffer + start, e1->text,
|
||||
end - start - 1)) {
|
||||
listbox_select_entry ((WListbox *) (h->current),
|
||||
e1);
|
||||
if (!strncmp (input->buffer + start,
|
||||
e1->text, end - start - 1)) {
|
||||
|
||||
listbox_select_entry ((WListbox *) (h->current), e1);
|
||||
end = str_get_prev_char (&(input->buffer[end]))
|
||||
- input->buffer;
|
||||
handle_char (input, parm);
|
||||
end--;
|
||||
send_message (h->current, WIDGET_DRAW, 0);
|
||||
break;
|
||||
}
|
||||
@ -915,7 +927,8 @@ query_callback (Dlg_head *h, dlg_msg_t msg, int parm)
|
||||
return MSG_HANDLED;
|
||||
|
||||
default:
|
||||
if (parm > 0xff || !is_printable (parm)) {
|
||||
if (parm < 32 || parm > 256) {
|
||||
bl = 0;
|
||||
if (is_in_input_map (input, parm) == 2) {
|
||||
if (end == min_end)
|
||||
return MSG_HANDLED;
|
||||
@ -931,21 +944,43 @@ query_callback (Dlg_head *h, dlg_msg_t msg, int parm)
|
||||
int low = 4096;
|
||||
char *last_text = NULL;
|
||||
|
||||
buff[bl] = (char) parm;
|
||||
bl++;
|
||||
buff[bl] = '\0';
|
||||
switch (str_is_valid_char (buff, bl)) {
|
||||
case -1:
|
||||
bl = 0;
|
||||
case -2:
|
||||
return MSG_HANDLED;
|
||||
}
|
||||
|
||||
e1 = e = ((WListbox *) (h->current))->list;
|
||||
do {
|
||||
if (!strncmp
|
||||
(input->buffer + start, e1->text, end - start)) {
|
||||
if (e1->text[end - start] == parm) {
|
||||
if (!strncmp (input->buffer + start,
|
||||
e1->text, end - start)) {
|
||||
|
||||
if (strncmp (&e1->text[end - start], buff, bl) == 0) {
|
||||
if (need_redraw) {
|
||||
register int c1, c2, si;
|
||||
char *si, *sl;
|
||||
char *ni, *nl;
|
||||
si = &(e1->text[end - start]);
|
||||
sl = &(last_text[end - start]);
|
||||
|
||||
for (; si[0] != '\0' && sl[0] != '\0';) {
|
||||
|
||||
ni = str_get_next_char (si);
|
||||
nl = str_get_next_char (sl);
|
||||
|
||||
if (ni - si != nl - sl) break;
|
||||
if (strncmp (si, sl, ni - si) != 0) break;
|
||||
|
||||
si = ni;
|
||||
sl = nl;
|
||||
}
|
||||
|
||||
if (low > si - &e1->text[start])
|
||||
low = si - &e1->text[start];
|
||||
|
||||
for (si = end - start + 1;
|
||||
(c1 = last_text[si])
|
||||
&& (c2 = e1->text[si]); si++)
|
||||
if (c1 != c2)
|
||||
break;
|
||||
if (low > si)
|
||||
low = si;
|
||||
last_text = e1->text;
|
||||
need_redraw = 2;
|
||||
} else {
|
||||
@ -966,6 +1001,7 @@ query_callback (Dlg_head *h, dlg_msg_t msg, int parm)
|
||||
h->ret_value = B_ENTER;
|
||||
dlg_stop (h);
|
||||
}
|
||||
bl = 0;
|
||||
}
|
||||
return MSG_HANDLED;
|
||||
}
|
||||
@ -982,94 +1018,96 @@ query_callback (Dlg_head *h, dlg_msg_t msg, int parm)
|
||||
static int
|
||||
complete_engine (WInput *in, int what_to_do)
|
||||
{
|
||||
if (in->completions && in->point != end)
|
||||
int s;
|
||||
|
||||
if (in->completions && (str_offset_to_pos (in->buffer, in->point)) != end)
|
||||
free_completions (in);
|
||||
if (!in->completions){
|
||||
end = in->point;
|
||||
for (start = end ? end - 1 : 0; start > -1; start--)
|
||||
if (strchr (" \t;|<>", in->buffer [start])){
|
||||
if (start > 0 && in->buffer [start-1] == '\\')
|
||||
continue;
|
||||
else
|
||||
break;
|
||||
}
|
||||
if (start < end)
|
||||
start++;
|
||||
in->completions = try_complete (in->buffer, &start, &end, in->completion_flags);
|
||||
end = str_offset_to_pos (in->buffer, in->point);
|
||||
for (s = in->point ? in->point - 1 : 0; s >= 0; s--) {
|
||||
start = str_offset_to_pos (in->buffer, s);
|
||||
if (strchr (" \t;|<>", in->buffer [start])) {
|
||||
if (start < end) start = str_offset_to_pos (in->buffer, s + 1);
|
||||
/* FIXME: maybe need check '\\' prev char
|
||||
if (start > 0 && in->buffer [start-1] == '\\')
|
||||
*/
|
||||
break;
|
||||
}
|
||||
}
|
||||
in->completions = try_complete (in->buffer, &start, &end, in->completion_flags);
|
||||
}
|
||||
|
||||
|
||||
if (in->completions){
|
||||
if (what_to_do & DO_INSERTION || ((what_to_do & DO_QUERY) && !in->completions[1])) {
|
||||
if (what_to_do & DO_INSERTION || ((what_to_do & DO_QUERY) && !in->completions[1])) {
|
||||
char * complete = in->completions [0];
|
||||
if (insert_text (in, complete, strlen (complete))){
|
||||
if (in->completions [1])
|
||||
beep ();
|
||||
if (in->completions [1])
|
||||
beep ();
|
||||
else
|
||||
free_completions (in);
|
||||
} else
|
||||
beep ();
|
||||
}
|
||||
if ((what_to_do & DO_QUERY) && in->completions && in->completions [1]) {
|
||||
int maxlen = 0, i, count = 0;
|
||||
int x, y, w, h;
|
||||
int start_x, start_y;
|
||||
char **p, *q;
|
||||
Dlg_head *query_dlg;
|
||||
WListbox *query_list;
|
||||
if ((what_to_do & DO_QUERY) && in->completions && in->completions [1]) {
|
||||
int maxlen = 0, i, count = 0;
|
||||
int x, y, w, h;
|
||||
int start_x, start_y;
|
||||
char **p, *q;
|
||||
Dlg_head *query_dlg;
|
||||
WListbox *query_list;
|
||||
|
||||
for (p=in->completions + 1; *p; count++, p++) {
|
||||
if ((i = strlen (*p)) > maxlen)
|
||||
maxlen = i;
|
||||
for (p=in->completions + 1; *p; count++, p++)
|
||||
if ((i = str_term_width1 (*p)) > maxlen)
|
||||
maxlen = i;
|
||||
start_x = in->widget.x;
|
||||
start_y = in->widget.y;
|
||||
if (start_y - 2 >= count) {
|
||||
y = start_y - 2 - count;
|
||||
h = 2 + count;
|
||||
} else {
|
||||
if (start_y >= LINES - start_y - 1) {
|
||||
y = 0;
|
||||
h = start_y;
|
||||
} else {
|
||||
y = start_y + 1;
|
||||
h = LINES - start_y - 1;
|
||||
}
|
||||
}
|
||||
start_x = in->widget.x;
|
||||
start_y = in->widget.y;
|
||||
if (start_y - 2 >= count) {
|
||||
y = start_y - 2 - count;
|
||||
h = 2 + count;
|
||||
} else {
|
||||
if (start_y >= LINES - start_y - 1) {
|
||||
y = 0;
|
||||
h = start_y;
|
||||
} else {
|
||||
y = start_y + 1;
|
||||
h = LINES - start_y - 1;
|
||||
}
|
||||
}
|
||||
x = start - in->first_shown - 2 + start_x;
|
||||
w = maxlen + 4;
|
||||
if (x + w > COLS)
|
||||
x = COLS - w;
|
||||
if (x < 0)
|
||||
x = 0;
|
||||
if (x + w > COLS)
|
||||
w = COLS;
|
||||
input = in;
|
||||
min_end = end;
|
||||
x = start - in->term_first_shown - 2 + start_x;
|
||||
w = maxlen + 4;
|
||||
if (x + w > COLS)
|
||||
x = COLS - w;
|
||||
if (x < 0)
|
||||
x = 0;
|
||||
if (x + w > COLS)
|
||||
w = COLS;
|
||||
input = in;
|
||||
min_end = end;
|
||||
query_height = h;
|
||||
query_width = w;
|
||||
query_dlg = create_dlg (y, x, query_height, query_width,
|
||||
query_dlg = create_dlg (y, x, query_height, query_width,
|
||||
dialog_colors, query_callback,
|
||||
"[Completion]", NULL, DLG_COMPACT);
|
||||
query_list = listbox_new (1, 1, w - 2, h - 2, NULL);
|
||||
add_widget (query_dlg, query_list);
|
||||
for (p = in->completions + 1; *p; p++)
|
||||
listbox_add_item (query_list, 0, 0, *p, NULL);
|
||||
run_dlg (query_dlg);
|
||||
q = NULL;
|
||||
if (query_dlg->ret_value == B_ENTER){
|
||||
listbox_get_current (query_list, &q, NULL);
|
||||
if (q)
|
||||
insert_text (in, q, strlen (q));
|
||||
}
|
||||
if (q || end != min_end)
|
||||
free_completions (in);
|
||||
i = query_dlg->ret_value; /* B_USER if user wants to start over again */
|
||||
destroy_dlg (query_dlg);
|
||||
if (i == B_USER)
|
||||
return 1;
|
||||
}
|
||||
query_list = listbox_new (1, 1, w - 2, h - 2, NULL);
|
||||
add_widget (query_dlg, query_list);
|
||||
for (p = in->completions + 1; *p; p++)
|
||||
listbox_add_item (query_list, 0, 0, *p, NULL);
|
||||
run_dlg (query_dlg);
|
||||
q = NULL;
|
||||
if (query_dlg->ret_value == B_ENTER){
|
||||
listbox_get_current (query_list, &q, NULL);
|
||||
if (q)
|
||||
insert_text (in, q, strlen (q));
|
||||
}
|
||||
if (q || end != min_end)
|
||||
free_completions (in);
|
||||
i = query_dlg->ret_value; /* B_USER if user wants to start over again */
|
||||
destroy_dlg (query_dlg);
|
||||
if (i == B_USER)
|
||||
return 1;
|
||||
}
|
||||
} else
|
||||
beep ();
|
||||
beep ();
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1077,6 +1115,8 @@ void complete (WInput *in)
|
||||
{
|
||||
int engine_flags;
|
||||
|
||||
if (!str_is_valid_string (in->buffer)) return;
|
||||
|
||||
if (in->completions)
|
||||
engine_flags = DO_QUERY;
|
||||
else
|
||||
|
13
src/dialog.c
13
src/dialog.c
@ -33,6 +33,7 @@
|
||||
#include "layout.h" /* winch_flag */
|
||||
#include "execute.h" /* suspend_cmd() */
|
||||
#include "main.h" /* slow_terminal */
|
||||
#include "strutil.h"
|
||||
|
||||
#define waddc(w,y1,x1,c) move (w->y+y1, w->x+x1); addch (c)
|
||||
|
||||
@ -167,8 +168,8 @@ common_dialog_repaint (struct Dlg_head *h)
|
||||
|
||||
if (h->title) {
|
||||
attrset (DLG_HOT_NORMALC (h));
|
||||
dlg_move (h, space, (h->cols - strlen (h->title)) / 2);
|
||||
addstr (h->title);
|
||||
dlg_move (h, space, (h->cols - str_term_width1 (h->title)) / 2);
|
||||
addstr (str_term_form (h->title));
|
||||
}
|
||||
}
|
||||
|
||||
@ -590,14 +591,16 @@ dlg_try_hotkey (Dlg_head *h, int d_key)
|
||||
*/
|
||||
|
||||
if (h->current->options & W_IS_INPUT) {
|
||||
if (d_key < 255 && isalpha (d_key))
|
||||
/* skip ascii control characters, anything else can valid character in
|
||||
* some encoding */
|
||||
if (d_key >= 32 && d_key < 256)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* If it's an alt key, send the message */
|
||||
c = d_key & ~ALT (0);
|
||||
if (d_key & ALT (0) && c < 255 && isalpha (c))
|
||||
d_key = tolower (c);
|
||||
if (d_key & ALT (0) && g_ascii_isalpha (c))
|
||||
d_key = g_ascii_tolower (c);
|
||||
|
||||
handled = 0;
|
||||
if (h->current->options & W_WANT_HOTKEY)
|
||||
|
113
src/dir.c
113
src/dir.c
@ -29,6 +29,7 @@
|
||||
#include "dir.h"
|
||||
#include "wtools.h"
|
||||
#include "treestore.h"
|
||||
#include "strutil.h"
|
||||
|
||||
/* If true show files starting with a dot */
|
||||
int show_dot_files = 1;
|
||||
@ -61,50 +62,9 @@ sort_orders_t sort_orders [SORT_TYPES_TOTAL] = {
|
||||
{ N_("&Inode"), sort_inode },
|
||||
};
|
||||
|
||||
#ifdef HAVE_STRCOLL
|
||||
/*
|
||||
* g_strcasecmp() doesn't work well in some locales because it relies on
|
||||
* the locale-specific toupper(). On the other hand, strcoll() is case
|
||||
* sensitive in the "C" and "POSIX" locales, unlike other locales.
|
||||
* Solution: always use strcmp() for case sensitive sort. For case
|
||||
* insensitive sort use strcoll() if it's case insensitive for ASCII and
|
||||
* g_strcasecmp() otherwise.
|
||||
*/
|
||||
typedef enum {
|
||||
STRCOLL_NO,
|
||||
STRCOLL_YES,
|
||||
STRCOLL_TEST
|
||||
} strcoll_status;
|
||||
|
||||
static int string_sortcomp (const char *str1, const char *str2)
|
||||
{
|
||||
static strcoll_status use_strcoll = STRCOLL_TEST;
|
||||
|
||||
if (case_sensitive) {
|
||||
return strcmp (str1, str2);
|
||||
}
|
||||
|
||||
/* Initialize use_strcoll once. */
|
||||
if (use_strcoll == STRCOLL_TEST) {
|
||||
/* Only use strcoll() if it considers "B" between "a" and "c". */
|
||||
if (strcoll ("a", "B") * strcoll ("B", "c") > 0) {
|
||||
use_strcoll = STRCOLL_YES;
|
||||
} else {
|
||||
use_strcoll = STRCOLL_NO;
|
||||
}
|
||||
}
|
||||
|
||||
if (use_strcoll == STRCOLL_NO)
|
||||
return g_strcasecmp (str1, str2);
|
||||
else
|
||||
return strcoll (str1, str2);
|
||||
}
|
||||
#else
|
||||
#define string_sortcomp(a,b) (case_sensitive ? strcmp (a,b) : g_strcasecmp (a,b))
|
||||
#endif
|
||||
|
||||
int
|
||||
unsorted (const file_entry *a, const file_entry *b)
|
||||
unsorted (file_entry *a, file_entry *b)
|
||||
{
|
||||
(void) a;
|
||||
(void) b;
|
||||
@ -112,28 +72,38 @@ unsorted (const file_entry *a, const file_entry *b)
|
||||
}
|
||||
|
||||
int
|
||||
sort_name (const file_entry *a, const file_entry *b)
|
||||
sort_name (file_entry *a, file_entry *b)
|
||||
{
|
||||
int ad = MY_ISDIR (a);
|
||||
int bd = MY_ISDIR (b);
|
||||
|
||||
if (ad == bd || mix_all_files)
|
||||
return string_sortcomp (a->fname, b->fname) * reverse;
|
||||
return bd-ad;
|
||||
if (ad == bd || mix_all_files) {
|
||||
/* create key if does not exist, key will be freed after sorting */
|
||||
if (a->sort_key == NULL)
|
||||
a->sort_key = str_create_key_for_filename (a->fname, case_sensitive);
|
||||
if (b->sort_key == NULL)
|
||||
b->sort_key = str_create_key_for_filename (b->fname, case_sensitive);
|
||||
|
||||
return str_key_collate (a->sort_key, b->sort_key, case_sensitive)
|
||||
* reverse;
|
||||
}
|
||||
return bd - ad;
|
||||
}
|
||||
|
||||
int
|
||||
sort_ext (const file_entry *a, const file_entry *b)
|
||||
sort_ext (file_entry *a, file_entry *b)
|
||||
{
|
||||
const char *exta, *extb;
|
||||
int r;
|
||||
int ad = MY_ISDIR (a);
|
||||
int bd = MY_ISDIR (b);
|
||||
|
||||
if (ad == bd || mix_all_files){
|
||||
exta = extension (a->fname);
|
||||
extb = extension (b->fname);
|
||||
r = string_sortcomp (exta, extb);
|
||||
if (a->second_sort_key == NULL)
|
||||
a->second_sort_key = str_create_key (extension (a->fname), case_sensitive);
|
||||
if (b->second_sort_key == NULL)
|
||||
b->second_sort_key = str_create_key (extension (b->fname), case_sensitive);
|
||||
|
||||
r = str_key_collate (a->second_sort_key, b->second_sort_key, case_sensitive);
|
||||
if (r)
|
||||
return r * reverse;
|
||||
else
|
||||
@ -143,7 +113,7 @@ sort_ext (const file_entry *a, const file_entry *b)
|
||||
}
|
||||
|
||||
int
|
||||
sort_time (const file_entry *a, const file_entry *b)
|
||||
sort_time (file_entry *a, file_entry *b)
|
||||
{
|
||||
int ad = MY_ISDIR (a);
|
||||
int bd = MY_ISDIR (b);
|
||||
@ -161,7 +131,7 @@ sort_time (const file_entry *a, const file_entry *b)
|
||||
}
|
||||
|
||||
int
|
||||
sort_ctime (const file_entry *a, const file_entry *b)
|
||||
sort_ctime (file_entry *a, file_entry *b)
|
||||
{
|
||||
int ad = MY_ISDIR (a);
|
||||
int bd = MY_ISDIR (b);
|
||||
@ -179,7 +149,7 @@ sort_ctime (const file_entry *a, const file_entry *b)
|
||||
}
|
||||
|
||||
int
|
||||
sort_atime (const file_entry *a, const file_entry *b)
|
||||
sort_atime (file_entry *a, file_entry *b)
|
||||
{
|
||||
int ad = MY_ISDIR (a);
|
||||
int bd = MY_ISDIR (b);
|
||||
@ -197,7 +167,7 @@ sort_atime (const file_entry *a, const file_entry *b)
|
||||
}
|
||||
|
||||
int
|
||||
sort_inode (const file_entry *a, const file_entry *b)
|
||||
sort_inode (file_entry *a, file_entry *b)
|
||||
{
|
||||
int ad = MY_ISDIR (a);
|
||||
int bd = MY_ISDIR (b);
|
||||
@ -209,7 +179,7 @@ sort_inode (const file_entry *a, const file_entry *b)
|
||||
}
|
||||
|
||||
int
|
||||
sort_size (const file_entry *a, const file_entry *b)
|
||||
sort_size (file_entry *a, file_entry *b)
|
||||
{
|
||||
int ad = MY_ISDIR (a);
|
||||
int bd = MY_ISDIR (b);
|
||||
@ -226,6 +196,20 @@ sort_size (const file_entry *a, const file_entry *b)
|
||||
return sort_name (a, b);
|
||||
}
|
||||
|
||||
/* clear keys, should be call after sorting is finished */
|
||||
static void
|
||||
clean_sort_keys (dir_list *list, int start, int count)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < count; i++){
|
||||
str_release_key (list->list [i + start].sort_key, case_sensitive);
|
||||
list->list [i + start].sort_key = NULL;
|
||||
str_release_key (list->list [i + start].second_sort_key, case_sensitive);
|
||||
list->list [i + start].second_sort_key = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
do_sort (dir_list *list, sortfn *sort, int top, int reverse_f, int case_sensitive_f, int exec_first_f)
|
||||
@ -245,6 +229,8 @@ do_sort (dir_list *list, sortfn *sort, int top, int reverse_f, int case_sensitiv
|
||||
exec_first = exec_first_f;
|
||||
qsort (&(list->list) [dot_dot_found],
|
||||
top + 1 - dot_dot_found, sizeof (file_entry), sort);
|
||||
|
||||
clean_sort_keys (list, dot_dot_found, top + 1 - dot_dot_found);
|
||||
}
|
||||
|
||||
void
|
||||
@ -254,7 +240,7 @@ clean_dir (dir_list *list, int count)
|
||||
|
||||
for (i = 0; i < count; i++){
|
||||
g_free (list->list [i].fname);
|
||||
list->list [i].fname = 0;
|
||||
list->list [i].fname = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
@ -425,6 +411,8 @@ do_load_dir (const char *path, dir_list *list, sortfn *sort, int reverse,
|
||||
list->list[next_free].f.stale_link = stale_link;
|
||||
list->list[next_free].f.dir_size_computed = 0;
|
||||
list->list[next_free].st = st;
|
||||
list->list[next_free].sort_key = NULL;
|
||||
list->list[next_free].second_sort_key = NULL;
|
||||
next_free++;
|
||||
if (!(next_free % 32))
|
||||
rotate_dash ();
|
||||
@ -477,8 +465,11 @@ alloc_dir_copy (int size)
|
||||
}
|
||||
|
||||
dir_copy.list = g_new (file_entry, size);
|
||||
for (i = 0; i < size; i++)
|
||||
dir_copy.list [i].fname = 0;
|
||||
for (i = 0; i < size; i++) {
|
||||
dir_copy.list [i].fname = NULL;
|
||||
dir_copy.list [i].sort_key = NULL;
|
||||
dir_copy.list [i].second_sort_key = NULL;
|
||||
}
|
||||
|
||||
dir_copy.size = size;
|
||||
}
|
||||
@ -515,6 +506,8 @@ do_reload_dir (const char *path, dir_list *list, sortfn *sort, int count,
|
||||
list->list[i].f.dir_size_computed;
|
||||
dir_copy.list[i].f.link_to_dir = list->list[i].f.link_to_dir;
|
||||
dir_copy.list[i].f.stale_link = list->list[i].f.stale_link;
|
||||
dir_copy.list[i].sort_key = NULL;
|
||||
dir_copy.list[i].second_sort_key = NULL;
|
||||
if (list->list[i].f.marked) {
|
||||
g_hash_table_insert (marked_files, dir_copy.list[i].fname,
|
||||
&dir_copy.list[i]);
|
||||
@ -576,6 +569,8 @@ do_reload_dir (const char *path, dir_list *list, sortfn *sort, int count,
|
||||
list->list[next_free].f.stale_link = stale_link;
|
||||
list->list[next_free].f.dir_size_computed = 0;
|
||||
list->list[next_free].st = st;
|
||||
list->list[next_free].sort_key = NULL;
|
||||
list->list[next_free].second_sort_key = NULL;
|
||||
next_free++;
|
||||
if (!(next_free % 16))
|
||||
rotate_dash ();
|
||||
|
23
src/dir.h
23
src/dir.h
@ -6,6 +6,7 @@
|
||||
|
||||
#include <sys/stat.h>
|
||||
|
||||
/* keys are set only during sorting */
|
||||
typedef struct {
|
||||
|
||||
/* File attributes */
|
||||
@ -13,6 +14,10 @@ typedef struct {
|
||||
int fnamelen;
|
||||
char *fname;
|
||||
struct stat st;
|
||||
/* key used for comparing names */
|
||||
char *sort_key;
|
||||
/* key used for comparing extensions */
|
||||
char *second_sort_key;
|
||||
|
||||
/* Flags */
|
||||
struct {
|
||||
@ -42,14 +47,14 @@ int handle_path (dir_list *list, const char *path, struct stat *buf1,
|
||||
int next_free, int *link_to_dir, int *stale_link);
|
||||
|
||||
/* Sorting functions */
|
||||
int unsorted (const file_entry *a, const file_entry *b);
|
||||
int sort_name (const file_entry *a, const file_entry *b);
|
||||
int sort_ext (const file_entry *a, const file_entry *b);
|
||||
int sort_time (const file_entry *a, const file_entry *b);
|
||||
int sort_atime (const file_entry *a, const file_entry *b);
|
||||
int sort_ctime (const file_entry *a, const file_entry *b);
|
||||
int sort_size (const file_entry *a, const file_entry *b);
|
||||
int sort_inode (const file_entry *a, const file_entry *b);
|
||||
int unsorted (file_entry *a, file_entry *b);
|
||||
int sort_name (file_entry *a, file_entry *b);
|
||||
int sort_ext (file_entry *a, file_entry *b);
|
||||
int sort_time (file_entry *a, file_entry *b);
|
||||
int sort_atime (file_entry *a, file_entry *b);
|
||||
int sort_ctime (file_entry *a, file_entry *b);
|
||||
int sort_size (file_entry *a, file_entry *b);
|
||||
int sort_inode (file_entry *a, file_entry *b);
|
||||
|
||||
/* SORT_TYPES is used to build the nice dialog box entries */
|
||||
#define SORT_TYPES 8
|
||||
@ -62,7 +67,7 @@ int sort_inode (const file_entry *a, const file_entry *b);
|
||||
|
||||
typedef struct {
|
||||
const char *sort_name;
|
||||
int (*sort_fn)(const file_entry *, const file_entry *);
|
||||
int (*sort_fn)(file_entry *, file_entry *);
|
||||
} sort_orders_t;
|
||||
|
||||
extern sort_orders_t sort_orders [SORT_TYPES_TOTAL];
|
||||
|
@ -30,6 +30,7 @@
|
||||
#include "dialog.h"
|
||||
#include "wtools.h"
|
||||
#include "execute.h"
|
||||
#include "../vfs/vfs.h"
|
||||
|
||||
|
||||
static void
|
||||
@ -342,7 +343,9 @@ execute_with_vfs_arg (const char *command, const char *filename)
|
||||
|
||||
/* Simplest case, this file is local */
|
||||
if (!filename || vfs_file_is_local (filename)) {
|
||||
do_execute (command, filename, EXECUTE_INTERNAL);
|
||||
fn = vfs_canon_and_translate (filename);
|
||||
do_execute (command, fn, EXECUTE_INTERNAL);
|
||||
g_free (fn);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -61,6 +61,7 @@ static void
|
||||
exec_extension (const char *filename, const char *data, int *move_dir,
|
||||
int start_line)
|
||||
{
|
||||
char *fn;
|
||||
char *file_name;
|
||||
int cmd_file_fd;
|
||||
FILE *cmd_file;
|
||||
@ -173,10 +174,13 @@ exec_extension (const char *filename, const char *data, int *move_dir,
|
||||
localmtime = mystat.st_mtime;
|
||||
text = (*quote_func) (localcopy, 0);
|
||||
} else {
|
||||
text = (*quote_func) (filename, 0);
|
||||
fn = vfs_canon_and_translate (filename);
|
||||
text = (*quote_func) (fn, 0);
|
||||
g_free (fn);
|
||||
}
|
||||
} else
|
||||
} else {
|
||||
text = expand_format (NULL, *data, !is_cd);
|
||||
}
|
||||
if (!is_cd)
|
||||
fputs (text, cmd_file);
|
||||
else {
|
||||
|
150
src/file.c
150
src/file.c
@ -63,7 +63,8 @@
|
||||
#include "widget.h"
|
||||
#include "wtools.h"
|
||||
#include "background.h" /* we_are_background */
|
||||
#include "util.h"
|
||||
//#include "util.h"
|
||||
#include "strutil.h"
|
||||
|
||||
/* Needed for current_panel, other_panel and WTree */
|
||||
#include "dir.h"
|
||||
@ -140,21 +141,30 @@ static FileProgressStatus files_error (const char *format, const char *file1,
|
||||
enum CaseConvs { NO_CONV = 0, UP_CHAR = 1, LOW_CHAR = 2, UP_SECT =
|
||||
4, LOW_SECT = 8 };
|
||||
|
||||
static char
|
||||
convert_case (char c, enum CaseConvs *conversion)
|
||||
static int
|
||||
convert_case (const char *text, enum CaseConvs *conversion,
|
||||
char **out, size_t *remain)
|
||||
{
|
||||
size_t left;
|
||||
|
||||
if (*conversion & UP_CHAR) {
|
||||
*conversion &= ~UP_CHAR;
|
||||
return toupper ((unsigned char) c);
|
||||
return str_toupper (text, out, remain);
|
||||
} else if (*conversion & LOW_CHAR) {
|
||||
*conversion &= ~LOW_CHAR;
|
||||
return tolower ((unsigned char) c);
|
||||
return str_tolower (text, out, remain);
|
||||
} else if (*conversion & UP_SECT) {
|
||||
return toupper ((unsigned char) c);
|
||||
return str_toupper (text, out, remain);
|
||||
} else if (*conversion & LOW_SECT) {
|
||||
return tolower ((unsigned char) c);
|
||||
} else
|
||||
return c;
|
||||
return str_tolower (text, out, remain);
|
||||
} else {
|
||||
left = str_cget_next_char (text) - text;
|
||||
if (left >= *remain) return 0;
|
||||
memcpy (*out, text, left);
|
||||
(*out)+= left;
|
||||
(*remain)-= left;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
static FileProgressStatus transform_error = FILE_CONT;
|
||||
@ -162,58 +172,64 @@ static FileProgressStatus transform_error = FILE_CONT;
|
||||
static const char *
|
||||
do_transform_source (FileOpContext *ctx, const char *source)
|
||||
{
|
||||
size_t j, k, l, len;
|
||||
size_t j, len;
|
||||
const char *fnsource = x_basename (source);
|
||||
char *fnsource_fixed = g_strdup (fnsource);
|
||||
int next_reg;
|
||||
enum CaseConvs case_conv = NO_CONV;
|
||||
static char fntarget[MC_MAXPATHLEN];
|
||||
const char *dm;
|
||||
const char *fn;
|
||||
char *actual;
|
||||
size_t remain;
|
||||
|
||||
len = strlen (fnsource);
|
||||
j = re_match (&ctx->rx, fnsource, len, 0, &ctx->regs);
|
||||
|
||||
str_fix_string (fnsource_fixed);
|
||||
|
||||
len = strlen (fnsource_fixed);
|
||||
j = re_match (&ctx->rx, fnsource_fixed, len, 0, &ctx->regs);
|
||||
if (j != len) {
|
||||
transform_error = FILE_SKIP;
|
||||
return NULL;
|
||||
}
|
||||
for (next_reg = 1, j = 0, k = 0; j < strlen (ctx->dest_mask); j++) {
|
||||
switch (ctx->dest_mask[j]) {
|
||||
g_free (fnsource_fixed);
|
||||
|
||||
actual = fntarget;
|
||||
remain = sizeof (fntarget);
|
||||
dm = ctx->dest_mask;
|
||||
for (next_reg = 1; dm[0] != '\0' && remain > 1 ; str_cnext_char (&dm)) {
|
||||
switch (dm[0]) {
|
||||
case '\\':
|
||||
if (shell_is_char_escaped (&ctx->dest_mask[j])){
|
||||
fntarget[k++] = ctx->dest_mask[j++];
|
||||
fntarget[k++] = ctx->dest_mask[j];
|
||||
str_cnext_char (&dm);
|
||||
if (!str_isdigit (dm)) {
|
||||
/* Backslash followed by non-digit */
|
||||
switch (dm[0]) {
|
||||
case 'U':
|
||||
case_conv |= UP_SECT;
|
||||
case_conv &= ~LOW_SECT;
|
||||
break;
|
||||
case 'u':
|
||||
case_conv |= UP_CHAR;
|
||||
break;
|
||||
case 'L':
|
||||
case_conv |= LOW_SECT;
|
||||
case_conv &= ~UP_SECT;
|
||||
break;
|
||||
case 'l':
|
||||
case_conv |= LOW_CHAR;
|
||||
break;
|
||||
case 'E':
|
||||
case_conv = NO_CONV;
|
||||
break;
|
||||
default:
|
||||
/* Backslash as quote mark */
|
||||
convert_case (dm, &case_conv, &actual, &remain);
|
||||
}
|
||||
break;
|
||||
} else {
|
||||
j++;
|
||||
if (!isdigit ((unsigned char) ctx->dest_mask[j])) {
|
||||
/* Backslash followed by non-digit */
|
||||
switch (ctx->dest_mask[j]) {
|
||||
case 'U':
|
||||
case_conv |= UP_SECT;
|
||||
case_conv &= ~LOW_SECT;
|
||||
break;
|
||||
case 'u':
|
||||
case_conv |= UP_CHAR;
|
||||
break;
|
||||
case 'L':
|
||||
case_conv |= LOW_SECT;
|
||||
case_conv &= ~UP_SECT;
|
||||
break;
|
||||
case 'l':
|
||||
case_conv |= LOW_CHAR;
|
||||
break;
|
||||
case 'E':
|
||||
case_conv = NO_CONV;
|
||||
break;
|
||||
default:
|
||||
/* Backslash as quote mark */
|
||||
fntarget[k++] =
|
||||
convert_case (ctx->dest_mask[j], &case_conv);
|
||||
}
|
||||
break;
|
||||
} else {
|
||||
/* Backslash followed by digit */
|
||||
next_reg = ctx->dest_mask[j] - '0';
|
||||
/* Fall through */
|
||||
}
|
||||
/* Backslash followed by digit */
|
||||
next_reg = dm[0] - '0';
|
||||
/* Fall through */
|
||||
}
|
||||
|
||||
case '*':
|
||||
@ -223,18 +239,28 @@ do_transform_source (FileOpContext *ctx, const char *source)
|
||||
transform_error = FILE_ABORT;
|
||||
return NULL;
|
||||
}
|
||||
for (l = (size_t) ctx->regs.start[next_reg];
|
||||
l < (size_t) ctx->regs.end[next_reg]; l++)
|
||||
fntarget[k++] = convert_case (fnsource[l], &case_conv);
|
||||
for (fn = fnsource + ctx->regs.start[next_reg];
|
||||
fn < fnsource + ctx->regs.end[next_reg] && remain > 1; ) {
|
||||
|
||||
if (str_is_valid_char (fn, -1) == 1) {
|
||||
convert_case (fn, &case_conv, &actual, &remain);
|
||||
str_cnext_char (&fn);
|
||||
} else {
|
||||
actual[0] = fn[0];
|
||||
actual++;
|
||||
remain--;
|
||||
fn++;
|
||||
}
|
||||
}
|
||||
next_reg++;
|
||||
break;
|
||||
|
||||
default:
|
||||
fntarget[k++] = convert_case (ctx->dest_mask[j], &case_conv);
|
||||
convert_case (dm, &case_conv, &actual, &remain);
|
||||
break;
|
||||
}
|
||||
}
|
||||
fntarget[k] = 0;
|
||||
actual[0] = '\0';
|
||||
return fntarget;
|
||||
}
|
||||
|
||||
@ -1679,13 +1705,13 @@ panel_operate_generate_prompt (const WPanel *panel, const int operation,
|
||||
*dp = '\0';
|
||||
|
||||
if (single_source) {
|
||||
i = fmd_xlen - strlen (format_string) - 4;
|
||||
i = fmd_xlen - str_term_width1 (format_string) - 4;
|
||||
g_snprintf (cmd_buf, sizeof (cmd_buf), format_string,
|
||||
name_trunc (single_source, i));
|
||||
str_trunc (single_source, i));
|
||||
} else {
|
||||
g_snprintf (cmd_buf, sizeof (cmd_buf), format_string,
|
||||
panel->marked);
|
||||
i = strlen (cmd_buf) + 6 - fmd_xlen;
|
||||
i = str_term_width1 (cmd_buf) + 6 - fmd_xlen;
|
||||
if (i > 0) {
|
||||
fmd_xlen += i;
|
||||
fmd_init_i18n (TRUE); /* to recalculate positions of child widgets */
|
||||
@ -2116,15 +2142,15 @@ file_error (const char *format, const char *file)
|
||||
static FileProgressStatus
|
||||
files_error (const char *format, const char *file1, const char *file2)
|
||||
{
|
||||
char nfile1[16];
|
||||
char nfile2[16];
|
||||
|
||||
strcpy (nfile1, path_trunc (file1, 15));
|
||||
strcpy (nfile2, path_trunc (file2, 15));
|
||||
char *nfile1 = g_strdup (path_trunc (file1, 15));
|
||||
char *nfile2 = g_strdup (path_trunc (file2, 15));
|
||||
|
||||
g_snprintf (cmd_buf, sizeof (cmd_buf), format, nfile1, nfile2,
|
||||
unix_error_string (errno));
|
||||
|
||||
g_free (nfile1);
|
||||
g_free (nfile2);
|
||||
|
||||
return do_file_error (cmd_buf);
|
||||
}
|
||||
|
||||
|
@ -65,6 +65,7 @@
|
||||
#include "filegui.h"
|
||||
#include "key.h" /* get_event */
|
||||
#include "util.h" /* strip_password() */
|
||||
#include "strutil.h"
|
||||
|
||||
/* }}} */
|
||||
|
||||
@ -423,7 +424,7 @@ file_progress_show_bytes (FileOpContext *ctx, double done, double total)
|
||||
|
||||
/* }}} */
|
||||
|
||||
#define truncFileString(ui, s) name_trunc (s, ui->eta_extra + 47)
|
||||
#define truncFileString(ui, s) str_trunc (s, ui->eta_extra + 47)
|
||||
#define truncFileStringSecure(ui, s) path_trunc (s, ui->eta_extra + 47)
|
||||
|
||||
FileProgressStatus
|
||||
@ -563,8 +564,8 @@ init_replace (FileOpContext *ctx, enum OperationMode mode)
|
||||
* longest of "Overwrite..." labels
|
||||
* (assume "Target date..." are short enough)
|
||||
*/
|
||||
l1 = max (strlen (rd_widgets[6].text),
|
||||
strlen (rd_widgets[11].text));
|
||||
l1 = max (str_term_width1 (rd_widgets[6].text),
|
||||
str_term_width1 (rd_widgets[11].text));
|
||||
|
||||
/* longest of button rows */
|
||||
i = sizeof (rd_widgets) / sizeof (rd_widgets[0]);
|
||||
@ -575,7 +576,7 @@ init_replace (FileOpContext *ctx, enum OperationMode mode)
|
||||
l2 = max (l2, l);
|
||||
l = 0;
|
||||
}
|
||||
l += strlen (rd_widgets[i].text) + 4;
|
||||
l+= str_term_width1 (rd_widgets[i].text) + 4;
|
||||
}
|
||||
}
|
||||
l2 = max (l2, l); /* last row */
|
||||
@ -593,12 +594,12 @@ init_replace (FileOpContext *ctx, enum OperationMode mode)
|
||||
l = l1;
|
||||
}
|
||||
rd_widgets[i].xpos = l;
|
||||
l += strlen (rd_widgets[i].text) + 4;
|
||||
l+= str_term_width1 (rd_widgets[i].text) + 4;
|
||||
}
|
||||
}
|
||||
/* Abort button is centered */
|
||||
rd_widgets[1].xpos =
|
||||
(rd_xlen - strlen (rd_widgets[1].text) - 3) / 2;
|
||||
(rd_xlen - str_term_width1 (rd_widgets[1].text) - 3) / 2;
|
||||
}
|
||||
#endif /* ENABLE_NLS */
|
||||
|
||||
@ -616,8 +617,8 @@ init_replace (FileOpContext *ctx, enum OperationMode mode)
|
||||
|
||||
|
||||
ADD_RD_LABEL (ui, 0,
|
||||
name_trunc (ui->replace_filename,
|
||||
rd_trunc - strlen (rd_widgets[0].text)), 0);
|
||||
str_trunc (ui->replace_filename,
|
||||
rd_trunc - str_term_width1 (rd_widgets[0].text)), 0);
|
||||
ADD_RD_BUTTON (1);
|
||||
|
||||
ADD_RD_BUTTON (2);
|
||||
@ -804,36 +805,36 @@ fmd_init_i18n (int force)
|
||||
if (fmd_widgets[i].text[0] != '\0')
|
||||
fmd_widgets[i].text = _(fmd_widgets[i].text);
|
||||
|
||||
len = strlen (fmd_widgets[FMCB11].text)
|
||||
+ strlen (fmd_widgets[FMCB21].text) + 15;
|
||||
len = str_term_width1 (fmd_widgets[FMCB11].text)
|
||||
+ str_term_width1 (fmd_widgets[FMCB21].text) + 15;
|
||||
fmd_xlen = max (fmd_xlen, len);
|
||||
|
||||
len = strlen (fmd_widgets[FMCB12].text)
|
||||
+ strlen (fmd_widgets[FMCB22].text) + 15;
|
||||
len = str_term_width1 (fmd_widgets[FMCB12].text)
|
||||
+ str_term_width1 (fmd_widgets[FMCB22].text) + 15;
|
||||
fmd_xlen = max (fmd_xlen, len);
|
||||
|
||||
len = strlen (fmd_widgets[FMBRGT].text)
|
||||
+ strlen (fmd_widgets[FMBLFT].text) + 11;
|
||||
len = str_term_width1 (fmd_widgets[FMBRGT].text)
|
||||
+ str_term_width1 (fmd_widgets[FMBLFT].text) + 11;
|
||||
|
||||
#ifdef FMBMID
|
||||
len += strlen (fmd_widgets[FMBMID].text) + 6;
|
||||
len+= str_term_width1 (fmd_widgets[FMBMID].text) + 6;
|
||||
#endif
|
||||
|
||||
fmd_xlen = max (fmd_xlen, len + 4);
|
||||
|
||||
len = (fmd_xlen - (len + 6)) / 2;
|
||||
i = fmd_widgets[FMBLFT].relative_x = len + 3;
|
||||
i += strlen (fmd_widgets[FMBLFT].text) + 8;
|
||||
i+= str_term_width1 (fmd_widgets[FMBLFT].text) + 8;
|
||||
|
||||
#ifdef FMBMID
|
||||
fmd_widgets[FMBMID].relative_x = i;
|
||||
i += strlen (fmd_widgets[FMBMID].text) + 6;
|
||||
i+= str_term_width1 (fmd_widgets[FMBMID].text) + 6;
|
||||
#endif
|
||||
|
||||
fmd_widgets[FMBRGT].relative_x = i;
|
||||
|
||||
#define chkbox_xpos(i) \
|
||||
fmd_widgets [i].relative_x = fmd_xlen - strlen (fmd_widgets [i].text) - 6
|
||||
fmd_widgets [i].relative_x = fmd_xlen - str_term_width1 (fmd_widgets [i].text) - 6
|
||||
|
||||
chkbox_xpos (FMCB0);
|
||||
chkbox_xpos (FMCB21);
|
||||
|
38
src/find.c
38
src/find.c
@ -33,6 +33,7 @@
|
||||
#include "color.h"
|
||||
#include "setup.h"
|
||||
#include "find.h"
|
||||
#include "strutil.h"
|
||||
|
||||
/* Dialog manager and widgets */
|
||||
#include "dialog.h"
|
||||
@ -221,7 +222,7 @@ find_parameters (char **start_dir, char **pattern, char **content)
|
||||
int l1, maxlen = 0;
|
||||
|
||||
while (i--) {
|
||||
l1 = strlen (labs[i] = _(labs[i]));
|
||||
l1 = str_term_width1 (labs[i] = _(labs[i]));
|
||||
if (l1 > maxlen)
|
||||
maxlen = l1;
|
||||
}
|
||||
@ -230,7 +231,7 @@ find_parameters (char **start_dir, char **pattern, char **content)
|
||||
FIND_X = i;
|
||||
|
||||
for (i = sizeof (buts) / sizeof (buts[0]), l1 = 0; i--;) {
|
||||
l1 += strlen (buts[i] = _(buts[i]));
|
||||
l1 += str_term_width1 (buts[i] = _(buts[i]));
|
||||
}
|
||||
l1 += 21;
|
||||
if (l1 > FIND_X)
|
||||
@ -239,8 +240,8 @@ find_parameters (char **start_dir, char **pattern, char **content)
|
||||
ilen = FIND_X - 7 - maxlen; /* for the case of very long buttons :) */
|
||||
istart = FIND_X - 3 - ilen;
|
||||
|
||||
b1 = b0 + strlen (buts[0]) + 7;
|
||||
b2 = FIND_X - (strlen (buts[2]) + 6);
|
||||
b1 = b0 + str_term_width1 (buts[0]) + 7;
|
||||
b2 = FIND_X - (str_term_width1 (buts[2]) + 6);
|
||||
|
||||
i18n_flag = 1;
|
||||
case_label = _(case_label);
|
||||
@ -529,7 +530,7 @@ search_content (Dlg_head *h, const char *directory, const char *filename)
|
||||
if (file_fd == -1)
|
||||
return 0;
|
||||
|
||||
g_snprintf (buffer, sizeof (buffer), _("Grepping in %s"), name_trunc (filename, FIND2_X_USE));
|
||||
g_snprintf (buffer, sizeof (buffer), _("Grepping in %s"), str_trunc (filename, FIND2_X_USE));
|
||||
|
||||
status_update (buffer);
|
||||
mc_refresh ();
|
||||
@ -544,8 +545,6 @@ search_content (Dlg_head *h, const char *directory, const char *filename)
|
||||
int has_newline;
|
||||
char *p;
|
||||
int found = 0;
|
||||
typedef const char * (*search_fn) (const char *, const char *);
|
||||
search_fn search_func;
|
||||
|
||||
if (resuming) {
|
||||
/* We've been previously suspended, start from the previous position */
|
||||
@ -554,8 +553,6 @@ search_content (Dlg_head *h, const char *directory, const char *filename)
|
||||
pos = last_pos;
|
||||
}
|
||||
|
||||
search_func = (case_sensitive) ? cstrstr : cstrcasestr;
|
||||
|
||||
while ((p = get_line_at (file_fd, buffer, &pos, &n_read, sizeof (buffer), &has_newline)) && (ret_val == 0)){
|
||||
if (found == 0){ /* Search in binary line once */
|
||||
if (find_regex_flag) {
|
||||
@ -566,7 +563,8 @@ search_content (Dlg_head *h, const char *directory, const char *filename)
|
||||
found = 1;
|
||||
}
|
||||
} else {
|
||||
if (search_func (p, content_pattern) != NULL) {
|
||||
// str_case_search_first do not accept invalid strings
|
||||
if (str_is_valid_string (p) && str_search_first (p, content_pattern, case_sensitive) != NULL) {
|
||||
char *match = g_strdup_printf("%d:%s", line, filename);
|
||||
find_add_match (h, directory, match);
|
||||
found = TRUE;
|
||||
@ -666,7 +664,7 @@ do_search (struct Dlg_head *h)
|
||||
char buffer [BUF_SMALL];
|
||||
|
||||
g_snprintf (buffer, sizeof (buffer), _("Searching %s"),
|
||||
name_trunc (directory, FIND2_X_USE));
|
||||
str_trunc (directory, FIND2_X_USE));
|
||||
status_update (buffer);
|
||||
}
|
||||
/* mc_stat should not be called after mc_opendir
|
||||
@ -683,11 +681,17 @@ do_search (struct Dlg_head *h)
|
||||
dirp = mc_opendir (directory);
|
||||
} /* while (!dirp) */
|
||||
dp = mc_readdir (dirp);
|
||||
/* skip invalid filenames */
|
||||
while (dp != NULL && !str_is_valid_string (dp->d_name))
|
||||
dp = mc_readdir (dirp);
|
||||
} /* while (!dp) */
|
||||
|
||||
if (strcmp (dp->d_name, ".") == 0 ||
|
||||
strcmp (dp->d_name, "..") == 0){
|
||||
dp = mc_readdir (dirp);
|
||||
/* skip invalid filenames */
|
||||
while (dp != NULL && !str_is_valid_string (dp->d_name))
|
||||
dp = mc_readdir (dirp);
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -713,6 +717,9 @@ do_search (struct Dlg_head *h)
|
||||
}
|
||||
|
||||
dp = mc_readdir (dirp);
|
||||
/* skip invalid filenames */
|
||||
while (dp != NULL && !str_is_valid_string (dp->d_name))
|
||||
dp = mc_readdir (dirp);
|
||||
|
||||
/* Displays the nice dot */
|
||||
count++;
|
||||
@ -866,7 +873,7 @@ setup_gui (void)
|
||||
if (!i18n_flag) {
|
||||
register int i = sizeof (fbuts) / sizeof (fbuts[0]);
|
||||
while (i--)
|
||||
fbuts[i].len = strlen (fbuts[i].text = _(fbuts[i].text)) + 3;
|
||||
fbuts[i].len = str_term_width1 (fbuts[i].text = _(fbuts[i].text)) + 3;
|
||||
fbuts[2].len += 2; /* DEFPUSH_BUTTON */
|
||||
i18n_flag = 1;
|
||||
}
|
||||
@ -969,7 +976,9 @@ find_file (char *start_dir, char *pattern, char *content, char **dirname,
|
||||
|
||||
/* FIXME: Need to cleanup this, this ought to be passed non-globaly */
|
||||
find_pattern = pattern;
|
||||
content_pattern = content;
|
||||
content_pattern = (content != NULL && str_is_valid_string (content))
|
||||
? str_create_search_needle (content, case_sensitive)
|
||||
: NULL;
|
||||
|
||||
init_find_vars ();
|
||||
push_directory (start_dir);
|
||||
@ -1038,6 +1047,8 @@ find_file (char *start_dir, char *pattern, char *content, char **dirname,
|
||||
list->list[next_free].f.stale_link = stale_link;
|
||||
list->list[next_free].f.dir_size_computed = 0;
|
||||
list->list[next_free].st = st;
|
||||
list->list[next_free].sort_key = NULL;
|
||||
list->list[next_free].second_sort_key = NULL;
|
||||
next_free++;
|
||||
if (!(next_free & 15))
|
||||
rotate_dash ();
|
||||
@ -1059,6 +1070,7 @@ find_file (char *start_dir, char *pattern, char *content, char **dirname,
|
||||
}
|
||||
}
|
||||
|
||||
if (content_pattern != NULL) str_release_search_needle (content_pattern, case_sensitive);
|
||||
kill_gui ();
|
||||
do_search (0); /* force do_search to release resources */
|
||||
g_free (old_dir);
|
||||
|
86
src/help.c
86
src/help.c
@ -58,6 +58,7 @@
|
||||
#include "dialog.h" /* For Dlg_head */
|
||||
#include "widget.h" /* For Widget */
|
||||
#include "wtools.h" /* For common_dialog_repaint() */
|
||||
#include "strutil.h"
|
||||
|
||||
#define MAXLINKNAME 80
|
||||
#define HISTORY_SIZE 20
|
||||
@ -68,7 +69,13 @@
|
||||
#define STRING_LINK_END "\03"
|
||||
#define STRING_NODE_END "\04"
|
||||
|
||||
static char *data; /* Pointer to the loaded data file */
|
||||
/* every help file is supposed to be in utf-8 and is translated to terminal
|
||||
* encoding */
|
||||
/* buffer for translation */
|
||||
static struct str_buffer *translated_data = NULL;
|
||||
/* point into translated_data->data or in NULL,
|
||||
* if help file could not be converted */
|
||||
static char *data;
|
||||
static int help_lines; /* Lines in help viewer */
|
||||
static int history_ptr; /* For the history queue */
|
||||
static const char *main_node; /* The main node */
|
||||
@ -112,7 +119,7 @@ search_string (const char *start, const char *text)
|
||||
while (*d){
|
||||
if (*d == '\n')
|
||||
*d = ' ';
|
||||
d++;
|
||||
str_next_char (&d);
|
||||
}
|
||||
/* Do search */
|
||||
for (d = local_text; *e; e++){
|
||||
@ -173,7 +180,9 @@ static const char *move_forward2 (const char *c, int lines)
|
||||
int line;
|
||||
|
||||
currentpoint = c;
|
||||
for (line = 0, p = currentpoint; *p && *p != CHAR_NODE_END; p++){
|
||||
for (line = 0, p = currentpoint; *p && *p != CHAR_NODE_END;
|
||||
str_cnext_char (&p)){
|
||||
|
||||
if (line == lines)
|
||||
return currentpoint = p;
|
||||
if (*p == '\n')
|
||||
@ -188,12 +197,14 @@ static const char *move_backward2 (const char *c, int lines)
|
||||
int line;
|
||||
|
||||
currentpoint = c;
|
||||
for (line = 0, p = currentpoint; *p && p >= data; p--){
|
||||
for (line = 0, p = currentpoint; *p && p >= data;
|
||||
str_cprev_char (&p)) {
|
||||
|
||||
if (*p == CHAR_NODE_END)
|
||||
{
|
||||
/* We reached the beginning of the node */
|
||||
/* Skip the node headers */
|
||||
while (*p != ']') p++;
|
||||
while (*p != ']') str_cnext_char (&p);
|
||||
return currentpoint = p + 2; /* Skip the newline following the start of the node */
|
||||
}
|
||||
if (*(p - 1) == '\n')
|
||||
@ -333,12 +344,13 @@ static void clear_link_areas (void)
|
||||
|
||||
static void help_show (Dlg_head *h, const char *paint_start)
|
||||
{
|
||||
const char *p;
|
||||
int col, line, c;
|
||||
const char *p, *n;
|
||||
int col, line, c, w;
|
||||
int painting = 1;
|
||||
int acs; /* Flag: Alternate character set active? */
|
||||
int repeat_paint;
|
||||
int active_col, active_line;/* Active link position */
|
||||
static char buff[MB_LEN_MAX + 1];
|
||||
|
||||
attrset (HELP_NORMAL_COLOR);
|
||||
do {
|
||||
@ -349,8 +361,15 @@ static void help_show (Dlg_head *h, const char *paint_start)
|
||||
if (selected_item < paint_start)
|
||||
selected_item = NULL;
|
||||
|
||||
for (p = paint_start; *p && *p != CHAR_NODE_END && line < help_lines; p++) {
|
||||
c = (unsigned char)*p;
|
||||
p = paint_start;
|
||||
n = paint_start;
|
||||
while (n[0] != '\0' && n[0] != CHAR_NODE_END && line < help_lines) {
|
||||
p = n;
|
||||
n = str_cget_next_char (p);
|
||||
memcpy (buff, p, n - p);
|
||||
buff[n - p] = '\0';
|
||||
c = (unsigned char) buff[0];
|
||||
|
||||
switch (c){
|
||||
case CHAR_LINK_START:
|
||||
if (selected_item == NULL)
|
||||
@ -383,7 +402,7 @@ static void help_show (Dlg_head *h, const char *paint_start)
|
||||
case CHAR_VERSION:
|
||||
dlg_move (h, line+2, col+2);
|
||||
addstr (VERSION);
|
||||
col += strlen (VERSION);
|
||||
col += str_term_width1 (VERSION);
|
||||
break;
|
||||
case CHAR_FONT_BOLD:
|
||||
attrset (HELP_BOLD_COLOR);
|
||||
@ -399,12 +418,13 @@ static void help_show (Dlg_head *h, const char *paint_start)
|
||||
col = 0;
|
||||
break;
|
||||
case '\t':
|
||||
col = (col/8 + 1) * 8;
|
||||
col = (col / 8 + 1) * 8;
|
||||
break;
|
||||
default:
|
||||
if (!painting)
|
||||
continue;
|
||||
if (col > HELP_WINDOW_WIDTH-1)
|
||||
w = str_term_width1 (buff);
|
||||
if (col + w > HELP_WINDOW_WIDTH)
|
||||
continue;
|
||||
|
||||
dlg_move (h, line+2, col+2);
|
||||
@ -417,9 +437,10 @@ static void help_show (Dlg_head *h, const char *paint_start)
|
||||
#else
|
||||
SLsmg_draw_object (h->y + line + 2, h->x + col + 2, c);
|
||||
#endif
|
||||
} else
|
||||
addch (c);
|
||||
col++;
|
||||
} else {
|
||||
addstr (buff);
|
||||
}
|
||||
col+= w;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -752,7 +773,28 @@ static void
|
||||
interactive_display_finish (void)
|
||||
{
|
||||
clear_link_areas ();
|
||||
g_free (data);
|
||||
}
|
||||
|
||||
/* translate help file into terminal encoding
|
||||
* translated_data is initialized */
|
||||
static void
|
||||
translate_file (char *filedata)
|
||||
{
|
||||
str_conv_t conv;
|
||||
|
||||
if (translated_data == NULL) translated_data = str_get_buffer ();
|
||||
|
||||
str_reset_buffer (translated_data);
|
||||
conv = str_crt_conv_from ("UTF-8");
|
||||
|
||||
if (conv != INVALID_CONV) {
|
||||
if (str_convert (conv, filedata, translated_data) != ESTR_FAILURE) {
|
||||
data = translated_data->data;
|
||||
} else {
|
||||
data = NULL;
|
||||
}
|
||||
str_close_conv (conv);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
@ -761,11 +803,12 @@ interactive_display (const char *filename, const char *node)
|
||||
WButtonBar *help_bar;
|
||||
Widget *md;
|
||||
char *hlpfile = NULL;
|
||||
char *filedata;
|
||||
|
||||
if (filename)
|
||||
data = load_file (filename);
|
||||
filedata = load_file (filename);
|
||||
else
|
||||
data = load_mc_home_file ("mc.hlp", &hlpfile);
|
||||
filedata = load_mc_home_file ("mc.hlp", &hlpfile);
|
||||
|
||||
if (data == NULL) {
|
||||
message (D_ERROR, MSG_ERROR, _(" Cannot open file %s \n %s "), filename ? filename : hlpfile,
|
||||
@ -775,6 +818,13 @@ interactive_display (const char *filename, const char *node)
|
||||
if (!filename)
|
||||
g_free (hlpfile);
|
||||
|
||||
if (filedata == NULL)
|
||||
return;
|
||||
|
||||
translate_file (filedata);
|
||||
|
||||
g_free (filedata);
|
||||
|
||||
if (!data)
|
||||
return;
|
||||
|
||||
|
113
src/hotlist.c
113
src/hotlist.c
@ -51,6 +51,7 @@
|
||||
#include "command.h" /* cmdline */
|
||||
#include "glibcompat.h" /* g_strlcpy for glib < 2.0 */
|
||||
#include "history.h"
|
||||
#include "strutil.h"
|
||||
|
||||
#define UX 5
|
||||
#define UY 2
|
||||
@ -189,15 +190,15 @@ update_path_name (void)
|
||||
}
|
||||
if (!hotlist_state.moving)
|
||||
label_set_text (pname,
|
||||
name_trunc (text, dlg->cols - (UX * 2 + 4)));
|
||||
str_trunc (text, dlg->cols - (UX * 2 + 4)));
|
||||
|
||||
p = g_strconcat (" ", current_group->label, " ", (char *) NULL);
|
||||
if (!hotlist_state.moving)
|
||||
label_set_text (pname_group,
|
||||
name_trunc (p, dlg->cols - (UX * 2 + 4)));
|
||||
str_trunc (p, dlg->cols - (UX * 2 + 4)));
|
||||
else
|
||||
label_set_text (movelist_group,
|
||||
name_trunc (p, dlg->cols - (UX * 2 + 4)));
|
||||
str_trunc (p, dlg->cols - (UX * 2 + 4)));
|
||||
g_free (p);
|
||||
|
||||
dlg_redraw (dlg);
|
||||
@ -217,23 +218,20 @@ do { \
|
||||
static void fill_listbox (void)
|
||||
{
|
||||
struct hotlist *current = current_group->head;
|
||||
static char *buf;
|
||||
static int buflen;
|
||||
struct str_buffer *buff;
|
||||
|
||||
if (!buf)
|
||||
buf = g_malloc (buflen = 1024);
|
||||
buf[0] = '\0';
|
||||
buff = str_get_buffer ();
|
||||
|
||||
while (current){
|
||||
switch (current->type) {
|
||||
case HL_TYPE_GROUP:
|
||||
{
|
||||
CHECK_BUFFER;
|
||||
strcat (strcat (buf, "->"), current->label);
|
||||
str_insert_string ("->", buff);
|
||||
str_insert_string (current->label, buff);
|
||||
if (hotlist_state.moving)
|
||||
listbox_add_item (l_movelist, 0, 0, buf, current);
|
||||
listbox_add_item (l_movelist, 0, 0, buff->data, current);
|
||||
else
|
||||
listbox_add_item (l_hotlist, 0, 0, buf, current);
|
||||
listbox_add_item (l_hotlist, 0, 0, buff->data, current);
|
||||
}
|
||||
break;
|
||||
case HL_TYPE_DOTDOT:
|
||||
@ -248,9 +246,9 @@ static void fill_listbox (void)
|
||||
}
|
||||
current = current->next;
|
||||
}
|
||||
}
|
||||
|
||||
#undef CHECK_BUFFER
|
||||
str_release_buffer (buff);
|
||||
}
|
||||
|
||||
static void
|
||||
unlink_entry (struct hotlist *entry)
|
||||
@ -564,7 +562,7 @@ init_i18n_stuff(int list_type, int cols)
|
||||
|
||||
row = hotlist_but [i].y;
|
||||
++count [row];
|
||||
len [row] += strlen (hotlist_but [i].text) + 5;
|
||||
len [row] += str_term_width1 (hotlist_but [i].text) + 5;
|
||||
if (hotlist_but [i].flags == DEFPUSH_BUTTON)
|
||||
len [row] += 2;
|
||||
}
|
||||
@ -589,12 +587,12 @@ init_i18n_stuff(int list_type, int cols)
|
||||
/* not first int the row */
|
||||
if (!strcmp (hotlist_but [i].text, cancel_but))
|
||||
hotlist_but [i].x =
|
||||
cols - strlen (hotlist_but [i].text) - 13;
|
||||
cols - str_term_width1 (hotlist_but [i].text) - 13;
|
||||
else
|
||||
hotlist_but [i].x = cur_x [row];
|
||||
}
|
||||
|
||||
cur_x [row] += strlen (hotlist_but [i].text) + 2
|
||||
cur_x [row] += str_term_width1 (hotlist_but [i].text) + 2
|
||||
+ (hotlist_but [i].flags == DEFPUSH_BUTTON ? 5 : 3);
|
||||
}
|
||||
}
|
||||
@ -835,7 +833,7 @@ static void add_widgets_i18n(QuickWidget* qw, int len)
|
||||
for (i = 0; i < 3; i++)
|
||||
{
|
||||
qw [i].text = _(qw [i].text);
|
||||
l[i] = strlen (qw [i].text) + 3;
|
||||
l[i] = str_term_width1 (qw [i].text) + 3;
|
||||
}
|
||||
space = (len - 4 - l[0] - l[1] - l[2]) / 4;
|
||||
|
||||
@ -884,7 +882,7 @@ add_new_entry_input (const char *header, const char *text1, const char *text2,
|
||||
|
||||
msglen(text1, &lines1, &cols1);
|
||||
msglen(text2, &lines2, &cols2);
|
||||
len = max ((int) strlen (header), cols1);
|
||||
len = max (str_term_width1 (header), cols1);
|
||||
len = max (len, cols2) + 4;
|
||||
len = max (len, 64);
|
||||
|
||||
@ -980,7 +978,7 @@ add_new_group_input (const char *header, const char *label, char **result)
|
||||
#endif /* ENABLE_NLS */
|
||||
|
||||
msglen (label, &lines, &cols);
|
||||
len = max ((int) strlen (header), cols) + 4;
|
||||
len = max (str_term_width1 (header), cols) + 4;
|
||||
len = max (len, 64);
|
||||
|
||||
#ifdef ENABLE_NLS
|
||||
@ -1036,7 +1034,7 @@ void add2hotlist_cmd (void)
|
||||
{
|
||||
char *prompt, *label;
|
||||
const char *cp = _("Label for \"%s\":");
|
||||
int l = strlen (cp);
|
||||
int l = str_term_width1 (cp);
|
||||
char *label_string = g_strdup (current_panel->cwd);
|
||||
|
||||
strip_password (label_string, 1);
|
||||
@ -1083,7 +1081,7 @@ static void remove_from_hotlist (struct hotlist *entry)
|
||||
int result;
|
||||
|
||||
title = g_strconcat (_(" Remove: "),
|
||||
name_trunc (entry->label, 30),
|
||||
str_trunc (entry->label, 30),
|
||||
" ",
|
||||
NULL);
|
||||
|
||||
@ -1105,7 +1103,7 @@ static void remove_from_hotlist (struct hotlist *entry)
|
||||
int result;
|
||||
|
||||
header = g_strconcat (_(" Remove: "),
|
||||
name_trunc (entry->label, 30),
|
||||
str_trunc (entry->label, 30),
|
||||
" ",
|
||||
NULL);
|
||||
result = query_dialog (header, _("\n Group not empty.\n Remove it?"),
|
||||
@ -1205,9 +1203,7 @@ load_group (struct hotlist *grp)
|
||||
#define TKN_EOF 126
|
||||
#define TKN_UNKNOWN 127
|
||||
|
||||
static char *tkn_buf;
|
||||
static int tkn_buf_length;
|
||||
static int tkn_length;
|
||||
static struct str_buffer *tkn_buf = NULL;
|
||||
|
||||
static char *hotlist_file_name;
|
||||
static FILE *hotlist_file;
|
||||
@ -1217,7 +1213,7 @@ static int hot_skip_blanks (void)
|
||||
{
|
||||
int c;
|
||||
|
||||
while ((c = getc (hotlist_file)) != EOF && c != '\n' && isspace (c))
|
||||
while ((c = getc (hotlist_file)) != EOF && c != '\n' && g_ascii_isspace (c))
|
||||
;
|
||||
return c;
|
||||
|
||||
@ -1226,15 +1222,10 @@ static int hot_skip_blanks (void)
|
||||
static int hot_next_token (void)
|
||||
{
|
||||
int c;
|
||||
size_t l;
|
||||
|
||||
#define CHECK_BUF() \
|
||||
do { \
|
||||
if (tkn_length == tkn_buf_length) \
|
||||
tkn_buf = tkn_buf ? ( g_realloc (tkn_buf, tkn_buf_length += 1024)) \
|
||||
: ( g_malloc (tkn_buf_length = 1024)); \
|
||||
} while (0)
|
||||
|
||||
tkn_length = 0;
|
||||
if (tkn_buf == NULL) tkn_buf = str_get_buffer ();
|
||||
str_reset_buffer (tkn_buf);
|
||||
|
||||
again:
|
||||
c = hot_skip_blanks ();
|
||||
@ -1247,15 +1238,8 @@ again:
|
||||
break;
|
||||
case '#':
|
||||
while ((c = getc (hotlist_file)) != EOF && c != '\n') {
|
||||
if (c == EOF)
|
||||
return TKN_EOF;
|
||||
if (c != '\n') {
|
||||
CHECK_BUF();
|
||||
tkn_buf[tkn_length++] = c == '\n' ? ' ' : c;
|
||||
str_insert_char (c, tkn_buf);
|
||||
}
|
||||
}
|
||||
CHECK_BUF();
|
||||
tkn_buf[tkn_length] = '\0';
|
||||
return TKN_COMMENT;
|
||||
break;
|
||||
case '"':
|
||||
@ -1263,13 +1247,10 @@ again:
|
||||
if (c == '\\')
|
||||
if ((c = getc (hotlist_file)) == EOF)
|
||||
return TKN_EOF;
|
||||
CHECK_BUF();
|
||||
tkn_buf[tkn_length++] = c == '\n' ? ' ' : c;
|
||||
str_insert_char (c == '\n' ? ' ' : c, tkn_buf);
|
||||
}
|
||||
if (c == EOF)
|
||||
return TKN_EOF;
|
||||
CHECK_BUF();
|
||||
tkn_buf[tkn_length] = '\0';
|
||||
return TKN_STRING;
|
||||
break;
|
||||
case '\\':
|
||||
@ -1282,20 +1263,19 @@ again:
|
||||
|
||||
default:
|
||||
do {
|
||||
CHECK_BUF();
|
||||
tkn_buf[tkn_length++] = toupper(c);
|
||||
} while ((c = fgetc (hotlist_file)) != EOF && isalnum (c));
|
||||
str_insert_char (g_ascii_toupper (c), tkn_buf);
|
||||
} while ((c = fgetc (hotlist_file)) != EOF &&
|
||||
(g_ascii_isalnum (c) || !isascii (c)));
|
||||
if (c != EOF)
|
||||
ungetc (c, hotlist_file);
|
||||
CHECK_BUF();
|
||||
tkn_buf[tkn_length] = '\0';
|
||||
if (strncmp (tkn_buf, "GROUP", tkn_length) == 0)
|
||||
l = tkn_buf->size - tkn_buf->remain;
|
||||
if (strncmp (tkn_buf->data, "GROUP", l) == 0)
|
||||
return TKN_GROUP;
|
||||
else if (strncmp (tkn_buf, "ENTRY", tkn_length) == 0)
|
||||
else if (strncmp (tkn_buf->data, "ENTRY", l) == 0)
|
||||
return TKN_ENTRY;
|
||||
else if (strncmp (tkn_buf, "ENDGROUP", tkn_length) == 0)
|
||||
else if (strncmp (tkn_buf->data, "ENDGROUP", l) == 0)
|
||||
return TKN_ENDGROUP;
|
||||
else if (strncmp (tkn_buf, "URL", tkn_length) == 0)
|
||||
else if (strncmp (tkn_buf->data, "URL", l) == 0)
|
||||
return TKN_URL;
|
||||
else
|
||||
return TKN_UNKNOWN;
|
||||
@ -1330,22 +1310,22 @@ hot_load_group (struct hotlist * grp)
|
||||
switch (tkn) {
|
||||
case TKN_GROUP:
|
||||
CHECK_TOKEN(TKN_STRING);
|
||||
new_grp = add2hotlist (g_strdup (tkn_buf), 0, HL_TYPE_GROUP, 0);
|
||||
new_grp = add2hotlist (g_strdup (tkn_buf->data), 0, HL_TYPE_GROUP, 0);
|
||||
SKIP_TO_EOL;
|
||||
hot_load_group (new_grp);
|
||||
current_group = grp;
|
||||
break;
|
||||
case TKN_ENTRY:
|
||||
CHECK_TOKEN(TKN_STRING);
|
||||
label = g_strdup (tkn_buf);
|
||||
label = g_strdup (tkn_buf->data);
|
||||
CHECK_TOKEN(TKN_URL);
|
||||
CHECK_TOKEN(TKN_STRING);
|
||||
url = g_strdup (tkn_buf);
|
||||
url = g_strdup (tkn_buf->data);
|
||||
add2hotlist (label, url, HL_TYPE_ENTRY, 0);
|
||||
SKIP_TO_EOL;
|
||||
break;
|
||||
case TKN_COMMENT:
|
||||
label = g_strdup (tkn_buf);
|
||||
label = g_strdup (tkn_buf->data);
|
||||
add2hotlist (label, 0, HL_TYPE_COMMENT, 0);
|
||||
break;
|
||||
case TKN_EOF:
|
||||
@ -1378,22 +1358,22 @@ hot_load_file (struct hotlist * grp)
|
||||
switch (tkn) {
|
||||
case TKN_GROUP:
|
||||
CHECK_TOKEN(TKN_STRING);
|
||||
new_grp = add2hotlist (g_strdup (tkn_buf), 0, HL_TYPE_GROUP, 0);
|
||||
new_grp = add2hotlist (g_strdup (tkn_buf->data), 0, HL_TYPE_GROUP, 0);
|
||||
SKIP_TO_EOL;
|
||||
hot_load_group (new_grp);
|
||||
current_group = grp;
|
||||
break;
|
||||
case TKN_ENTRY:
|
||||
CHECK_TOKEN(TKN_STRING);
|
||||
label = g_strdup (tkn_buf);
|
||||
label = g_strdup (tkn_buf->data);
|
||||
CHECK_TOKEN(TKN_URL);
|
||||
CHECK_TOKEN(TKN_STRING);
|
||||
url = g_strdup (tkn_buf);
|
||||
url = g_strdup (tkn_buf->data);
|
||||
add2hotlist (label, url, HL_TYPE_ENTRY, 0);
|
||||
SKIP_TO_EOL;
|
||||
break;
|
||||
case TKN_COMMENT:
|
||||
label = g_strdup (tkn_buf);
|
||||
label = g_strdup (tkn_buf->data);
|
||||
add2hotlist (label, 0, HL_TYPE_COMMENT, 0);
|
||||
break;
|
||||
case TKN_EOL:
|
||||
@ -1597,10 +1577,9 @@ void done_hotlist (void)
|
||||
hotlist_file_name = 0;
|
||||
l_hotlist = 0;
|
||||
current_group = 0;
|
||||
|
||||
if (tkn_buf){
|
||||
g_free (tkn_buf);
|
||||
tkn_buf_length = 0;
|
||||
tkn_length = 0;
|
||||
str_release_buffer (tkn_buf);
|
||||
tkn_buf = NULL;
|
||||
}
|
||||
}
|
||||
|
37
src/info.c
37
src/info.c
@ -34,6 +34,7 @@
|
||||
#include "key.h" /* is_idle() */
|
||||
#include "mountlist.h"
|
||||
#include "unixcompat.h"
|
||||
#include "strutil.h"
|
||||
|
||||
#ifndef VERSION
|
||||
# define VERSION "undefined"
|
||||
@ -62,6 +63,7 @@ info_show_info (struct WInfo *info)
|
||||
{
|
||||
static int i18n_adjust=0;
|
||||
static const char *file_label;
|
||||
struct str_buffer *buff;
|
||||
|
||||
struct stat st;
|
||||
|
||||
@ -89,9 +91,11 @@ info_show_info (struct WInfo *info)
|
||||
if(!i18n_adjust) {
|
||||
/* This printf pattern string is used as a reference for size */
|
||||
file_label=_("File: %s");
|
||||
i18n_adjust=strlen(file_label)+2;
|
||||
i18n_adjust = str_term_width1(file_label) + 2;
|
||||
}
|
||||
|
||||
buff = str_get_buffer ();
|
||||
|
||||
switch (info->widget.lines-2){
|
||||
/* Note: all cases are fall-throughs */
|
||||
|
||||
@ -129,21 +133,26 @@ info_show_info (struct WInfo *info)
|
||||
|
||||
case 13:
|
||||
widget_move (&info->widget, 13, 3);
|
||||
tty_printf (_("Device: %s"),
|
||||
name_trunc (myfs_stats.device, info->widget.cols - i18n_adjust));
|
||||
str_printf (buff, _("Device: %s"),
|
||||
str_trunc (myfs_stats.device, info->widget.cols - i18n_adjust));
|
||||
addstr (str_term_form (buff->data));
|
||||
str_reset_buffer (buff);
|
||||
case 12:
|
||||
widget_move (&info->widget, 12, 3);
|
||||
tty_printf (_("Filesystem: %s"),
|
||||
name_trunc (myfs_stats.mpoint, info->widget.cols - i18n_adjust));
|
||||
|
||||
str_printf (buff, _("Filesystem: %s"),
|
||||
str_trunc (myfs_stats.mpoint, info->widget.cols - i18n_adjust));
|
||||
addstr (str_term_form (buff->data));
|
||||
str_reset_buffer (buff);
|
||||
case 11:
|
||||
widget_move (&info->widget, 11, 3);
|
||||
tty_printf (_("Accessed: %s"), file_date (st.st_atime));
|
||||
|
||||
str_printf (buff, _("Accessed: %s"), file_date (st.st_atime));
|
||||
addstr (str_term_form (buff->data));
|
||||
str_reset_buffer (buff);
|
||||
case 10:
|
||||
widget_move (&info->widget, 10, 3);
|
||||
tty_printf (_("Modified: %s"), file_date (st.st_mtime));
|
||||
|
||||
str_printf (buff, _("Modified: %s"), file_date (st.st_mtime));
|
||||
addstr (str_term_form (buff->data));
|
||||
str_reset_buffer (buff);
|
||||
case 9:
|
||||
widget_move (&info->widget, 9, 3);
|
||||
/* TRANSLATORS: "Status changed", like in the stat(2) man page */
|
||||
@ -192,9 +201,11 @@ info_show_info (struct WInfo *info)
|
||||
widget_move (&info->widget, 3, 2);
|
||||
/* .ado: fname is invalid if selected == 0 && info called from current panel */
|
||||
if (current_panel->selected){
|
||||
tty_printf (file_label,
|
||||
name_trunc (current_panel->dir.list [current_panel->selected].fname,
|
||||
str_printf (buff, file_label,
|
||||
str_trunc (current_panel->dir.list [current_panel->selected].fname,
|
||||
info->widget.cols - i18n_adjust));
|
||||
addstr (str_term_form (buff->data));
|
||||
str_reset_buffer (buff);
|
||||
} else
|
||||
addstr (_("File: None"));
|
||||
|
||||
@ -203,6 +214,8 @@ info_show_info (struct WInfo *info)
|
||||
case 0:
|
||||
;
|
||||
} /* switch */
|
||||
|
||||
str_release_buffer (buff);
|
||||
}
|
||||
|
||||
static void info_hook (void *data)
|
||||
|
@ -825,7 +825,7 @@ int get_key_code (int no_delay)
|
||||
nodelay (stdscr, TRUE);
|
||||
}
|
||||
c = getch ();
|
||||
#if defined(USE_NCURSES) && defined(KEY_RESIZE)
|
||||
#if (defined(USE_NCURSES) || defined(USE_NCURSESW)) && defined(KEY_RESIZE)
|
||||
if (c == KEY_RESIZE)
|
||||
goto nodelay_try_again;
|
||||
#endif
|
||||
@ -928,7 +928,7 @@ int get_key_code (int no_delay)
|
||||
if (parent != NULL && parent->action == MCKEY_ESCAPE) {
|
||||
|
||||
/* Convert escape-digits to F-keys */
|
||||
if (isdigit(c))
|
||||
if (g_ascii_isdigit(c))
|
||||
c = KEY_F (c - '0');
|
||||
else if (c == ' ')
|
||||
c = ESC_CHAR;
|
||||
|
48
src/layout.c
48
src/layout.c
@ -57,6 +57,7 @@
|
||||
#include "subshell.h" /* For use_subshell and resize_subshell() */
|
||||
#include "tree.h"
|
||||
#include "menu.h"
|
||||
#include "strutil.h"
|
||||
|
||||
/* Needed for the extern declarations of integer parameters */
|
||||
#include "dir.h"
|
||||
@ -284,13 +285,13 @@ layout_callback (struct Dlg_head *h, dlg_msg_t msg, int parm)
|
||||
{
|
||||
switch (msg) {
|
||||
case DLG_DRAW:
|
||||
/*When repainting the whole dialog (e.g. with C-l) we have to
|
||||
update everything*/
|
||||
/*When repainting the whole dialog (e.g. with C-l) we have to
|
||||
update everything*/
|
||||
common_dialog_repaint (h);
|
||||
|
||||
old_first_panel_size = -1;
|
||||
old_horizontal_split = -1;
|
||||
old_output_lines = -1;
|
||||
old_first_panel_size = -1;
|
||||
old_horizontal_split = -1;
|
||||
old_output_lines = -1;
|
||||
|
||||
attrset (COLOR_HOT_NORMAL);
|
||||
update_split ();
|
||||
@ -301,7 +302,7 @@ layout_callback (struct Dlg_head *h, dlg_msg_t msg, int parm)
|
||||
old_output_lines = _output_lines;
|
||||
attrset (COLOR_NORMAL);
|
||||
dlg_move (h, LAYOUT_OPTIONS_COUNT, 16 + first_width);
|
||||
addstr (output_lines_label);
|
||||
addstr (str_term_form (output_lines_label));
|
||||
dlg_move (h, LAYOUT_OPTIONS_COUNT, 10 + first_width);
|
||||
tty_printf ("%02d", _output_lines);
|
||||
}
|
||||
@ -352,7 +353,7 @@ layout_callback (struct Dlg_head *h, dlg_msg_t msg, int parm)
|
||||
return MSG_HANDLED;
|
||||
|
||||
default:
|
||||
return default_dlg_callback (h, msg, parm);
|
||||
return default_dlg_callback (h, msg, parm);
|
||||
}
|
||||
}
|
||||
|
||||
@ -379,41 +380,40 @@ init_layout (void)
|
||||
|
||||
while (i--) {
|
||||
s_split_direction[i] = _(s_split_direction[i]);
|
||||
l1 = strlen (s_split_direction[i]) + 7;
|
||||
l1 = str_term_width1 (s_split_direction[i]) + 7;
|
||||
if (l1 > first_width)
|
||||
first_width = l1;
|
||||
}
|
||||
|
||||
for (i = 0; i < LAYOUT_OPTIONS_COUNT; i++) {
|
||||
check_options[i].text = _(check_options[i].text);
|
||||
l1 = strlen (check_options[i].text) + 7;
|
||||
l1 = str_term_width1 (check_options[i].text) + 7;
|
||||
if (l1 > first_width)
|
||||
first_width = l1;
|
||||
}
|
||||
|
||||
l1 = strlen (title1) + 1;
|
||||
l1 = str_term_width1 (title1) + 1;
|
||||
if (l1 > first_width)
|
||||
first_width = l1;
|
||||
|
||||
l1 = strlen (title2) + 1;
|
||||
l1 = str_term_width1 (title2) + 1;
|
||||
if (l1 > first_width)
|
||||
first_width = l1;
|
||||
|
||||
|
||||
second_width = strlen (title3) + 1;
|
||||
second_width = str_term_width1 (title3) + 1;
|
||||
for (i = 0; i < OTHER_OPTIONS_COUNT; i++) {
|
||||
check_options[i].text = _(check_options[i].text);
|
||||
l1 = strlen (check_options[i].text) + 7;
|
||||
l1 = str_term_width1 (check_options[i].text) + 7;
|
||||
if (l1 > second_width)
|
||||
second_width = l1;
|
||||
}
|
||||
if (console_flag) {
|
||||
l1 = strlen (output_lines_label) + 13;
|
||||
l1 = str_term_width1 (output_lines_label) + 13;
|
||||
if (l1 > second_width)
|
||||
second_width = l1;
|
||||
}
|
||||
|
||||
/*
|
||||
/*
|
||||
* alex@bcs.zp.ua:
|
||||
* To be completely correct, one need to check if the title
|
||||
* does not exceed dialog length and total length of 3 buttons
|
||||
@ -422,14 +422,14 @@ init_layout (void)
|
||||
*
|
||||
* Now the last thing to do - properly space buttons...
|
||||
*/
|
||||
l1 = 11 + strlen (ok_button) /* 14 - all brackets and inner space */
|
||||
+strlen (save_button) /* notice: it is 3 char less because */
|
||||
+strlen (cancel_button); /* of '&' char in button text */
|
||||
l1 = 11 + str_term_width1 (ok_button) /* 14 - all brackets and inner space */
|
||||
+ str_term_width1 (save_button) /* notice: it is 3 char less because */
|
||||
+ str_term_width1 (cancel_button); /* of '&' char in button text */
|
||||
|
||||
i = (first_width + second_width - l1) / 4;
|
||||
b1 = 5 + i;
|
||||
b2 = b1 + strlen (ok_button) + i + 6;
|
||||
b3 = b2 + strlen (save_button) + i + 4;
|
||||
b2 = b1 + str_term_width1 (ok_button) + i + 6;
|
||||
b3 = b2 + str_term_width1 (save_button) + i + 4;
|
||||
|
||||
i18n_layt_flag = 1;
|
||||
}
|
||||
@ -694,7 +694,7 @@ setup_panels (void)
|
||||
panel_do_cols (0);
|
||||
panel_do_cols (1);
|
||||
|
||||
promptl = strlen (prompt);
|
||||
promptl = str_term_width1 (prompt);
|
||||
|
||||
widget_set_size (&the_menubar->widget, 0, 0, 1, COLS);
|
||||
|
||||
@ -736,7 +736,7 @@ setup_panels (void)
|
||||
void flag_winch (int dummy)
|
||||
{
|
||||
(void) dummy;
|
||||
#ifndef USE_NCURSES /* don't do malloc in a signal handler */
|
||||
#if !(defined(USE_NCURSES) || defined(USE_NCURSESW)) /* don't do malloc in a signal handler */
|
||||
low_level_change_screen_size ();
|
||||
#endif
|
||||
winch_flag = 1;
|
||||
@ -847,7 +847,7 @@ void print_vfs_message (const char *msg, ...)
|
||||
|
||||
move (0, 0);
|
||||
attrset (NORMAL_COLOR);
|
||||
tty_printf ("%-*s", COLS-1, str);
|
||||
addstr (str_fit_to_term (str, COLS - 1, J_LEFT));
|
||||
|
||||
/* Restore cursor position */
|
||||
move(row, col);
|
||||
|
@ -42,6 +42,7 @@
|
||||
#include "main.h"
|
||||
#include "learn.h"
|
||||
#include "wtools.h"
|
||||
#include "strutil.h"
|
||||
|
||||
#define UX 4
|
||||
#define UY 3
|
||||
@ -202,7 +203,7 @@ learn_check_key (int c)
|
||||
|
||||
/* Prevent from disappearing if a non-defined sequence is pressed
|
||||
and contains a button hotkey. Only recognize hotkeys with ALT. */
|
||||
if (c < 255 && isalnum (c))
|
||||
if (c < 255 && g_ascii_isalnum (c))
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
@ -238,7 +239,7 @@ init_learn (void)
|
||||
learn_but[0].x = 78 / 2 + 4;
|
||||
|
||||
learn_but[1].text = _(learn_but[1].text);
|
||||
learn_but[1].x = 78 / 2 - (strlen (learn_but[1].text) + 9);
|
||||
learn_but[1].x = 78 / 2 - (str_term_width1 (learn_but[1].text) + 9);
|
||||
|
||||
learn_title = _(learn_title);
|
||||
i18n_flag = 1;
|
||||
|
186
src/main.c
186
src/main.c
@ -60,6 +60,7 @@
|
||||
#include "listmode.h"
|
||||
#include "execute.h"
|
||||
#include "ext.h" /* For flush_extension_file() */
|
||||
#include "strutil.h"
|
||||
|
||||
/* Listbox for the command history feature */
|
||||
#include "widget.h"
|
||||
@ -709,7 +710,7 @@ load_prompt (int fd, void *unused)
|
||||
int prompt_len;
|
||||
|
||||
tmp_prompt = strip_ctrl_codes (subshell_prompt);
|
||||
prompt_len = strlen (tmp_prompt);
|
||||
prompt_len = str_term_width1 (tmp_prompt);
|
||||
|
||||
/* Check for prompts too big */
|
||||
if (COLS > 8 && prompt_len > COLS - 8) {
|
||||
@ -807,76 +808,80 @@ listmode_cmd (void)
|
||||
|
||||
/* NOTICE: hotkeys specified here are overriden in menubar_paint_idx (alex) */
|
||||
static menu_entry LeftMenu[] = {
|
||||
{' ', N_("&Listing mode..."), 'L', listing_cmd},
|
||||
{' ', N_("&Quick view C-x q"), 'Q', quick_view_cmd},
|
||||
{' ', N_("&Info C-x i"), 'I', info_cmd},
|
||||
{' ', N_("&Tree"), 'T', tree_cmd},
|
||||
{' ', "", ' ', 0},
|
||||
{' ', N_("&Sort order..."), 'S', sort_cmd},
|
||||
{' ', "", ' ', 0},
|
||||
{' ', N_("&Filter..."), 'F', filter_cmd},
|
||||
{' ', N_("&Listing mode..."), NULL_HOTKEY, listing_cmd},
|
||||
{' ', N_("&Quick view C-x q"), NULL_HOTKEY, quick_view_cmd},
|
||||
{' ', N_("&Info C-x i"), NULL_HOTKEY, info_cmd},
|
||||
{' ', N_("&Tree"), NULL_HOTKEY, tree_cmd},
|
||||
{' ', "", NULL_HOTKEY, 0},
|
||||
{' ', N_("&Sort order..."), NULL_HOTKEY, sort_cmd},
|
||||
{' ', "", NULL_HOTKEY, 0},
|
||||
{' ', N_("&Filter..."), NULL_HOTKEY, filter_cmd},
|
||||
{' ', "",NULL_HOTKEY, 0},
|
||||
{' ', N_("&Encoding..."), NULL_HOTKEY, encoding_cmd},
|
||||
#ifdef USE_NETCODE
|
||||
{' ', "", ' ', 0},
|
||||
{' ', "", NULL_HOTKEY, 0},
|
||||
#ifdef WITH_MCFS
|
||||
{' ', N_("&Network link..."), 'N', netlink_cmd},
|
||||
{' ', N_("&Network link..."), NULL_HOTKEY, netlink_cmd},
|
||||
#endif
|
||||
{' ', N_("FT&P link..."), 'P', ftplink_cmd},
|
||||
{' ', N_("S&hell link..."), 'H', fishlink_cmd},
|
||||
{' ', N_("FT&P link..."), NULL_HOTKEY, ftplink_cmd},
|
||||
{' ', N_("S&hell link..."), NULL_HOTKEY, fishlink_cmd},
|
||||
#ifdef WITH_SMBFS
|
||||
{' ', N_("SM&B link..."), 'B', smblink_cmd},
|
||||
{' ', N_("SM&B link..."), NULL_HOTKEY, smblink_cmd},
|
||||
#endif
|
||||
#endif
|
||||
{' ', "", ' ', 0},
|
||||
{' ', N_("&Rescan C-r"), 'R', reread_cmd}
|
||||
{' ', "", NULL_HOTKEY, 0},
|
||||
{' ', N_("&Rescan C-r"), NULL_HOTKEY, reread_cmd}
|
||||
};
|
||||
|
||||
static menu_entry RightMenu[] = {
|
||||
{' ', N_("&Listing mode..."), 'L', listing_cmd},
|
||||
{' ', N_("&Quick view C-x q"), 'Q', quick_view_cmd},
|
||||
{' ', N_("&Info C-x i"), 'I', info_cmd},
|
||||
{' ', N_("&Tree"), 'T', tree_cmd},
|
||||
{' ', "", ' ', 0},
|
||||
{' ', N_("&Sort order..."), 'S', sort_cmd},
|
||||
{' ', "", ' ', 0},
|
||||
{' ', N_("&Filter..."), 'F', filter_cmd},
|
||||
{' ', N_("&Listing mode..."), NULL_HOTKEY, listing_cmd},
|
||||
{' ', N_("&Quick view C-x q"), NULL_HOTKEY, quick_view_cmd},
|
||||
{' ', N_("&Info C-x i"), NULL_HOTKEY, info_cmd},
|
||||
{' ', N_("&Tree"), NULL_HOTKEY, tree_cmd},
|
||||
{' ', "", NULL_HOTKEY, 0},
|
||||
{' ', N_("&Sort order..."), NULL_HOTKEY, sort_cmd},
|
||||
{' ', "", NULL_HOTKEY, 0},
|
||||
{' ', N_("&Filter..."), NULL_HOTKEY, filter_cmd},
|
||||
{' ', "",NULL_HOTKEY, 0},
|
||||
{' ', N_("&Encoding..."), NULL_HOTKEY, encoding_cmd},
|
||||
#ifdef USE_NETCODE
|
||||
{' ', "", ' ', 0},
|
||||
{' ', "", NULL_HOTKEY, 0},
|
||||
#ifdef WITH_MCFS
|
||||
{' ', N_("&Network link..."), 'N', netlink_cmd},
|
||||
{' ', N_("&Network link..."), NULL_HOTKEY, netlink_cmd},
|
||||
#endif
|
||||
{' ', N_("FT&P link..."), 'P', ftplink_cmd},
|
||||
{' ', N_("S&hell link..."), 'H', fishlink_cmd},
|
||||
{' ', N_("FT&P link..."), NULL_HOTKEY, ftplink_cmd},
|
||||
{' ', N_("S&hell link..."), NULL_HOTKEY, fishlink_cmd},
|
||||
#ifdef WITH_SMBFS
|
||||
{' ', N_("SM&B link..."), 'B', smblink_cmd},
|
||||
{' ', N_("SM&B link..."), NULL_HOTKEY, smblink_cmd},
|
||||
#endif
|
||||
#endif
|
||||
{' ', "", ' ', 0},
|
||||
{' ', N_("&Rescan C-r"), 'R', reread_cmd}
|
||||
{' ', "", NULL_HOTKEY, 0},
|
||||
{' ', N_("&Rescan C-r"), NULL_HOTKEY, reread_cmd}
|
||||
};
|
||||
|
||||
static menu_entry FileMenu[] = {
|
||||
{' ', N_("&User menu F2"), 'U', user_file_menu_cmd},
|
||||
{' ', N_("&View F3"), 'V', view_cmd},
|
||||
{' ', N_("Vie&w file... "), 'W', view_file_cmd},
|
||||
{' ', N_("&Filtered view M-!"), 'F', filtered_view_cmd},
|
||||
{' ', N_("&Edit F4"), 'E', edit_cmd},
|
||||
{' ', N_("&Copy F5"), 'C', copy_cmd},
|
||||
{' ', N_("c&Hmod C-x c"), 'H', chmod_cmd},
|
||||
{' ', N_("&Link C-x l"), 'L', link_cmd},
|
||||
{' ', N_("&SymLink C-x s"), 'S', symlink_cmd},
|
||||
{' ', N_("edit s&Ymlink C-x C-s"), 'Y', edit_symlink_cmd},
|
||||
{' ', N_("ch&Own C-x o"), 'O', chown_cmd},
|
||||
{' ', N_("&Advanced chown "), 'A', chown_advanced_cmd},
|
||||
{' ', N_("&Rename/Move F6"), 'R', ren_cmd},
|
||||
{' ', N_("&Mkdir F7"), 'M', mkdir_cmd},
|
||||
{' ', N_("&Delete F8"), 'D', delete_cmd},
|
||||
{' ', N_("&Quick cd M-c"), 'Q', quick_cd_cmd},
|
||||
{' ', "", ' ', 0},
|
||||
{' ', N_("select &Group M-+"), 'G', select_cmd},
|
||||
{' ', N_("u&Nselect group M-\\"), 'N', unselect_cmd},
|
||||
{' ', N_("reverse selec&Tion M-*"), 'T', reverse_selection_cmd},
|
||||
{' ', "", ' ', 0},
|
||||
{' ', N_("e&Xit F10"), 'X', quit_cmd}
|
||||
{' ', N_("&User menu F2"), NULL_HOTKEY, user_file_menu_cmd},
|
||||
{' ', N_("&View F3"), NULL_HOTKEY, view_cmd},
|
||||
{' ', N_("Vie&w file... "), NULL_HOTKEY, view_file_cmd},
|
||||
{' ', N_("&Filtered view M-!"), NULL_HOTKEY, filtered_view_cmd},
|
||||
{' ', N_("&Edit F4"), NULL_HOTKEY, edit_cmd},
|
||||
{' ', N_("&Copy F5"), NULL_HOTKEY, copy_cmd},
|
||||
{' ', N_("c&Hmod C-x c"), NULL_HOTKEY, chmod_cmd},
|
||||
{' ', N_("&Link C-x l"), NULL_HOTKEY, link_cmd},
|
||||
{' ', N_("&SymLink C-x s"), NULL_HOTKEY, symlink_cmd},
|
||||
{' ', N_("edit s&Ymlink C-x C-s"), NULL_HOTKEY, edit_symlink_cmd},
|
||||
{' ', N_("ch&Own C-x o"), NULL_HOTKEY, chown_cmd},
|
||||
{' ', N_("&Advanced chown "), NULL_HOTKEY, chown_advanced_cmd},
|
||||
{' ', N_("&Rename/Move F6"), NULL_HOTKEY, ren_cmd},
|
||||
{' ', N_("&Mkdir F7"), NULL_HOTKEY, mkdir_cmd},
|
||||
{' ', N_("&Delete F8"), NULL_HOTKEY, delete_cmd},
|
||||
{' ', N_("&Quick cd M-c"), NULL_HOTKEY, quick_cd_cmd},
|
||||
{' ', "", NULL_HOTKEY, 0},
|
||||
{' ', N_("select &Group M-+"), NULL_HOTKEY, select_cmd},
|
||||
{' ', N_("u&Nselect group M-\\"), NULL_HOTKEY, unselect_cmd},
|
||||
{' ', N_("reverse selec&Tion M-*"), NULL_HOTKEY, reverse_selection_cmd},
|
||||
{' ', "", NULL_HOTKEY, 0},
|
||||
{' ', N_("e&Xit F10"), NULL_HOTKEY, quit_cmd}
|
||||
};
|
||||
|
||||
static menu_entry CmdMenu[] = {
|
||||
@ -884,52 +889,52 @@ static menu_entry CmdMenu[] = {
|
||||
* as a panel still has some problems, I have not yet finished
|
||||
* the WTree widget port, sorry.
|
||||
*/
|
||||
{' ', N_("&Directory tree"), 'D', treebox_cmd},
|
||||
{' ', N_("&Find file M-?"), 'F', find_cmd},
|
||||
{' ', N_("s&Wap panels C-u"), 'W', swap_cmd},
|
||||
{' ', N_("switch &Panels on/off C-o"), 'P', view_other_cmd},
|
||||
{' ', N_("&Compare directories C-x d"), 'C', compare_dirs_cmd},
|
||||
{' ', N_("e&Xternal panelize C-x !"), 'X', external_panelize},
|
||||
{' ', N_("show directory s&Izes"), 'I', dirsizes_cmd},
|
||||
{' ', "", ' ', 0},
|
||||
{' ', N_("command &History"), 'H', history_cmd},
|
||||
{' ', N_("di&Rectory hotlist C-\\"), 'R', quick_chdir_cmd},
|
||||
{' ', N_("&Directory tree"), NULL_HOTKEY, treebox_cmd},
|
||||
{' ', N_("&Find file M-?"), NULL_HOTKEY, find_cmd},
|
||||
{' ', N_("s&Wap panels C-u"), NULL_HOTKEY, swap_cmd},
|
||||
{' ', N_("switch &Panels on/off C-o"), NULL_HOTKEY, view_other_cmd},
|
||||
{' ', N_("&Compare directories C-x d"), NULL_HOTKEY, compare_dirs_cmd},
|
||||
{' ', N_("e&Xternal panelize C-x !"), NULL_HOTKEY, external_panelize},
|
||||
{' ', N_("show directory s&Izes"), NULL_HOTKEY, dirsizes_cmd},
|
||||
{' ', "", NULL_HOTKEY, 0},
|
||||
{' ', N_("command &History"), NULL_HOTKEY, history_cmd},
|
||||
{' ', N_("di&Rectory hotlist C-\\"), NULL_HOTKEY, quick_chdir_cmd},
|
||||
#ifdef USE_VFS
|
||||
{' ', N_("&Active VFS list C-x a"), 'A', reselect_vfs},
|
||||
{' ', N_("&Active VFS list C-x a"), NULL_HOTKEY, reselect_vfs},
|
||||
#endif
|
||||
#ifdef WITH_BACKGROUND
|
||||
{' ', N_("&Background jobs C-x j"), 'B', jobs_cmd},
|
||||
{' ', N_("&Background jobs C-x j"), NULL_HOTKEY, jobs_cmd},
|
||||
#endif
|
||||
{' ', "", ' ', 0},
|
||||
{' ', "", NULL_HOTKEY, 0},
|
||||
#ifdef USE_EXT2FSLIB
|
||||
{' ', N_("&Undelete files (ext2fs only)"), 'U', undelete_cmd},
|
||||
{' ', N_("&Undelete files (ext2fs only)"), NULL_HOTKEY, undelete_cmd},
|
||||
#endif
|
||||
#ifdef LISTMODE_EDITOR
|
||||
{' ', N_("&Listing format edit"), 'L', listmode_cmd},
|
||||
{' ', N_("&Listing format edit"), NULL_HOTKEY, listmode_cmd},
|
||||
#endif
|
||||
#if defined (USE_EXT2FSLIB) || defined (LISTMODE_EDITOR)
|
||||
{' ', "", ' ', 0},
|
||||
{' ', "", NULL_HOTKEY, 0},
|
||||
#endif
|
||||
{' ', N_("Edit &extension file"), 'E', ext_cmd},
|
||||
{' ', N_("Edit &menu file"), 'M', edit_mc_menu_cmd},
|
||||
{' ', N_("Edit &extension file"), NULL_HOTKEY, ext_cmd},
|
||||
{' ', N_("Edit &menu file"), NULL_HOTKEY, edit_mc_menu_cmd},
|
||||
#ifdef USE_INTERNAL_EDIT
|
||||
{' ', N_("Edit edi&tor menu file"), 'T', edit_user_menu_cmd},
|
||||
{' ', N_("Edit &syntax file"), 'S', edit_syntax_cmd}
|
||||
{' ', N_("Edit edi&tor menu file"), NULL_HOTKEY, edit_user_menu_cmd},
|
||||
{' ', N_("Edit &syntax file"), NULL_HOTKEY, edit_syntax_cmd}
|
||||
#endif /* USE_INTERNAL_EDIT */
|
||||
};
|
||||
|
||||
/* Must keep in sync with the constants in menu_cmd */
|
||||
static menu_entry OptMenu[] = {
|
||||
{' ', N_("&Configuration..."), 'C', configure_box},
|
||||
{' ', N_("&Layout..."), 'L', layout_cmd},
|
||||
{' ', N_("c&Onfirmation..."), 'O', confirm_box},
|
||||
{' ', N_("&Display bits..."), 'D', display_bits_box},
|
||||
{' ', N_("learn &Keys..."), 'K', learn_keys},
|
||||
{' ', N_("&Configuration..."), NULL_HOTKEY, configure_box},
|
||||
{' ', N_("&Layout..."), NULL_HOTKEY, layout_cmd},
|
||||
{' ', N_("c&Onfirmation..."), NULL_HOTKEY, confirm_box},
|
||||
{' ', N_("&Display bits..."), NULL_HOTKEY, display_bits_box},
|
||||
{' ', N_("learn &Keys..."), NULL_HOTKEY, learn_keys},
|
||||
#ifdef USE_VFS
|
||||
{' ', N_("&Virtual FS..."), 'V', configure_vfs},
|
||||
{' ', N_("&Virtual FS..."), NULL_HOTKEY, configure_vfs},
|
||||
#endif /* !USE_VFS */
|
||||
{' ', "", ' ', 0},
|
||||
{' ', N_("&Save setup"), 'S', save_setup_cmd}
|
||||
{' ', "", NULL_HOTKEY, 0},
|
||||
{' ', N_("&Save setup"), NULL_HOTKEY, save_setup_cmd}
|
||||
};
|
||||
|
||||
#define menu_entries(x) sizeof(x)/sizeof(menu_entry)
|
||||
@ -1612,19 +1617,14 @@ midnight_callback (struct Dlg_head *h, dlg_msg_t msg, int parm)
|
||||
void
|
||||
update_xterm_title_path (void)
|
||||
{
|
||||
char *p, *s;
|
||||
const char *p;
|
||||
|
||||
if (xterm_flag && xterm_title) {
|
||||
p = s = g_strdup (strip_home_and_password (current_panel->cwd));
|
||||
do {
|
||||
if (!is_printable ((unsigned char) *s))
|
||||
*s = '?';
|
||||
} while (*++s);
|
||||
p = strip_home_and_password (current_panel->cwd);
|
||||
fprintf (stdout, "\33]0;mc - %s\7", str_term_form (p));
|
||||
if (!alternate_plus_minus)
|
||||
numeric_keypad_mode ();
|
||||
fprintf (stdout, "\33]0;mc - %s\7", p);
|
||||
fflush (stdout);
|
||||
g_free (p);
|
||||
}
|
||||
}
|
||||
|
||||
@ -2068,7 +2068,7 @@ handle_args (int argc, char *argv[])
|
||||
char *end = tmp + strlen (tmp), *p = end;
|
||||
if (p > tmp && p[-1] == ':')
|
||||
p--;
|
||||
while (p > tmp && isdigit ((unsigned char) p[-1]))
|
||||
while (p > tmp && g_ascii_isdigit ((gchar) p[-1]))
|
||||
p--;
|
||||
if (tmp < p && p < end && p[-1] == ':') {
|
||||
struct stat st;
|
||||
@ -2086,7 +2086,7 @@ handle_args (int argc, char *argv[])
|
||||
}
|
||||
} else {
|
||||
try_plus_filename:
|
||||
if (*tmp == '+' && isdigit ((unsigned char) tmp[1])) {
|
||||
if (*tmp == '+' && g_ascii_isdigit ((gchar) tmp[1])) {
|
||||
int start_line = atoi (tmp);
|
||||
if (start_line > 0) {
|
||||
char *file = poptGetArg (ctx);
|
||||
@ -2138,6 +2138,8 @@ main (int argc, char *argv[])
|
||||
home_dir = mc_home;
|
||||
}
|
||||
|
||||
str_init_strings (NULL);
|
||||
|
||||
vfs_init ();
|
||||
|
||||
#ifdef USE_INTERNAL_EDIT
|
||||
@ -2264,6 +2266,8 @@ main (int argc, char *argv[])
|
||||
#ifdef HAVE_CHARSET
|
||||
free_codepages_list ();
|
||||
#endif
|
||||
str_uninit_strings ();
|
||||
|
||||
g_free (this_dir);
|
||||
g_free (other_dir);
|
||||
|
||||
|
131
src/menu.c
131
src/menu.c
@ -33,55 +33,35 @@
|
||||
#include "mouse.h"
|
||||
#include "win.h"
|
||||
#include "key.h" /* For mi_getch() */
|
||||
#include "strutil.h"
|
||||
|
||||
int menubar_visible = 1; /* This is the new default */
|
||||
|
||||
static void
|
||||
menu_scan_hotkey (Menu *menu)
|
||||
{
|
||||
char *cp = strchr (menu->name, '&');
|
||||
|
||||
if (cp != NULL && cp[1] != '\0') {
|
||||
g_strlcpy (cp, cp + 1, strlen (cp));
|
||||
menu->hotkey = tolower ((unsigned char) *cp);
|
||||
} else
|
||||
menu->hotkey = 0;
|
||||
}
|
||||
|
||||
Menu *
|
||||
create_menu (const char *name, menu_entry *entries, int count, const char *help_node)
|
||||
{
|
||||
Menu *menu;
|
||||
const char *cp;
|
||||
|
||||
menu = (Menu *) g_malloc (sizeof (*menu));
|
||||
menu = g_new (Menu, 1);
|
||||
menu->count = count;
|
||||
menu->max_entry_len = 20;
|
||||
menu->entries = entries;
|
||||
menu->text = parse_hotkey (name);
|
||||
|
||||
if (entries != (menu_entry*) NULL) {
|
||||
int len;
|
||||
register menu_entry* mp;
|
||||
for (mp = entries; count--; mp++) {
|
||||
if (mp->text[0] != '\0') {
|
||||
#ifdef ENABLE_NLS
|
||||
mp->text = _(mp->text);
|
||||
#endif /* ENABLE_NLS */
|
||||
cp = strchr (mp->text,'&');
|
||||
if (mp->label[0] != '\0') {
|
||||
mp->label = _(mp->label);
|
||||
mp->text = parse_hotkey (mp->label);
|
||||
len = hotkey_width (mp->text);
|
||||
|
||||
if (cp != NULL && *(cp+1) != '\0') {
|
||||
mp->hot_key = tolower ((unsigned char) *(cp+1));
|
||||
menu->max_entry_len = max ((int) (strlen (mp->text) - 1),
|
||||
menu->max_entry_len);
|
||||
} else {
|
||||
menu->max_entry_len = max ((int) strlen (mp->text),
|
||||
menu->max_entry_len);
|
||||
}
|
||||
menu->max_entry_len = max (len, menu->max_entry_len);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
menu->name = g_strdup (name);
|
||||
menu_scan_hotkey(menu);
|
||||
menu->start_x = 0;
|
||||
menu->help_node = g_strdup (help_node);
|
||||
return menu;
|
||||
@ -94,34 +74,35 @@ static void menubar_drop_compute (WMenu *menubar)
|
||||
|
||||
static void menubar_paint_idx (WMenu *menubar, int idx, int color)
|
||||
{
|
||||
const Menu *menu = menubar->menu [menubar->selected];
|
||||
const Menu *menu = menubar->menu[menubar->selected];
|
||||
const int y = 2 + idx;
|
||||
int x = menubar-> menu[menubar->selected]->start_x;
|
||||
int x = menu->start_x;
|
||||
const menu_entry *entry = &menu->entries[idx];
|
||||
|
||||
if (x + menubar->max_entry_len + 3 > menubar->widget.cols)
|
||||
x = menubar->widget.cols - menubar->max_entry_len - 3;
|
||||
|
||||
widget_move (&menubar->widget, y, x);
|
||||
attrset (color);
|
||||
hline (' ', menubar->max_entry_len+2);
|
||||
if (!*menu->entries [idx].text) {
|
||||
attrset (SELECTED_COLOR);
|
||||
widget_move (&menubar->widget, y, x + 1);
|
||||
hline (slow_terminal ? ' ' : ACS_HLINE, menubar->max_entry_len);
|
||||
} else {
|
||||
const unsigned char *text;
|
||||
|
||||
addch((unsigned char)menu->entries [idx].first_letter);
|
||||
for (text = menu->entries [idx].text; *text; text++)
|
||||
{
|
||||
if (*text != '&')
|
||||
addch(*text);
|
||||
else {
|
||||
attrset (color);
|
||||
hline (' ', menubar->max_entry_len + 2);
|
||||
|
||||
if (entry->text.start == NULL) {
|
||||
attrset (SELECTED_COLOR);
|
||||
widget_move (&menubar->widget, y, x + 1);
|
||||
hline (slow_terminal ? ' ' : ACS_HLINE, menubar->max_entry_len);
|
||||
} else {
|
||||
addch ((unsigned char)entry->first_letter);
|
||||
|
||||
addstr (str_term_form (entry->text.start));
|
||||
|
||||
if (entry->text.hotkey != NULL) {
|
||||
attrset (color == MENU_SELECTED_COLOR ?
|
||||
MENU_HOTSEL_COLOR : MENU_HOT_COLOR);
|
||||
addch(*(++text));
|
||||
addstr (str_term_form (entry->text.hotkey));
|
||||
attrset(color);
|
||||
}
|
||||
if (entry->text.end != NULL) {
|
||||
addstr (str_term_form (entry->text.end));
|
||||
}
|
||||
}
|
||||
widget_move (&menubar->widget, y, x + 1);
|
||||
@ -165,10 +146,22 @@ static void menubar_draw (WMenu *menubar)
|
||||
attrset (SELECTED_COLOR);
|
||||
/* Now each one of the entries */
|
||||
for (i = 0; i < items; i++){
|
||||
if (menubar->active)
|
||||
attrset(i == menubar->selected?MENU_SELECTED_COLOR:SELECTED_COLOR);
|
||||
attrset ((menubar->active && i == menubar->selected) ?
|
||||
MENU_SELECTED_COLOR : SELECTED_COLOR);
|
||||
widget_move (&menubar->widget, 0, menubar->menu [i]->start_x);
|
||||
tty_printf ("%s", menubar->menu [i]->name);
|
||||
|
||||
addstr (str_term_form (menubar->menu[i]->text.start));
|
||||
|
||||
if (menubar->menu[i]->text.hotkey != NULL) {
|
||||
attrset ((menubar->active && i == menubar->selected) ?
|
||||
MENU_HOTSEL_COLOR : COLOR_HOT_FOCUS);
|
||||
addstr (str_term_form (menubar->menu[i]->text.hotkey));
|
||||
attrset ((menubar->active && i == menubar->selected) ?
|
||||
MENU_SELECTED_COLOR : SELECTED_COLOR);
|
||||
}
|
||||
if (menubar->menu[i]->text.end != NULL) {
|
||||
addstr (str_term_form (menubar->menu[i]->text.end));
|
||||
}
|
||||
}
|
||||
|
||||
if (menubar->dropped)
|
||||
@ -176,6 +169,7 @@ static void menubar_draw (WMenu *menubar)
|
||||
else
|
||||
widget_move (&menubar->widget, 0,
|
||||
menubar-> menu[menubar->selected]->start_x);
|
||||
|
||||
}
|
||||
|
||||
static inline void menubar_remove (WMenu *menubar)
|
||||
@ -263,8 +257,7 @@ static int menubar_handle_key (WMenu *menubar, int key)
|
||||
int i;
|
||||
|
||||
/* Lowercase */
|
||||
if (key < 256 && isalpha (key)) /* Linux libc.so.5.x.x bug fix */
|
||||
key = tolower (key);
|
||||
if (isascii (key)) key = g_ascii_tolower (key);
|
||||
|
||||
if (is_abort_char (key)){
|
||||
menubar_finish (menubar);
|
||||
@ -292,16 +285,19 @@ static int menubar_handle_key (WMenu *menubar, int key)
|
||||
|
||||
if (!menubar->dropped){
|
||||
const int items = menubar->items;
|
||||
for (i = 0; i < items; i++){
|
||||
for (i = 0; i < items; i++) {
|
||||
const Menu *menu = menubar->menu [i];
|
||||
|
||||
if (menu->hotkey == key){
|
||||
if (menu->text.hotkey != NULL) {
|
||||
if (g_ascii_tolower(menu->text.hotkey[0]) == key) {
|
||||
menubar_drop (menubar, i);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
if (key == KEY_ENTER || key == XCTRL ('n') || key == KEY_DOWN
|
||||
|| key == '\n'){
|
||||
}
|
||||
if (key == KEY_ENTER || key == XCTRL ('n')
|
||||
|| key == KEY_DOWN || key == '\n') {
|
||||
|
||||
menubar_drop (menubar, menubar->selected);
|
||||
return 1;
|
||||
}
|
||||
@ -311,18 +307,20 @@ static int menubar_handle_key (WMenu *menubar, int key)
|
||||
const Menu *menu = menubar->menu [selected];
|
||||
const int items = menu->count;
|
||||
|
||||
for (i = 0; i < items; i++){
|
||||
for (i = 0; i < items; i++) {
|
||||
if (!menu->entries [i].call_back)
|
||||
continue;
|
||||
|
||||
if (key != menu->entries [i].hot_key)
|
||||
if (menu->entries[i].text.hotkey != NULL) {
|
||||
if (key != g_ascii_tolower (menu->entries[i].text.hotkey[0]))
|
||||
continue;
|
||||
|
||||
menubar_execute (menubar, i);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (key == KEY_ENTER || key == '\n'){
|
||||
if (key == KEY_ENTER || key == '\n') {
|
||||
menubar_execute (menubar, menubar->subsel);
|
||||
return 1;
|
||||
}
|
||||
@ -493,7 +491,7 @@ menubar_arrange(WMenu* menubar)
|
||||
|
||||
for (i = 0; i < items; i++)
|
||||
{
|
||||
int len = strlen(menubar->menu[i]->name);
|
||||
int len = hotkey_width (menubar->menu[i]->text);
|
||||
menubar->menu[i]->start_x = start_x;
|
||||
start_x += len + gap;
|
||||
}
|
||||
@ -506,7 +504,7 @@ menubar_arrange(WMenu* menubar)
|
||||
for (i = 0; i < items; i++)
|
||||
{
|
||||
/* preserve length here, to be used below */
|
||||
gap -= (menubar->menu[i]->start_x = strlen(menubar->menu[i]->name));
|
||||
gap -= (menubar->menu[i]->start_x = hotkey_width (menubar->menu[i]->text));
|
||||
}
|
||||
|
||||
gap /= (items - 1);
|
||||
@ -530,7 +528,16 @@ menubar_arrange(WMenu* menubar)
|
||||
void
|
||||
destroy_menu (Menu *menu)
|
||||
{
|
||||
g_free (menu->name);
|
||||
release_hotkey (menu->text);
|
||||
if (menu->entries != NULL) {
|
||||
int me;
|
||||
for (me = 0; me < menu->count; me++) {
|
||||
if (menu->entries[me].label[0] != '\0') {
|
||||
release_hotkey (menu->entries[me].text);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
g_free (menu->help_node);
|
||||
g_free (menu);
|
||||
}
|
||||
|
@ -7,17 +7,16 @@ typedef void (*callfn) (void);
|
||||
|
||||
typedef struct {
|
||||
char first_letter;
|
||||
const char *text;
|
||||
int hot_key;
|
||||
const char *label;
|
||||
struct hotkey_t text;
|
||||
callfn call_back;
|
||||
} menu_entry;
|
||||
|
||||
typedef struct Menu {
|
||||
char *name;
|
||||
struct hotkey_t text;
|
||||
int count;
|
||||
int max_entry_len;
|
||||
int selected;
|
||||
int hotkey;
|
||||
menu_entry *entries;
|
||||
int start_x; /* position relative to menubar start */
|
||||
char *help_node;
|
||||
|
21
src/option.c
21
src/option.c
@ -35,6 +35,7 @@
|
||||
#include "setup.h" /* For save_setup() */
|
||||
#include "main.h"
|
||||
#include "profile.h" /* For sync_profiles */
|
||||
#include "strutil.h"
|
||||
|
||||
#include "panel.h" /* Needed for the externs */
|
||||
#include "file.h" /* safe_delete */
|
||||
@ -125,12 +126,12 @@ init_configure (void)
|
||||
title2 = _(" Pause after run... ");
|
||||
title3 = _(" Other options ");
|
||||
|
||||
first_width = strlen (title1) + 1;
|
||||
second_width = strlen (title3) + 1;
|
||||
first_width = str_term_width1 (title1) + 1;
|
||||
second_width = str_term_width1 (title3) + 1;
|
||||
|
||||
for (i = 0; check_options[i].text; i++) {
|
||||
check_options[i].text = _(check_options[i].text);
|
||||
l1 = strlen (check_options[i].text) + 7;
|
||||
l1 = str_term_width1 (check_options[i].text) + 7;
|
||||
if (i >= OTHER_OPTIONS) {
|
||||
if (l1 > first_width)
|
||||
first_width = l1;
|
||||
@ -143,23 +144,23 @@ init_configure (void)
|
||||
i = PAUSE_OPTIONS;
|
||||
while (i--) {
|
||||
pause_options[i] = _(pause_options[i]);
|
||||
l1 = strlen (pause_options[i]) + 7;
|
||||
l1 = str_term_width1 (pause_options[i]) + 7;
|
||||
if (l1 > first_width)
|
||||
first_width = l1;
|
||||
}
|
||||
|
||||
l1 = strlen (title2) + 1;
|
||||
l1 = str_term_width1 (title2) + 1;
|
||||
if (l1 > first_width)
|
||||
first_width = l1;
|
||||
|
||||
l1 = 11 + strlen (ok_button)
|
||||
+ strlen (save_button)
|
||||
+ strlen (cancel_button);
|
||||
l1 = 11 + str_term_width1 (ok_button)
|
||||
+ str_term_width1 (save_button)
|
||||
+ str_term_width1 (cancel_button);
|
||||
|
||||
i = (first_width + second_width - l1) / 4;
|
||||
b1 = 5 + i;
|
||||
b2 = b1 + strlen (ok_button) + i + 6;
|
||||
b3 = b2 + strlen (save_button) + i + 4;
|
||||
b2 = b1 + str_term_width1 (ok_button) + i + 6;
|
||||
b3 = b2 + str_term_width1 (save_button) + i + 4;
|
||||
|
||||
i18n_config_flag = 1;
|
||||
}
|
||||
|
@ -72,6 +72,8 @@ typedef struct WPanel {
|
||||
|
||||
int searching;
|
||||
char search_buffer [256];
|
||||
char search_char [MB_LEN_MAX]; /*buffer for multibytes characters*/
|
||||
int search_chpoint; /*point after last characters in search_char*/
|
||||
} WPanel;
|
||||
|
||||
WPanel *panel_new (const char *panel_name);
|
||||
|
@ -43,6 +43,7 @@
|
||||
#include "main.h" /* repaint_screen */
|
||||
#include "panelize.h"
|
||||
#include "history.h"
|
||||
#include "strutil.h"
|
||||
|
||||
#define UX 5
|
||||
#define UY 2
|
||||
@ -128,7 +129,7 @@ init_panelize (void)
|
||||
i = sizeof (panelize_but) / sizeof (panelize_but[0]);
|
||||
while (i--) {
|
||||
panelize_but[i].text = _(panelize_but[i].text);
|
||||
maxlen += strlen (panelize_but[i].text) + 5;
|
||||
maxlen += str_term_width1 (panelize_but[i].text) + 5;
|
||||
}
|
||||
maxlen += 10;
|
||||
|
||||
@ -137,11 +138,11 @@ init_panelize (void)
|
||||
panelize_cols = max (panelize_cols, maxlen);
|
||||
|
||||
panelize_but[2].x =
|
||||
panelize_but[3].x + strlen (panelize_but[3].text) + 7;
|
||||
panelize_but[3].x + str_term_width1 (panelize_but[3].text) + 7;
|
||||
panelize_but[1].x =
|
||||
panelize_but[2].x + strlen (panelize_but[2].text) + 5;
|
||||
panelize_but[2].x + str_term_width1 (panelize_but[2].text) + 5;
|
||||
panelize_but[0].x =
|
||||
panelize_cols - strlen (panelize_but[0].text) - 8 - BX;
|
||||
panelize_cols - str_term_width1 (panelize_but[0].text) - 8 - BX;
|
||||
|
||||
#endif /* ENABLE_NLS */
|
||||
|
||||
@ -403,6 +404,8 @@ static void do_external_panelize (char *command)
|
||||
list->list [next_free].f.stale_link = stale_link;
|
||||
list->list [next_free].f.dir_size_computed = 0;
|
||||
list->list [next_free].st = st;
|
||||
list->list[next_free].sort_key = NULL;
|
||||
list->list[next_free].second_sort_key = NULL;
|
||||
next_free++;
|
||||
if (!(next_free & 32))
|
||||
rotate_dash ();
|
||||
|
@ -30,6 +30,7 @@
|
||||
|
||||
#include "global.h"
|
||||
#include "profile.h"
|
||||
#include "strutil.h"
|
||||
|
||||
#define STRSIZE 4096
|
||||
#define overflow (next == &CharBuffer [STRSIZE-1])
|
||||
@ -62,7 +63,7 @@ find_loaded (const char *FileName, TSecHeader ** section)
|
||||
TProfile *p = Base;
|
||||
|
||||
while (p) {
|
||||
if (!g_strcasecmp (FileName, p->FileName)) {
|
||||
if (!str_casecmp (FileName, p->FileName)) {
|
||||
*section = p->Section;
|
||||
return p;
|
||||
}
|
||||
@ -291,10 +292,10 @@ GetSetProfileChar (int set, const char *AppName, const char *KeyName,
|
||||
|
||||
/* Start search */
|
||||
for (; section; section = section->link){
|
||||
if (section->AppName == 0 || g_strcasecmp (section->AppName, AppName))
|
||||
if (section->AppName == 0 || str_casecmp (section->AppName, AppName))
|
||||
continue;
|
||||
for (key = section->Keys; key; key = key->link){
|
||||
if ( g_strcasecmp (key->KeyName, KeyName))
|
||||
if (str_casecmp (key->KeyName, KeyName))
|
||||
continue;
|
||||
if (set){
|
||||
g_free (key->Value);
|
||||
@ -360,9 +361,9 @@ int GetPrivateProfileInt (const char * AppName, const char * KeyName, int Defaul
|
||||
|
||||
/* Check the exact semantic with the SDK */
|
||||
GetPrivateProfileString (AppName, KeyName, buf, IntBuf, BUF_TINY, File);
|
||||
if (! g_strcasecmp (IntBuf, "true"))
|
||||
if (!str_casecmp (IntBuf, "true"))
|
||||
return 1;
|
||||
if (! g_strcasecmp (IntBuf, "yes"))
|
||||
if (!str_casecmp (IntBuf, "yes"))
|
||||
return 1;
|
||||
return (int) atol (IntBuf);
|
||||
}
|
||||
@ -488,7 +489,7 @@ void *profile_init_iterator (const char *appname, const char *file)
|
||||
section = Current->Section;
|
||||
}
|
||||
for (; section; section = section->link){
|
||||
if ( g_strcasecmp (section->AppName, appname))
|
||||
if (str_casecmp (section->AppName, appname))
|
||||
continue;
|
||||
return section->Keys;
|
||||
}
|
||||
@ -520,7 +521,7 @@ void profile_clean_section (const char *appname, const char *file)
|
||||
/* won't be find by further walks of the structure */
|
||||
|
||||
for (; section; section = section->link){
|
||||
if ( g_strcasecmp (section->AppName, appname))
|
||||
if (str_casecmp (section->AppName, appname))
|
||||
continue;
|
||||
section->AppName [0] = 0;
|
||||
}
|
||||
@ -535,7 +536,7 @@ int profile_has_section (const char *section_name, const char *profile)
|
||||
return 0;
|
||||
}
|
||||
for (; section; section = section->link){
|
||||
if ( g_strcasecmp (section->AppName, section_name))
|
||||
if (str_casecmp (section->AppName, section_name))
|
||||
continue;
|
||||
return 1;
|
||||
}
|
||||
@ -547,7 +548,7 @@ void profile_forget_profile (const char *file)
|
||||
TProfile *p;
|
||||
|
||||
for (p = Base; p; p = p->link){
|
||||
if ( g_strcasecmp (file, p->FileName))
|
||||
if (str_casecmp (file, p->FileName))
|
||||
continue;
|
||||
p->FileName [0] = 0;
|
||||
}
|
||||
|
258
src/screen.c
258
src/screen.c
@ -50,21 +50,10 @@
|
||||
#include "main.h" /* the_menubar */
|
||||
#include "unixcompat.h"
|
||||
#include "mountlist.h" /* my_statfs */
|
||||
#include "strutil.h"
|
||||
|
||||
#define ELEMENTS(arr) ( sizeof(arr) / sizeof((arr)[0]) )
|
||||
|
||||
#define J_LEFT 1
|
||||
#define J_RIGHT 2
|
||||
#define J_CENTER 3
|
||||
|
||||
#define IS_FIT(x) ((x) & 0x0004)
|
||||
#define MAKE_FIT(x) ((x) | 0x0004)
|
||||
#define HIDE_FIT(x) ((x) & 0x0003)
|
||||
|
||||
#define J_LEFT_FIT 5
|
||||
#define J_RIGHT_FIT 6
|
||||
#define J_CENTER_FIT 7
|
||||
|
||||
#define NORMAL 0
|
||||
#define SELECTED 1
|
||||
#define MARKED 2
|
||||
@ -172,24 +161,8 @@ add_permission_string (char *dest, int width, file_entry *fe, int attr, int colo
|
||||
static const char *
|
||||
string_file_name (file_entry *fe, int len)
|
||||
{
|
||||
static char buffer [MC_MAXPATHLEN + 1];
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < sizeof(buffer) - 1; i++) {
|
||||
char c;
|
||||
|
||||
c = fe->fname[i];
|
||||
|
||||
if (!c)
|
||||
break;
|
||||
|
||||
if (!is_printable(c))
|
||||
c = '?';
|
||||
|
||||
buffer[i] = c;
|
||||
}
|
||||
|
||||
buffer[i] = 0;
|
||||
static char buffer [MC_MAXPATHLEN * MB_LEN_MAX + 1];
|
||||
g_strlcpy (buffer, fe->fname, sizeof(buffer));
|
||||
return buffer;
|
||||
}
|
||||
|
||||
@ -451,42 +424,6 @@ static struct {
|
||||
{ "dot", 1, 0, J_RIGHT, " ", 0, string_dot, NULL },
|
||||
};
|
||||
|
||||
static char *
|
||||
to_buffer (char *dest, int just_mode, int len, const char *txt)
|
||||
{
|
||||
int txtlen = strlen (txt);
|
||||
int still, over;
|
||||
|
||||
/* Fill buffer with spaces */
|
||||
memset (dest, ' ', len);
|
||||
|
||||
still = (over=(txtlen > len)) ? (txtlen - len) : (len - txtlen);
|
||||
|
||||
switch (HIDE_FIT(just_mode)){
|
||||
case J_LEFT:
|
||||
still = 0;
|
||||
break;
|
||||
case J_CENTER:
|
||||
still /= 2;
|
||||
break;
|
||||
case J_RIGHT:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (over){
|
||||
if (IS_FIT(just_mode))
|
||||
strcpy (dest, name_trunc(txt, len));
|
||||
else
|
||||
strncpy (dest, txt+still, len);
|
||||
} else
|
||||
strncpy (dest+still, txt, txtlen);
|
||||
|
||||
dest[len] = '\0';
|
||||
|
||||
return (dest + len);
|
||||
}
|
||||
|
||||
static int
|
||||
file_compute_color (int attr, file_entry *fe)
|
||||
{
|
||||
@ -544,8 +481,6 @@ format_file (char *dest, int limit, WPanel *panel, int file_index, int width, in
|
||||
{
|
||||
int color, length, empty_line;
|
||||
const char *txt;
|
||||
char *old_pos;
|
||||
char *cdest = dest;
|
||||
format_e *format, *home;
|
||||
file_entry *fe;
|
||||
|
||||
@ -565,34 +500,38 @@ format_file (char *dest, int limit, WPanel *panel, int file_index, int width, in
|
||||
break;
|
||||
|
||||
if (format->string_fn){
|
||||
int len;
|
||||
int len, perm;
|
||||
char *preperad_text;
|
||||
|
||||
if (empty_line)
|
||||
txt = " ";
|
||||
else
|
||||
txt = (*format->string_fn)(fe, format->field_len);
|
||||
|
||||
old_pos = cdest;
|
||||
|
||||
len = format->field_len;
|
||||
if (len + length > width)
|
||||
len = width - length;
|
||||
if (len + (cdest - dest) > limit)
|
||||
len = limit - (cdest - dest);
|
||||
if (len <= 0)
|
||||
break;
|
||||
cdest = to_buffer (cdest, format->just_mode, len, txt);
|
||||
length += len;
|
||||
|
||||
perm = 0;
|
||||
if (permission_mode) {
|
||||
if (!strcmp(format->id, "perm"))
|
||||
perm = 1;
|
||||
else if (!strcmp(format->id, "mode"))
|
||||
perm = 2;
|
||||
}
|
||||
|
||||
attrset (color);
|
||||
|
||||
if (permission_mode && !strcmp(format->id, "perm"))
|
||||
add_permission_string (old_pos, format->field_len, fe, attr, color, 0);
|
||||
else if (permission_mode && !strcmp(format->id, "mode"))
|
||||
add_permission_string (old_pos, format->field_len, fe, attr, color, 1);
|
||||
preperad_text = (char*) str_fit_to_term(txt, len, format->just_mode);
|
||||
if (perm)
|
||||
add_permission_string (preperad_text, format->field_len, fe,
|
||||
attr, color, perm - 1);
|
||||
else
|
||||
addstr (old_pos);
|
||||
addstr (preperad_text);
|
||||
|
||||
length+= len;
|
||||
} else {
|
||||
if (attr == SELECTED || attr == MARKED_SELECTED)
|
||||
attrset (SELECTED_COLOR);
|
||||
@ -663,11 +602,41 @@ display_mini_info (WPanel *panel)
|
||||
|
||||
if (panel->searching){
|
||||
attrset (INPUT_COLOR);
|
||||
tty_printf ("/%-*s", panel->widget.cols-3, panel->search_buffer);
|
||||
addstr ("/");
|
||||
addstr (str_fit_to_term (panel->search_buffer,
|
||||
panel->widget.cols - 3, J_LEFT));
|
||||
attrset (NORMAL_COLOR);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Status displays total marked size */
|
||||
if (panel->marked){
|
||||
char buffer[BUF_SMALL], b_bytes[BUF_SMALL];
|
||||
int cols = panel->widget.cols - 2;
|
||||
|
||||
attrset (MARKED_COLOR);
|
||||
widget_move (&panel->widget, llines (panel) + 3, 1);
|
||||
|
||||
/*
|
||||
* This is a trick to use two ngettext() calls in one sentence.
|
||||
* First make "N bytes", then insert it into "X in M files".
|
||||
*/
|
||||
g_snprintf(b_bytes, sizeof (b_bytes),
|
||||
ngettext("%s byte", "%s bytes",
|
||||
(unsigned long)panel->total),
|
||||
size_trunc_sep(panel->total));
|
||||
g_snprintf(buffer, sizeof (buffer),
|
||||
ngettext("%s in %d file", "%s in %d files", panel->marked),
|
||||
b_bytes, panel->marked);
|
||||
|
||||
if (str_term_width1 (buffer) <= cols - 2){
|
||||
addstr (" ");
|
||||
cols-= 2;
|
||||
}
|
||||
addstr (str_fit_to_term (buffer, cols, J_LEFT));
|
||||
return;
|
||||
}
|
||||
|
||||
/* Status resolves links and show them */
|
||||
set_colors (panel);
|
||||
|
||||
@ -680,19 +649,18 @@ display_mini_info (WPanel *panel)
|
||||
g_free (link);
|
||||
if (len > 0){
|
||||
link_target[len] = 0;
|
||||
tty_printf ("-> %-*s", panel->widget.cols - 5,
|
||||
name_trunc (link_target, panel->widget.cols - 5));
|
||||
addstr ("-> ");
|
||||
addstr (str_fit_to_term (link_target, panel->widget.cols - 5,
|
||||
J_LEFT_FIT));
|
||||
} else
|
||||
tty_printf ("%-*s", panel->widget.cols - 2, _("<readlink failed>"));
|
||||
} else if (strcmp (panel->dir.list [panel->selected].fname, "..") == 0) {
|
||||
/* FIXME:
|
||||
* while loading directory (do_load_dir() and do_reload_dir(),
|
||||
* the actual stat info about ".." directory isn't got;
|
||||
* so just don't display incorrect info about ".." directory */
|
||||
tty_printf ("%-*s", panel->widget.cols - 2, _("UP--DIR"));
|
||||
} else
|
||||
/* Default behavior */
|
||||
repaint_file (panel, panel->selected, 0, STATUS, 1);
|
||||
addstr (str_fit_to_term (_("<readlink failed>"),
|
||||
panel->widget.cols - 2, J_LEFT));
|
||||
return;
|
||||
}
|
||||
|
||||
/* Default behavior */
|
||||
repaint_file (panel, panel->selected, 0, STATUS, 1);
|
||||
return;
|
||||
}
|
||||
|
||||
static void
|
||||
@ -824,7 +792,7 @@ show_free_space (WPanel *panel)
|
||||
static void
|
||||
show_dir (WPanel *panel)
|
||||
{
|
||||
char *tmp;
|
||||
int len;
|
||||
|
||||
set_colors (panel);
|
||||
draw_double_box (panel->widget.parent,
|
||||
@ -845,17 +813,12 @@ show_dir (WPanel *panel)
|
||||
attrset (REVERSE_COLOR);
|
||||
|
||||
widget_move (&panel->widget, 0, 3);
|
||||
addch (' ');
|
||||
|
||||
tmp = g_malloc (panel->widget.cols + 1);
|
||||
tmp[panel->widget.cols] = '\0';
|
||||
|
||||
trim (strip_home_and_password (panel->cwd), tmp,
|
||||
max (panel->widget.cols - 9, 0));
|
||||
addstr (tmp);
|
||||
g_free (tmp);
|
||||
|
||||
addch (' ');
|
||||
len = min (max (panel->widget.cols - 9, 0), panel->widget.cols);
|
||||
addstr (str_term_trim (strip_home_and_password (panel->cwd), len));
|
||||
addch (' ');
|
||||
|
||||
widget_move (&panel->widget, 0, 1);
|
||||
addstr ("<");
|
||||
widget_move (&panel->widget, 0, panel->widget.cols - 2);
|
||||
@ -1172,7 +1135,6 @@ static void
|
||||
paint_frame (WPanel *panel)
|
||||
{
|
||||
int header_len;
|
||||
int spaces, extra;
|
||||
int side, width;
|
||||
|
||||
const char *txt;
|
||||
@ -1205,11 +1167,8 @@ paint_frame (WPanel *panel)
|
||||
header_len = format->field_len;
|
||||
|
||||
attrset (MARKED_COLOR);
|
||||
spaces = (format->field_len - header_len) / 2;
|
||||
extra = (format->field_len - header_len) % 2;
|
||||
tty_printf ("%*s%.*s%*s", spaces, "",
|
||||
header_len, txt, spaces+extra, "");
|
||||
width -= 2 * spaces + extra + header_len;
|
||||
addstr (str_fit_to_term (txt, format->field_len, J_CENTER_LEFT));
|
||||
width -= format->field_len;
|
||||
} else {
|
||||
attrset (NORMAL_COLOR);
|
||||
one_vline ();
|
||||
@ -1962,24 +1921,49 @@ mark_file (WPanel *panel)
|
||||
static void
|
||||
do_search (WPanel *panel, int c_code)
|
||||
{
|
||||
size_t l;
|
||||
int i;
|
||||
size_t l, max, buf_max;
|
||||
int i, sel;
|
||||
int wrapped = 0;
|
||||
int found;
|
||||
char *act;
|
||||
|
||||
l = strlen (panel->search_buffer);
|
||||
if (c_code == KEY_BACKSPACE) {
|
||||
if (l)
|
||||
panel->search_buffer[--l] = '\0';
|
||||
if (l != 0) {
|
||||
act = panel->search_buffer + l;
|
||||
str_prev_noncomb_char (&act, panel->search_buffer);
|
||||
act[0] = '\0';
|
||||
}
|
||||
panel->search_chpoint = 0;
|
||||
} else {
|
||||
if (c_code && l < sizeof (panel->search_buffer)) {
|
||||
panel->search_buffer[l] = c_code;
|
||||
panel->search_buffer[l + 1] = 0;
|
||||
l++;
|
||||
if (c_code && panel->search_chpoint < sizeof (panel->search_char)) {
|
||||
panel->search_char[panel->search_chpoint] = c_code;
|
||||
panel->search_chpoint++;
|
||||
}
|
||||
|
||||
if (panel->search_chpoint > 0) {
|
||||
switch (str_is_valid_char (panel->search_char, panel->search_chpoint)) {
|
||||
case -2:
|
||||
return;
|
||||
case -1:
|
||||
panel->search_chpoint = 0;
|
||||
return;
|
||||
default:
|
||||
if (l + panel->search_chpoint < sizeof (panel->search_buffer)) {
|
||||
memcpy (panel->search_buffer + l, panel->search_char,
|
||||
panel->search_chpoint);
|
||||
l+= panel->search_chpoint;
|
||||
(panel->search_buffer + l)[0] = '\0';
|
||||
panel->search_chpoint = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
found = 0;
|
||||
buf_max = panel->case_sensitive ?
|
||||
str_prefix (panel->search_buffer, panel->search_buffer) :
|
||||
str_caseprefix (panel->search_buffer, panel->search_buffer);
|
||||
max = 0;
|
||||
sel = panel->selected;
|
||||
for (i = panel->selected; !wrapped || i != panel->selected; i++) {
|
||||
if (i >= panel->count) {
|
||||
i = 0;
|
||||
@ -1987,20 +1971,28 @@ do_search (WPanel *panel, int c_code)
|
||||
break;
|
||||
wrapped = 1;
|
||||
}
|
||||
if (panel->
|
||||
case_sensitive
|
||||
? (strncmp (panel->dir.list[i].fname, panel->search_buffer, l)
|
||||
== 0) : (g_strncasecmp (panel->dir.list[i].fname,
|
||||
panel->search_buffer, l) == 0)) {
|
||||
unselect_item (panel);
|
||||
panel->selected = i;
|
||||
select_item (panel);
|
||||
found = 1;
|
||||
break;
|
||||
l = panel->case_sensitive ?
|
||||
str_prefix (panel->dir.list[i].fname, panel->search_buffer) :
|
||||
str_caseprefix (panel->dir.list[i].fname, panel->search_buffer);
|
||||
if (l > max) {
|
||||
max = l;
|
||||
sel = i;
|
||||
if (max == buf_max) break;
|
||||
}
|
||||
}
|
||||
if (!found)
|
||||
panel->search_buffer[--l] = 0;
|
||||
|
||||
unselect_item (panel);
|
||||
panel->selected = sel;
|
||||
select_item (panel);
|
||||
|
||||
act = panel->search_buffer + strlen (panel->search_buffer);
|
||||
while (max < buf_max) {
|
||||
str_prev_char_safe (&act);
|
||||
act[0] = '\0';
|
||||
buf_max = panel->case_sensitive ?
|
||||
str_prefix (panel->search_buffer, panel->search_buffer) :
|
||||
str_caseprefix (panel->search_buffer, panel->search_buffer);
|
||||
}
|
||||
|
||||
paint_panel (panel);
|
||||
}
|
||||
@ -2016,7 +2008,9 @@ start_search (WPanel *panel)
|
||||
do_search (panel, 0);
|
||||
} else {
|
||||
panel->searching = 1;
|
||||
panel->search_buffer [0] = 0;
|
||||
panel->search_buffer[0] = '\0';
|
||||
panel->search_char[0] = '\0';
|
||||
panel->search_chpoint = 0;
|
||||
display_mini_info (panel);
|
||||
mc_refresh ();
|
||||
}
|
||||
|
@ -135,7 +135,9 @@ void
|
||||
slang_init (void)
|
||||
{
|
||||
SLtt_get_terminfo ();
|
||||
|
||||
#if SLANG_VERSION >= 20000
|
||||
SLutf8_enable (-1);
|
||||
#endif
|
||||
/*
|
||||
* If the terminal in not in terminfo but begins with a well-known
|
||||
* string such as "linux" or "xterm" S-Lang will go on, but the
|
||||
|
813
src/strutil.c
Normal file
813
src/strutil.c
Normal file
@ -0,0 +1,813 @@
|
||||
/* common strings utilities
|
||||
Copyright (C) 2007 Free Software Foundation, Inc.
|
||||
|
||||
Written 2007 by:
|
||||
Rostislav Benes
|
||||
|
||||
The file_date routine is mostly from GNU's fileutils package,
|
||||
written by Richard Stallman and David MacKenzie.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <iconv.h>
|
||||
#include <glib.h>
|
||||
#include <langinfo.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
#include "global.h"
|
||||
#include "strutil.h"
|
||||
|
||||
//names, that are used for utf-8
|
||||
static const char *str_utf8_encodings[] = {
|
||||
"utf-8",
|
||||
"utf8",
|
||||
NULL};
|
||||
|
||||
// standard 8bit encodings, no wide or multibytes characters
|
||||
static const char *str_8bit_encodings[] = {
|
||||
"cp-1251",
|
||||
"cp1251",
|
||||
"cp-1250",
|
||||
"cp1250",
|
||||
"cp-866",
|
||||
"cp866",
|
||||
"cp-850",
|
||||
"cp850",
|
||||
"cp-852",
|
||||
"cp852",
|
||||
"iso-8859",
|
||||
"iso8859",
|
||||
"koi8",
|
||||
NULL
|
||||
};
|
||||
|
||||
// terminal encoding
|
||||
static char *codeset;
|
||||
// function for encoding specific operations
|
||||
static struct str_class used_class;
|
||||
// linked list of string buffers
|
||||
static struct str_buffer *buffer_list = NULL;
|
||||
|
||||
iconv_t str_cnv_to_term;
|
||||
iconv_t str_cnv_from_term;
|
||||
iconv_t str_cnv_not_convert;
|
||||
|
||||
// if enc is same encoding like on terminal
|
||||
static int
|
||||
str_test_not_convert (const char *enc)
|
||||
{
|
||||
return g_ascii_strcasecmp (enc, codeset) == 0;
|
||||
}
|
||||
|
||||
str_conv_t
|
||||
str_crt_conv_to (const char *to_enc)
|
||||
{
|
||||
return (!str_test_not_convert (to_enc)) ? iconv_open (to_enc, codeset) :
|
||||
str_cnv_not_convert;
|
||||
}
|
||||
|
||||
str_conv_t
|
||||
str_crt_conv_from (const char *from_enc)
|
||||
{
|
||||
return (!str_test_not_convert (from_enc)) ? iconv_open (codeset, from_enc) :
|
||||
str_cnv_not_convert;
|
||||
}
|
||||
|
||||
void
|
||||
str_close_conv (str_conv_t conv)
|
||||
{
|
||||
if (conv != str_cnv_not_convert)
|
||||
iconv_close (conv);
|
||||
}
|
||||
|
||||
struct str_buffer *
|
||||
str_get_buffer ()
|
||||
{
|
||||
struct str_buffer *result;
|
||||
|
||||
result = buffer_list;
|
||||
|
||||
while (result != NULL) {
|
||||
if (!result->used) {
|
||||
str_reset_buffer (result);
|
||||
result->used = 1;
|
||||
return result;
|
||||
}
|
||||
result = result->next;
|
||||
}
|
||||
|
||||
result = g_new (struct str_buffer, 1);
|
||||
result->size = BUF_TINY;
|
||||
result->data = g_new0 (char, result->size);
|
||||
result->data[0] = '\0';
|
||||
result->actual = result->data;
|
||||
result->remain = result->size;
|
||||
|
||||
result->next = buffer_list;
|
||||
buffer_list = result;
|
||||
|
||||
result->used = 1;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
void
|
||||
str_release_buffer (struct str_buffer *buffer)
|
||||
{
|
||||
buffer->used = 0;
|
||||
}
|
||||
|
||||
void
|
||||
str_incrase_buffer (struct str_buffer *buffer)
|
||||
{
|
||||
size_t offset;
|
||||
|
||||
offset = buffer->actual - buffer->data;
|
||||
buffer->remain+= buffer->size;
|
||||
buffer->size*= 2;
|
||||
buffer->data = g_renew (char, buffer->data, buffer->size);
|
||||
buffer->actual = buffer->data + offset;
|
||||
}
|
||||
|
||||
void
|
||||
str_reset_buffer (struct str_buffer *buffer)
|
||||
{
|
||||
buffer->data[0] = '\0';
|
||||
buffer->actual = buffer->data;
|
||||
buffer->remain = buffer->size;
|
||||
}
|
||||
|
||||
static int
|
||||
_str_convert (str_conv_t coder, char *string, struct str_buffer *buffer)
|
||||
{
|
||||
int state;
|
||||
size_t left;
|
||||
size_t nconv;
|
||||
|
||||
errno = 0;
|
||||
|
||||
if (used_class.is_valid_string (string)) {
|
||||
state = 0;
|
||||
|
||||
left = strlen (string);
|
||||
|
||||
if (coder == (iconv_t) (-1)) return ESTR_FAILURE;
|
||||
|
||||
iconv(coder, NULL, NULL, NULL, NULL);
|
||||
|
||||
while (((int)left) > 0) {
|
||||
nconv = iconv(coder, &string, &left,
|
||||
&(buffer->actual), &(buffer->remain));
|
||||
if (nconv == (size_t) (-1)) {
|
||||
switch (errno) {
|
||||
case EINVAL:
|
||||
return ESTR_FAILURE;
|
||||
case EILSEQ:
|
||||
string++;
|
||||
left--;
|
||||
if (buffer->remain <= 0) {
|
||||
str_incrase_buffer (buffer);
|
||||
}
|
||||
buffer->actual[0] = '?';
|
||||
buffer->actual++;
|
||||
buffer->remain--;
|
||||
state = ESTR_PROBLEM;
|
||||
break;
|
||||
case E2BIG:
|
||||
str_incrase_buffer (buffer);
|
||||
break;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
return state;
|
||||
} else return ESTR_FAILURE;
|
||||
}
|
||||
|
||||
int
|
||||
str_convert (str_conv_t coder, char *string, struct str_buffer *buffer)
|
||||
{
|
||||
int result;
|
||||
|
||||
result = _str_convert (coder, string, buffer);
|
||||
buffer->actual[0] = '\0';
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static int
|
||||
_str_vfs_convert_from (str_conv_t coder, char *string,
|
||||
struct str_buffer *buffer)
|
||||
{
|
||||
size_t left;
|
||||
size_t nconv;
|
||||
|
||||
left = strlen (string);
|
||||
|
||||
if (coder == (iconv_t) (-1)) return ESTR_FAILURE;
|
||||
|
||||
iconv(coder, NULL, NULL, NULL, NULL);
|
||||
|
||||
do {
|
||||
nconv = iconv(coder, &string, &left,
|
||||
&(buffer->actual), &(buffer->remain));
|
||||
if (nconv == (size_t) (-1)) {
|
||||
switch (errno) {
|
||||
case EINVAL:
|
||||
return ESTR_FAILURE;
|
||||
case EILSEQ:
|
||||
return ESTR_FAILURE;
|
||||
case E2BIG:
|
||||
str_incrase_buffer (buffer);
|
||||
break;
|
||||
}
|
||||
}
|
||||
} while (left > 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
str_vfs_convert_from (str_conv_t coder, char *string, struct str_buffer *buffer)
|
||||
{
|
||||
int result;
|
||||
|
||||
if (coder == str_cnv_not_convert) {
|
||||
str_insert_string (string, buffer);
|
||||
result = 0;
|
||||
} else result = _str_vfs_convert_from (coder, string, buffer);
|
||||
buffer->actual[0] = '\0';
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
int
|
||||
str_vfs_convert_to (str_conv_t coder, const char *string,
|
||||
int size, struct str_buffer *buffer)
|
||||
{
|
||||
return used_class.vfs_convert_to (coder, string, size, buffer);
|
||||
}
|
||||
|
||||
void
|
||||
str_insert_string (const char *string, struct str_buffer *buffer)
|
||||
{
|
||||
size_t s;
|
||||
|
||||
s = strlen (string);
|
||||
while (buffer->remain < s) str_incrase_buffer (buffer);
|
||||
|
||||
memcpy (buffer->actual, string, s);
|
||||
buffer->actual+= s;
|
||||
buffer->remain-= s;
|
||||
buffer->actual[0] = '\0';
|
||||
}
|
||||
|
||||
void
|
||||
str_insert_string2 (const char *string, int size, struct str_buffer *buffer)
|
||||
{
|
||||
size_t s;
|
||||
|
||||
s = (size >= 0) ? size : strlen (string);
|
||||
while (buffer->remain < s) str_incrase_buffer (buffer);
|
||||
|
||||
memcpy (buffer->actual, string, s);
|
||||
buffer->actual+= s;
|
||||
buffer->remain-= s;
|
||||
buffer->actual[0] = '\0';
|
||||
}
|
||||
|
||||
void
|
||||
str_printf (struct str_buffer *buffer, const char *format, ...)
|
||||
{
|
||||
int size;
|
||||
va_list ap;
|
||||
|
||||
va_start (ap, format);
|
||||
size = vsnprintf (buffer->actual, buffer->remain, format, ap);
|
||||
while (buffer->remain <= size) {
|
||||
str_incrase_buffer (buffer);
|
||||
size = vsnprintf (buffer->actual, buffer->remain, format, ap);
|
||||
}
|
||||
buffer->actual+= size;
|
||||
buffer->remain-= size;
|
||||
va_end (ap);
|
||||
}
|
||||
|
||||
void
|
||||
str_insert_char (char ch, struct str_buffer *buffer)
|
||||
{
|
||||
if (buffer->remain <= 1) str_incrase_buffer (buffer);
|
||||
|
||||
buffer->actual[0] = ch;
|
||||
buffer->actual++;
|
||||
buffer->remain--;
|
||||
buffer->actual[0] = '\0';
|
||||
}
|
||||
|
||||
void
|
||||
str_insert_replace_char (struct str_buffer *buffer)
|
||||
{
|
||||
used_class.insert_replace_char (buffer);
|
||||
}
|
||||
|
||||
void
|
||||
str_backward_buffer (struct str_buffer *buffer, int count)
|
||||
{
|
||||
char *prev;
|
||||
|
||||
while ((count > 0) && (buffer->actual > buffer->data)) {
|
||||
prev = str_get_prev_char (buffer->actual);
|
||||
buffer->remain+= buffer->actual - prev;
|
||||
buffer->actual = prev;
|
||||
buffer->actual[0] = '\0';
|
||||
count--;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
str_translate_char (str_conv_t conv, char *keys, size_t ch_size,
|
||||
char *output, size_t out_size)
|
||||
{
|
||||
size_t left;
|
||||
size_t cnv;
|
||||
|
||||
iconv (conv, NULL, NULL, NULL, NULL);
|
||||
|
||||
left = (ch_size == (size_t)(-1)) ? strlen (keys) : ch_size;
|
||||
|
||||
cnv = iconv (conv, &keys, &left, &output, &out_size);
|
||||
if (cnv == (size_t)(-1)) {
|
||||
if (errno == EINVAL) return ESTR_PROBLEM; else return ESTR_FAILURE;
|
||||
} else {
|
||||
output[0] = '\0';
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static const char *
|
||||
str_detect_termencoding ()
|
||||
{
|
||||
return (nl_langinfo(CODESET));
|
||||
}
|
||||
|
||||
static int
|
||||
str_test_encoding_class (const char *encoding, const char **table)
|
||||
{
|
||||
int t;
|
||||
int result = 0;
|
||||
|
||||
for (t = 0; table[t] != NULL; t++) {
|
||||
result+= (g_ascii_strncasecmp (encoding, table[t],
|
||||
strlen (table[t])) == 0);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static void
|
||||
str_choose_str_functions ()
|
||||
{
|
||||
if (str_test_encoding_class (codeset, str_utf8_encodings)) {
|
||||
used_class = str_utf8_init ();
|
||||
} else if (str_test_encoding_class (codeset, str_8bit_encodings)) {
|
||||
used_class = str_8bit_init ();
|
||||
} else {
|
||||
used_class = str_ascii_init ();
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
str_init_strings (const char *termenc)
|
||||
{
|
||||
codeset = g_strdup ((termenc != NULL)
|
||||
? termenc
|
||||
: str_detect_termencoding ());
|
||||
|
||||
str_cnv_not_convert = iconv_open (codeset, codeset);
|
||||
if (str_cnv_not_convert == INVALID_CONV) {
|
||||
if (termenc != NULL) {
|
||||
g_free (codeset);
|
||||
codeset = g_strdup (str_detect_termencoding ());
|
||||
str_cnv_not_convert = iconv_open (codeset, codeset);
|
||||
}
|
||||
|
||||
if (str_cnv_not_convert == INVALID_CONV) {
|
||||
g_free (codeset);
|
||||
codeset = g_strdup ("ascii");
|
||||
str_cnv_not_convert = iconv_open (codeset, codeset);
|
||||
}
|
||||
}
|
||||
|
||||
str_cnv_to_term = str_cnv_not_convert;
|
||||
str_cnv_from_term = str_cnv_not_convert;
|
||||
|
||||
str_choose_str_functions ();
|
||||
}
|
||||
|
||||
static void
|
||||
str_release_buffer_list ()
|
||||
{
|
||||
struct str_buffer *buffer;
|
||||
struct str_buffer *next;
|
||||
|
||||
buffer = buffer_list;
|
||||
while (buffer != NULL) {
|
||||
next = buffer->next;
|
||||
g_free (buffer->data);
|
||||
g_free (buffer);
|
||||
buffer = next;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
str_uninit_strings ()
|
||||
{
|
||||
str_release_buffer_list ();
|
||||
|
||||
iconv_close (str_cnv_not_convert);
|
||||
}
|
||||
|
||||
const char *
|
||||
str_term_form (const char *text)
|
||||
{
|
||||
return used_class.term_form (text);
|
||||
}
|
||||
|
||||
const char *
|
||||
str_fit_to_term (const char *text, int width, int just_mode)
|
||||
{
|
||||
return used_class.fit_to_term (text, width, just_mode);
|
||||
}
|
||||
|
||||
const char *
|
||||
str_term_trim (const char *text, int width)
|
||||
{
|
||||
return used_class.term_trim (text, width);
|
||||
}
|
||||
|
||||
void
|
||||
str_msg_term_size (const char *text, int *lines, int *columns)
|
||||
{
|
||||
return used_class.msg_term_size (text, lines, columns);
|
||||
}
|
||||
|
||||
const char *
|
||||
str_term_substring (const char *text, int start, int width)
|
||||
{
|
||||
return used_class.term_substring (text, start, width);
|
||||
}
|
||||
|
||||
char *
|
||||
str_get_next_char (char *text)
|
||||
{
|
||||
|
||||
used_class.cnext_char ((const char **)&text);
|
||||
return text;
|
||||
}
|
||||
|
||||
const char *
|
||||
str_cget_next_char (const char *text)
|
||||
{
|
||||
used_class.cnext_char (&text);
|
||||
return text;
|
||||
}
|
||||
|
||||
void
|
||||
str_next_char (char **text)
|
||||
{
|
||||
used_class.cnext_char ((const char **) text);
|
||||
}
|
||||
|
||||
void
|
||||
str_cnext_char (const char **text)
|
||||
{
|
||||
used_class.cnext_char (text);
|
||||
}
|
||||
|
||||
char *
|
||||
str_get_prev_char (char *text)
|
||||
{
|
||||
used_class.cprev_char ((const char **) &text);
|
||||
return text;
|
||||
}
|
||||
|
||||
const char *
|
||||
str_cget_prev_char (const char *text)
|
||||
{
|
||||
used_class.cprev_char (&text);
|
||||
return text;
|
||||
}
|
||||
|
||||
void
|
||||
str_prev_char (char **text)
|
||||
{
|
||||
used_class.cprev_char ((const char **) text);
|
||||
}
|
||||
|
||||
void
|
||||
str_cprev_char (const char **text)
|
||||
{
|
||||
used_class.cprev_char (text);
|
||||
}
|
||||
|
||||
char *
|
||||
str_get_next_char_safe (char *text)
|
||||
{
|
||||
used_class.cnext_char_safe ((const char **) &text);
|
||||
return text;
|
||||
}
|
||||
|
||||
const char *
|
||||
str_cget_next_char_safe (const char *text)
|
||||
{
|
||||
used_class.cnext_char_safe (&text);
|
||||
return text;
|
||||
}
|
||||
|
||||
void
|
||||
str_next_char_safe (char **text)
|
||||
{
|
||||
used_class.cnext_char_safe ((const char **) text);
|
||||
}
|
||||
|
||||
void
|
||||
str_cnext_char_safe (const char **text)
|
||||
{
|
||||
used_class.cnext_char_safe (text);
|
||||
}
|
||||
|
||||
char *
|
||||
str_get_prev_char_safe (char *text)
|
||||
{
|
||||
used_class.cprev_char_safe ((const char **) &text);
|
||||
return text;
|
||||
}
|
||||
|
||||
const char *
|
||||
str_cget_prev_char_safe (const char *text)
|
||||
{
|
||||
used_class.cprev_char_safe (&text);
|
||||
return text;
|
||||
}
|
||||
|
||||
void
|
||||
str_prev_char_safe (char **text)
|
||||
{
|
||||
used_class.cprev_char_safe ((const char **) text);
|
||||
}
|
||||
|
||||
void
|
||||
str_cprev_char_safe (const char **text)
|
||||
{
|
||||
used_class.cprev_char_safe (text);
|
||||
}
|
||||
|
||||
int
|
||||
str_next_noncomb_char (char **text)
|
||||
{
|
||||
return used_class.cnext_noncomb_char ((const char **) text);
|
||||
}
|
||||
|
||||
int
|
||||
str_cnext_noncomb_char (const char **text)
|
||||
{
|
||||
return used_class.cnext_noncomb_char (text);
|
||||
}
|
||||
|
||||
int
|
||||
str_prev_noncomb_char (char **text, const char *begin)
|
||||
{
|
||||
return used_class.cprev_noncomb_char ((const char **) text, begin);
|
||||
}
|
||||
|
||||
int
|
||||
str_cprev_noncomb_char (const char **text, const char *begin)
|
||||
{
|
||||
return used_class.cprev_noncomb_char (text, begin);
|
||||
}
|
||||
|
||||
int
|
||||
str_is_valid_char (const char *ch, size_t size)
|
||||
{
|
||||
return used_class.is_valid_char (ch, size);
|
||||
}
|
||||
|
||||
int
|
||||
str_term_width1 (const char *text)
|
||||
{
|
||||
return used_class.term_width1 (text);
|
||||
}
|
||||
|
||||
int
|
||||
str_term_width2 (const char *text, size_t length)
|
||||
{
|
||||
return used_class.term_width2 (text, length);
|
||||
}
|
||||
|
||||
int
|
||||
str_term_char_width (const char *text)
|
||||
{
|
||||
return used_class.term_char_width (text);
|
||||
}
|
||||
|
||||
int
|
||||
str_offset_to_pos (const char* text, size_t length)
|
||||
{
|
||||
return used_class.offset_to_pos (text, length);
|
||||
}
|
||||
|
||||
int
|
||||
str_length (const char* text)
|
||||
{
|
||||
return used_class.length (text);
|
||||
}
|
||||
|
||||
int
|
||||
str_length2 (const char* text, int size)
|
||||
{
|
||||
return used_class.length2 (text, size);
|
||||
}
|
||||
|
||||
int
|
||||
str_length_noncomb (const char* text)
|
||||
{
|
||||
return used_class.length_noncomb (text);
|
||||
}
|
||||
|
||||
int
|
||||
str_column_to_pos (const char *text, size_t pos)
|
||||
{
|
||||
return used_class.column_to_pos (text, pos);
|
||||
}
|
||||
|
||||
int
|
||||
str_isspace (const char *ch)
|
||||
{
|
||||
return used_class.isspace (ch);
|
||||
}
|
||||
|
||||
int
|
||||
str_ispunct (const char *ch)
|
||||
{
|
||||
return used_class.ispunct (ch);
|
||||
}
|
||||
|
||||
int
|
||||
str_isalnum (const char *ch)
|
||||
{
|
||||
return used_class.isalnum (ch);
|
||||
}
|
||||
|
||||
int
|
||||
str_isdigit (const char *ch)
|
||||
{
|
||||
return used_class.isdigit (ch);
|
||||
}
|
||||
|
||||
int
|
||||
str_toupper (const char *ch, char **out, size_t *remain)
|
||||
{
|
||||
return used_class.toupper (ch, out, remain);
|
||||
}
|
||||
|
||||
int
|
||||
str_tolower (const char *ch, char **out, size_t *remain)
|
||||
{
|
||||
return used_class.tolower (ch, out, remain);
|
||||
}
|
||||
|
||||
int
|
||||
str_isprint (const char *ch)
|
||||
{
|
||||
return used_class.isprint (ch);
|
||||
}
|
||||
|
||||
int
|
||||
str_iscombiningmark (const char *ch)
|
||||
{
|
||||
return used_class.iscombiningmark (ch);
|
||||
}
|
||||
|
||||
const char *
|
||||
str_trunc (const char *text, int width)
|
||||
{
|
||||
return used_class.trunc (text, width);
|
||||
}
|
||||
|
||||
char *
|
||||
str_create_search_needle (const char *needle, int case_sen)
|
||||
{
|
||||
return used_class.create_search_needle (needle, case_sen);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
str_release_search_needle (char *needle, int case_sen)
|
||||
{
|
||||
used_class.release_search_needle (needle, case_sen);
|
||||
}
|
||||
|
||||
const char *
|
||||
str_search_first (const char *text, const char *search, int case_sen)
|
||||
{
|
||||
return used_class.search_first (text, search, case_sen);
|
||||
}
|
||||
|
||||
const char *
|
||||
str_search_last (const char *text, const char *search, int case_sen)
|
||||
{
|
||||
return used_class.search_last (text, search, case_sen);
|
||||
}
|
||||
|
||||
int
|
||||
str_is_valid_string (const char *text)
|
||||
{
|
||||
return used_class.is_valid_string (text);
|
||||
}
|
||||
|
||||
int
|
||||
str_compare (const char *t1, const char *t2)
|
||||
{
|
||||
return used_class.compare (t1, t2);
|
||||
}
|
||||
|
||||
int
|
||||
str_ncompare (const char *t1, const char *t2)
|
||||
{
|
||||
return used_class.ncompare (t1, t2);
|
||||
}
|
||||
|
||||
int
|
||||
str_casecmp (const char *t1, const char *t2)
|
||||
{
|
||||
return used_class.casecmp (t1, t2);
|
||||
}
|
||||
|
||||
int
|
||||
str_ncasecmp (const char *t1, const char *t2)
|
||||
{
|
||||
return used_class.ncasecmp (t1, t2);
|
||||
}
|
||||
|
||||
int
|
||||
str_prefix (const char *text, const char *prefix)
|
||||
{
|
||||
return used_class.prefix (text, prefix);
|
||||
}
|
||||
|
||||
int
|
||||
str_caseprefix (const char *text, const char *prefix)
|
||||
{
|
||||
return used_class.caseprefix (text, prefix);
|
||||
}
|
||||
|
||||
void
|
||||
str_fix_string (char *text)
|
||||
{
|
||||
used_class.fix_string (text);
|
||||
}
|
||||
|
||||
char *
|
||||
str_create_key (const char *text, int case_sen)
|
||||
{
|
||||
return used_class.create_key (text, case_sen);
|
||||
}
|
||||
|
||||
char *
|
||||
str_create_key_for_filename (const char *text, int case_sen)
|
||||
{
|
||||
return used_class.create_key_for_filename (text, case_sen);
|
||||
}
|
||||
|
||||
int
|
||||
str_key_collate (const char *t1, const char *t2, int case_sen)
|
||||
{
|
||||
return used_class.key_collate (t1, t2, case_sen);
|
||||
}
|
||||
|
||||
void
|
||||
str_release_key (char *key, int case_sen)
|
||||
{
|
||||
used_class.release_key (key, case_sen);
|
||||
}
|
||||
|
537
src/strutil.h
Normal file
537
src/strutil.h
Normal file
@ -0,0 +1,537 @@
|
||||
#ifndef MC_STRUTIL_H
|
||||
#define MC_STRUTIL_H
|
||||
|
||||
/* Header file for strutil.c, strutilascii.c, strutil8bit.c, strutilutf8.c.
|
||||
* There are two sort of functions:
|
||||
* 1. functions for working with growing strings and conversion strings between
|
||||
* different encodings.
|
||||
* (implemented directly in strutil.c)
|
||||
* 2. functions, that hide differences between encodings derived from ASCII.
|
||||
* (implemented separately in strutilascii.c, strutil8bit.c, strutilutf8.c)
|
||||
* documentation is made for UTF-8 version of functions.
|
||||
*/
|
||||
|
||||
/* invalid strings
|
||||
* function, that works with invalid strings are marked with "I"
|
||||
* in documentation
|
||||
* invalid bytes of string are handled as one byte characters with width 1, they
|
||||
* are displayed as questionmarks, I-maked comparing functions try to keep
|
||||
* the original value of these bytes.
|
||||
*/
|
||||
|
||||
/* combining characters
|
||||
* displaynig: all handled as zero with characters, expect combing character
|
||||
* at the begin of string, this character has with one (space add before),
|
||||
* so str_term_width is not good for computing width of singles characters
|
||||
* (never return zero, expect emtpy string)
|
||||
* for compatibility are strings composed before displaynig
|
||||
* comparing: comparing decompose all string before comparing, n-compare
|
||||
* functions do not work as is usual, because same strings do not have to be
|
||||
* same length in UTF-8. So they return 0 if one string is prefix of the other
|
||||
* one.
|
||||
* str_prefix is used to determine, how many characters from one string are
|
||||
* prefix in second string. However, str_prefix return number of characters in
|
||||
* decompose form. (used in do_search (screen.c))
|
||||
*/
|
||||
#include <iconv.h>
|
||||
|
||||
/* errors for conversion function:
|
||||
* problem means, that not every characters was successfully converted (They are
|
||||
* replaced with questionmark). So is impossible convert string back.
|
||||
* failure means, that conversion is not possible (example: wrong encoding
|
||||
* of input string)
|
||||
*/
|
||||
#define ESTR_PROBLEM 1
|
||||
#define ESTR_FAILURE 2
|
||||
|
||||
/* constanst originally from screen.c
|
||||
* used for alignment strings on terminal
|
||||
*/
|
||||
#define J_LEFT 0x01
|
||||
#define J_RIGHT 0x02
|
||||
#define J_CENTER 0x03
|
||||
// if there is enough space for string on terminal, string is centered
|
||||
// otherwise is aligned to left
|
||||
#define J_CENTER_LEFT 0x04
|
||||
|
||||
#define IS_FIT(x) ((x) & 0x0010)
|
||||
#define MAKE_FIT(x) ((x) | 0x0010)
|
||||
#define HIDE_FIT(x) ((x) & 0x000f)
|
||||
|
||||
// fit alignment, if string is to long, is truncated with '~'
|
||||
#define J_LEFT_FIT 0x11
|
||||
#define J_RIGHT_FIT 0x12
|
||||
#define J_CENTER_FIT 0x13
|
||||
#define J_CENTER_LEFT_FIT 0x14
|
||||
|
||||
// redefinition of iconv_t, so is not needed include iconv.h in other files.
|
||||
typedef iconv_t str_conv_t;
|
||||
#define INVALID_CONV ((iconv_t) (-1))
|
||||
|
||||
// standard convertors
|
||||
extern str_conv_t str_cnv_to_term;
|
||||
extern str_conv_t str_cnv_from_term;
|
||||
// from terminal encoding to terminal encoding
|
||||
extern str_conv_t str_cnv_not_convert;
|
||||
|
||||
/* structure for growing strings
|
||||
* try to avoid set any members manually
|
||||
*/
|
||||
struct str_buffer {
|
||||
// all buffers are stored in linked list
|
||||
struct str_buffer *next;
|
||||
// if is buffer in use or not
|
||||
int used;
|
||||
// whole string
|
||||
char *data;
|
||||
// size of string
|
||||
size_t size;
|
||||
// end of string, actual[0] is always '\0'
|
||||
char *actual;
|
||||
// how many (chars)bytes remain after actual
|
||||
size_t remain;
|
||||
};
|
||||
|
||||
// all functions in str_class must be defined for every encoding
|
||||
struct str_class {
|
||||
int (*vfs_convert_to) (str_conv_t coder, const char *string,
|
||||
int size, struct str_buffer *buffer); //I
|
||||
void (*insert_replace_char) (struct str_buffer *buffer);
|
||||
int (*is_valid_string) (const char *); //I
|
||||
int (*is_valid_char) (const char *, size_t); //I
|
||||
void (*cnext_char) (const char **);
|
||||
void (*cprev_char) (const char **);
|
||||
void (*cnext_char_safe) (const char **); //I
|
||||
void (*cprev_char_safe) (const char **); //I
|
||||
int (*cnext_noncomb_char) (const char **text); //I
|
||||
int (*cprev_noncomb_char) (const char **text, const char *begin); //I
|
||||
int (*isspace) (const char *); //I
|
||||
int (*ispunct) (const char *); //I
|
||||
int (*isalnum) (const char *); //I
|
||||
int (*isdigit) (const char *); //I
|
||||
int (*isprint) (const char *); //I
|
||||
int (*iscombiningmark) (const char *); //I
|
||||
int (*length) (const char *); //I
|
||||
int (*length2) (const char *, int); //I
|
||||
int (*length_noncomb) (const char *); //I
|
||||
int (*toupper) (const char *, char **, size_t *);
|
||||
int (*tolower) (const char *, char **, size_t *);
|
||||
void (*fix_string) (char *); //I
|
||||
const char *(*term_form) (const char *); //I
|
||||
const char *(*fit_to_term) (const char *, int, int); //I
|
||||
const char *(*term_trim) (const char *text, int width); //I
|
||||
void (*msg_term_size) (const char *, int *, int *); //I
|
||||
const char *(*term_substring) (const char *, int, int); //I
|
||||
int (*term_width1) (const char *); //I
|
||||
int (*term_width2) (const char *, size_t); //I
|
||||
int (*term_char_width) (const char *); //I
|
||||
const char *(*trunc) (const char *, int); //I
|
||||
int (*offset_to_pos) (const char *, size_t); //I
|
||||
int (*column_to_pos) (const char *, size_t); //I
|
||||
char *(*create_search_needle) (const char *, int);
|
||||
void (*release_search_needle) (char *, int);
|
||||
const char *(*search_first) (const char *, const char *, int);
|
||||
const char *(*search_last) (const char *, const char *, int);
|
||||
int (*compare) (const char *, const char *); //I
|
||||
int (*ncompare) (const char *, const char *); //I
|
||||
int (*casecmp) (const char *, const char *); //I
|
||||
int (*ncasecmp) (const char *, const char *); //I
|
||||
int (*prefix) (const char *, const char *); //I
|
||||
int (*caseprefix) (const char *, const char *); //I
|
||||
char *(*create_key) (const char *text, int case_sen); //I
|
||||
char *(*create_key_for_filename) (const char *text, int case_sen); //I
|
||||
int (*key_collate) (const char *t1, const char *t2, int case_sen); //I
|
||||
void (*release_key) (char *key, int case_sen); //I
|
||||
};
|
||||
|
||||
struct str_class str_utf8_init ();
|
||||
struct str_class str_8bit_init ();
|
||||
struct str_class str_ascii_init ();
|
||||
|
||||
/* create convertor from "from_enc" to terminal encoding
|
||||
* if "from_enc" is not supported return INVALID_CONV
|
||||
*/
|
||||
str_conv_t str_crt_conv_from (const char *from_enc);
|
||||
|
||||
/* create convertor from terminal encoding to "to_enc"
|
||||
* if "to_enc" is not supported return INVALID_CONV
|
||||
*/
|
||||
str_conv_t str_crt_conv_to (const char *to_enc);
|
||||
|
||||
/* close convertor, do not close str_cnv_to_term, str_cnv_from_term,
|
||||
* str_cnv_not_convert
|
||||
*/
|
||||
void str_close_conv (str_conv_t conv);
|
||||
|
||||
/* return on of not used buffers (.used == 0) or create new
|
||||
* returned buffer has set .used to 1
|
||||
*/
|
||||
struct str_buffer *str_get_buffer ();
|
||||
|
||||
/* clear buffer, in .data is empty string, .actual = .data, .remain = .size
|
||||
* do not set .used
|
||||
*/
|
||||
void str_reset_buffer (struct str_buffer *buffer);
|
||||
|
||||
/* set .used of buffer to 0, so can be returned by str_get_buffer again
|
||||
* data in buffer may stay valid after function return
|
||||
*/
|
||||
void str_release_buffer (struct str_buffer *buffer);
|
||||
|
||||
/* incrase capacity of buffer
|
||||
*/
|
||||
void str_incrase_buffer (struct str_buffer *buffer);
|
||||
|
||||
/* convert string using coder, result of conversion is appended at end of buffer
|
||||
* return 0 if there was no problem.
|
||||
* otherwise return ESTR_PROBLEM or ESTR_FAILURE
|
||||
*/
|
||||
int str_convert (str_conv_t coder, char *string,
|
||||
struct str_buffer *buffer);
|
||||
|
||||
/* return only 0 or ESTR_FAILURE, because vfs must be able to convert result to
|
||||
* original string. (so no replace with questionmark)
|
||||
* if coder is str_cnv_from_term or str_cnv_not_convert, string is only copied,
|
||||
* so is possible to show file, that is not valid in terminal encoding
|
||||
*/
|
||||
int str_vfs_convert_from (str_conv_t coder, char *string,
|
||||
struct str_buffer *buffer);
|
||||
|
||||
/* if coder is str_cnv_to_term or str_cnv_not_convert, string is only copied,
|
||||
* does replace with questionmark
|
||||
* I
|
||||
*/
|
||||
int str_vfs_convert_to (str_conv_t coder, const char *string,
|
||||
int size, struct str_buffer *buffer);
|
||||
|
||||
/* append string at the end of buffer
|
||||
*/
|
||||
void str_insert_string (const char *string, struct str_buffer *buffer);
|
||||
|
||||
/* append string at the end of buffer, limit to size
|
||||
*/
|
||||
void
|
||||
str_insert_string2 (const char *string, int size, struct str_buffer *buffer);
|
||||
|
||||
/* printf functin for str_buffer, append result of printf at the end of buffer
|
||||
*/
|
||||
void
|
||||
str_printf (struct str_buffer *buffer, const char *format, ...);
|
||||
|
||||
/* append char at the end of buffer
|
||||
*/
|
||||
void str_insert_char (char ch, struct str_buffer *buffer);
|
||||
|
||||
/* add standard replacement character in terminal encoding
|
||||
*/
|
||||
void str_insert_replace_char (struct str_buffer *buffer);
|
||||
|
||||
/* rewind "count" characters buffer back
|
||||
*/
|
||||
void str_backward_buffer (struct str_buffer *buffer, int count);
|
||||
|
||||
/* init strings and set terminal encoding,
|
||||
* if is termenc NULL, detect terminal encoding
|
||||
* create all str_cnv_* and set functions for terminal encoding
|
||||
*/
|
||||
void str_init_strings (const char *termenc);
|
||||
|
||||
/* free all str_buffer and all str_cnv_*
|
||||
*/
|
||||
void str_uninit_strings ();
|
||||
|
||||
/* try convert characters in ch to output using conv
|
||||
* ch_size is size of ch, can by (size_t)(-1) (-1 only for ASCII
|
||||
* compatible encoding, for other must be set)
|
||||
* return 0 if conversion was successfully, ESTR_PROBLEM if ch contains only
|
||||
* part of characters, ESTR_FAILURE if conversion is not possible
|
||||
*/
|
||||
int str_translate_char (str_conv_t conv, char *ch, size_t ch_size,
|
||||
char *output, size_t out_size);
|
||||
|
||||
/* test, if text is valid in terminal encoding
|
||||
* I
|
||||
*/
|
||||
int str_is_valid_string (const char *text);
|
||||
|
||||
/* test, if first char of ch is valid
|
||||
* size, how many bytes characters occupied, could be (size_t)(-1)
|
||||
* return 1 if it is valid, -1 if it is invalid or -2 if it is only part of
|
||||
* multibyte character
|
||||
* I
|
||||
*/
|
||||
int str_is_valid_char (const char *ch, size_t size);
|
||||
|
||||
/* return next characters after text, do not call on the end of string
|
||||
*/
|
||||
char *str_get_next_char (char *text);
|
||||
const char *str_cget_next_char (const char *text);
|
||||
|
||||
/* return previous characters before text, do not call on the start of strings
|
||||
*/
|
||||
char *str_get_prev_char (char *text);
|
||||
const char *str_cget_prev_char (const char *text);
|
||||
|
||||
/* set text to next characters, do not call on the end of string
|
||||
*/
|
||||
void str_next_char (char **text);
|
||||
void str_cnext_char (const char **text);
|
||||
|
||||
/* set text to previous characters, do not call on the start of strings
|
||||
*/
|
||||
void str_prev_char (char **text);
|
||||
void str_cprev_char (const char **text);
|
||||
|
||||
/* return next characters after text, do not call on the end of string
|
||||
* works with invalid string
|
||||
* I
|
||||
*/
|
||||
char *str_get_next_char_safe (char *text);
|
||||
const char *str_cget_next_char_safe (const char *text);
|
||||
|
||||
/* return previous characters before text, do not call on the start of strings
|
||||
* works with invalid string
|
||||
* I
|
||||
*/
|
||||
char *str_get_prev_char_safe (char *text);
|
||||
const char *str_cget_prev_char_safe (const char *text);
|
||||
|
||||
/* set text to next characters, do not call on the end of string
|
||||
* works with invalid string
|
||||
* I
|
||||
*/
|
||||
void str_next_char_safe (char **text);
|
||||
void str_cnext_char_safe (const char **text);
|
||||
|
||||
/* set text to previous characters, do not call on the start of strings
|
||||
* works with invalid string
|
||||
* I
|
||||
*/
|
||||
void str_prev_char_safe (char **text);
|
||||
void str_cprev_char_safe (const char **text);
|
||||
|
||||
/* set text to next noncombining characters, check the end of text
|
||||
* return how many characters was skipped
|
||||
* works with invalid string
|
||||
* I
|
||||
*/
|
||||
int str_next_noncomb_char (char **text);
|
||||
int str_cnext_noncomb_char (const char **text);
|
||||
|
||||
/* set text to previous noncombining characters, search stop at begin
|
||||
* return how many characters was skipped
|
||||
* works with invalid string
|
||||
* I
|
||||
*/
|
||||
int str_prev_noncomb_char (char **text, const char *begin);
|
||||
int str_cprev_noncomb_char (const char **text, const char *begin);
|
||||
|
||||
/* if first characters in ch is space, tabulator or new lines
|
||||
* I
|
||||
*/
|
||||
int str_isspace (const char *ch);
|
||||
|
||||
/* if first characters in ch is punctuation or symbol
|
||||
* I
|
||||
*/
|
||||
int str_ispunct (const char *ch);
|
||||
|
||||
/* if first characters in ch is alphanum
|
||||
* I
|
||||
*/
|
||||
int str_isalnum (const char *ch);
|
||||
|
||||
/* if first characters in ch is digit
|
||||
* I
|
||||
*/
|
||||
int str_isdigit (const char *ch);
|
||||
|
||||
/* if first characters in ch is printable
|
||||
* I
|
||||
*/
|
||||
int str_isprint (const char *ch);
|
||||
|
||||
/* if first characters in ch is a combining mark (only in utf-8)
|
||||
* combining makrs are assumed to be zero width
|
||||
* I
|
||||
*/
|
||||
int str_iscombiningmark (const char *ch);
|
||||
|
||||
/* write lower from of fisrt characters in ch into out
|
||||
* decrase remain by size of returned characters
|
||||
* if out is not big enough, do nothing
|
||||
*/
|
||||
int str_toupper (const char *ch, char **out, size_t *remain);
|
||||
|
||||
/* write upper from of fisrt characters in ch into out
|
||||
* decrase remain by size of returned characters
|
||||
* if out is not big enough, do nothing
|
||||
*/
|
||||
int str_tolower (const char *ch, char **out, size_t *remain);
|
||||
|
||||
/* return length of text in characters
|
||||
* I
|
||||
*/
|
||||
int str_length (const char* text);
|
||||
|
||||
/* return length of text in characters, limit to size
|
||||
* I
|
||||
*/
|
||||
int str_length2 (const char* text, int size);
|
||||
|
||||
/* return length of text in characters, count only noncombining characters
|
||||
* I
|
||||
*/
|
||||
int str_length_noncomb (const char* text);
|
||||
|
||||
/* replace all invalid characters in text with questionmark
|
||||
* after return, text is valid string in terminal encoding
|
||||
* I
|
||||
*/
|
||||
void str_fix_string (char* text);
|
||||
|
||||
/* replace all invalid characters in text with questionmark
|
||||
* replace all unprintable characters with '.'
|
||||
* return static allocated string, "text" is not changed
|
||||
* returned string do not need to be freed
|
||||
* I
|
||||
*/
|
||||
const char *str_term_form (const char *text);
|
||||
|
||||
/* like str_term_form, but text can be alignment to width
|
||||
* alignment is specified in just_mode (J_LEFT, J_LEFT_FIT, ...)
|
||||
* result is completed with spaces to width
|
||||
* I
|
||||
*/
|
||||
const char *str_fit_to_term (const char *text, int width, int just_mode);
|
||||
|
||||
/* like str_term_form, but when text is wider than width, three dots are
|
||||
* inserted at begin and result is completed with suffix of text
|
||||
* no additional spaces are inserted
|
||||
* I
|
||||
*/
|
||||
const char *str_term_trim (const char *text, int width);
|
||||
|
||||
/* return how many lines and columns will text occupy on terminal
|
||||
* I
|
||||
*/
|
||||
void str_msg_term_size (const char *text, int *lines, int *columns);
|
||||
|
||||
/* like str_term_form, but return only specified substring
|
||||
* start - column (position) on terminal, where substring begin
|
||||
* result is completed with spaces to width
|
||||
* I
|
||||
*/
|
||||
const char *str_term_substring (const char *text, int start, int width);
|
||||
|
||||
/* return width, that will be text occupied on terminal
|
||||
* I
|
||||
*/
|
||||
int str_term_width1 (const char *text);
|
||||
|
||||
/* return width, that will be text occupied on terminal
|
||||
* text is limited by length in characters
|
||||
* I
|
||||
*/
|
||||
int str_term_width2 (const char *text, size_t length);
|
||||
|
||||
/* return width, that will be character occupied on terminal
|
||||
* combining characters are always zero width
|
||||
* I
|
||||
*/
|
||||
int str_term_char_width (const char *text);
|
||||
|
||||
/* convert position in characters to position in bytes
|
||||
* I
|
||||
*/
|
||||
int str_offset_to_pos (const char* text, size_t length);
|
||||
|
||||
/* convert position on terminal to position in characters
|
||||
* I
|
||||
*/
|
||||
int str_column_to_pos (const char *text, size_t pos);
|
||||
|
||||
/* like str_fit_to_term width just_mode = J_LEFT_FIT,
|
||||
* but do not insert additional spaces
|
||||
* I
|
||||
*/
|
||||
const char *str_trunc (const char *text, int width);
|
||||
|
||||
/* create needle, that will be searched in str_search_fist/last,
|
||||
* so needle can be reused
|
||||
* in UTF-8 return normalized form of needle
|
||||
*/
|
||||
char *str_create_search_needle (const char *needle, int case_sen);
|
||||
|
||||
/* free needle returned by str_create_search_needle
|
||||
*/
|
||||
void str_release_search_needle (char *needle, int case_sen);
|
||||
|
||||
/* search for first occurrence of search in text
|
||||
*/
|
||||
const char *str_search_first (const char *text, const char *needle, int case_sen);
|
||||
|
||||
/* search for last occurrence of search in text
|
||||
*/
|
||||
const char *str_search_last (const char *text, const char *needle, int case_sen);
|
||||
|
||||
/* case sensitive compare two strings
|
||||
* I
|
||||
*/
|
||||
int str_compare (const char *t1, const char *t2);
|
||||
|
||||
/* case sensitive compare two strings
|
||||
* if one string is prefix of the other string, return 0
|
||||
* I
|
||||
*/
|
||||
int str_ncompare (const char *t1, const char *t2);
|
||||
|
||||
/* case insensitive compare two strings
|
||||
* I
|
||||
*/
|
||||
int str_casecmp (const char *t1, const char *t2);
|
||||
|
||||
/* case insensitive compare two strings
|
||||
* if one string is prefix of the other string, return 0
|
||||
* I
|
||||
*/
|
||||
int str_ncasecmp (const char *t1, const char *t2);
|
||||
|
||||
/* return, how many bytes are are same from start in text and prefix
|
||||
* both strings are decomposed befor comapring and return value is counted
|
||||
* in decomposed form, too. caling with prefix, prefix, you get size in bytes
|
||||
* of prefix in decomposed form,
|
||||
* I
|
||||
*/
|
||||
int str_prefix (const char *text, const char *prefix);
|
||||
|
||||
/* case insensitive version of str_prefix
|
||||
* I
|
||||
*/
|
||||
int str_caseprefix (const char *text, const char *prefix);
|
||||
|
||||
/* create a key that is used by str_key_collate
|
||||
* I
|
||||
*/
|
||||
char *str_create_key (const char *text, int case_sen);
|
||||
|
||||
/* create a key that is used by str_key_collate
|
||||
* should aware dot '.' in text
|
||||
* I
|
||||
*/
|
||||
char *str_create_key_for_filename (const char *text, int case_sen);
|
||||
|
||||
/* compare two string using LC_COLLATE, if is possible
|
||||
* if case_sen is set, comparing is case sensitive,
|
||||
* case_sen must be same for str_create_key, str_key_collate and str_release_key
|
||||
* I
|
||||
*/
|
||||
int str_key_collate (const char *t1, const char *t2, int case_sen);
|
||||
|
||||
/* release_key created by str_create_key, only rigth way to release key
|
||||
* I
|
||||
*/
|
||||
void str_release_key (char *key, int case_sen);
|
||||
|
||||
#endif
|
||||
|
673
src/strutil8bit.c
Normal file
673
src/strutil8bit.c
Normal file
@ -0,0 +1,673 @@
|
||||
/* 8bit strings utilities
|
||||
Copyright (C) 2007 Free Software Foundation, Inc.
|
||||
|
||||
Written 2007 by:
|
||||
Rostislav Benes
|
||||
|
||||
The file_date routine is mostly from GNU's fileutils package,
|
||||
written by Richard Stallman and David MacKenzie.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <stdio.h>
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
#include <iconv.h>
|
||||
|
||||
#include "global.h"
|
||||
#include "strutil.h"
|
||||
|
||||
/* functions for singlebyte encodings, all characters have width 1
|
||||
* using standard system functions
|
||||
* there are only small differences between functions in strutil8bit.c
|
||||
* and strutilascii.c
|
||||
*/
|
||||
|
||||
static const char replch = '?';
|
||||
|
||||
static void
|
||||
str_8bit_insert_replace_char (struct str_buffer *buffer)
|
||||
{
|
||||
str_insert_char (replch, buffer);
|
||||
}
|
||||
|
||||
static int
|
||||
str_8bit_is_valid_string (const char *text)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
str_8bit_is_valid_char (const char *ch, size_t size)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void
|
||||
str_8bit_cnext_char (const char **text)
|
||||
{
|
||||
(*text)++;
|
||||
}
|
||||
|
||||
static void
|
||||
str_8bit_cprev_char (const char **text)
|
||||
{
|
||||
(*text)--;
|
||||
}
|
||||
|
||||
static int
|
||||
str_8bit_cnext_noncomb_char (const char **text)
|
||||
{
|
||||
if (*text[0] != '\0') {
|
||||
(*text)++;
|
||||
return 1;
|
||||
} else return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
str_8bit_cprev_noncomb_char (const char **text, const char *begin)
|
||||
{
|
||||
if ((*text) != begin) {
|
||||
(*text)--;
|
||||
return 1;
|
||||
} else return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
str_8bit_isspace (const char *text)
|
||||
{
|
||||
return isspace (text[0]);
|
||||
}
|
||||
|
||||
static int
|
||||
str_8bit_ispunct (const char *text)
|
||||
{
|
||||
return ispunct (text[0]);
|
||||
}
|
||||
|
||||
static int
|
||||
str_8bit_isalnum (const char *text)
|
||||
{
|
||||
return isalnum (text[0]);
|
||||
}
|
||||
|
||||
static int
|
||||
str_8bit_isdigit (const char *text)
|
||||
{
|
||||
return isdigit (text[0]);
|
||||
}
|
||||
|
||||
static int
|
||||
str_8bit_isprint (const char *text)
|
||||
{
|
||||
return isprint (text[0]);
|
||||
}
|
||||
|
||||
static int
|
||||
str_8bit_iscombiningmark (const char *text)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
str_8bit_toupper (const char *text, char **out, size_t *remain)
|
||||
{
|
||||
if (*remain <= 1) return 0;
|
||||
(*out)[0] = toupper ((unsigned char) text[0]);
|
||||
(*out)++;
|
||||
(*remain)--;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
str_8bit_tolower (const char *text, char **out, size_t *remain)
|
||||
{
|
||||
if (*remain <= 1) return 0;
|
||||
(*out)[0] = tolower ((unsigned char) text[0]);
|
||||
(*out)++;
|
||||
(*remain)--;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
str_8bit_length (const char *text)
|
||||
{
|
||||
return strlen (text);
|
||||
}
|
||||
|
||||
static int
|
||||
str_8bit_length2 (const char *text, int size)
|
||||
{
|
||||
return (size >= 0) ? min (strlen (text), size) : strlen (text);
|
||||
}
|
||||
|
||||
static int
|
||||
_str_8bit_vfs_convert_to (str_conv_t coder, char *string,
|
||||
int size, struct str_buffer *buffer)
|
||||
{
|
||||
int state;
|
||||
size_t left;
|
||||
size_t nconv;
|
||||
|
||||
errno = 0;
|
||||
|
||||
state = 0;
|
||||
|
||||
left = (size >= 0) ? size : strlen (string);
|
||||
|
||||
if (coder == (iconv_t) (-1)) return ESTR_FAILURE;
|
||||
|
||||
iconv(coder, NULL, NULL, NULL, NULL);
|
||||
|
||||
while (((int)left) > 0) {
|
||||
nconv = iconv(coder, &string, &left,
|
||||
&(buffer->actual), &(buffer->remain));
|
||||
if (nconv == (size_t) (-1)) {
|
||||
switch (errno) {
|
||||
case EINVAL:
|
||||
return ESTR_FAILURE;
|
||||
case EILSEQ:
|
||||
string++;
|
||||
left--;
|
||||
str_insert_char ('?', buffer);
|
||||
state = ESTR_PROBLEM;
|
||||
break;
|
||||
case E2BIG:
|
||||
str_incrase_buffer (buffer);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return state;
|
||||
}
|
||||
|
||||
int
|
||||
str_8bit_vfs_convert_to (str_conv_t coder, const char *string,
|
||||
int size, struct str_buffer *buffer)
|
||||
{
|
||||
int result;
|
||||
|
||||
if (coder == str_cnv_not_convert) {
|
||||
str_insert_string2 (string, size, buffer);
|
||||
result = 0;
|
||||
} else result = _str_8bit_vfs_convert_to (coder, (char*)string, size, buffer);
|
||||
buffer->actual[0] = '\0';
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
static const char *
|
||||
str_8bit_term_form (const char *text)
|
||||
{
|
||||
static char result[BUF_MEDIUM];
|
||||
char *actual;
|
||||
size_t remain;
|
||||
size_t length;
|
||||
size_t pos = 0;
|
||||
|
||||
actual = result;
|
||||
remain = sizeof (result);
|
||||
length = strlen (text);
|
||||
|
||||
for (; pos < length && remain > 1; pos++, actual++, remain--) {
|
||||
actual[0] = isprint (text[pos]) ? text[pos] : '.';
|
||||
}
|
||||
|
||||
actual[0] = '\0';
|
||||
return result;
|
||||
}
|
||||
|
||||
static const char *
|
||||
str_8bit_fit_to_term (const char *text, int width, int just_mode)
|
||||
{
|
||||
static char result[BUF_MEDIUM];
|
||||
char *actual;
|
||||
size_t remain;
|
||||
int ident;
|
||||
size_t length;
|
||||
size_t pos = 0;
|
||||
|
||||
length = strlen (text);
|
||||
actual = result;
|
||||
remain = sizeof(result);
|
||||
|
||||
if (length <= width) {
|
||||
ident = 0;
|
||||
switch (HIDE_FIT (just_mode)) {
|
||||
case J_CENTER_LEFT:
|
||||
case J_CENTER:
|
||||
ident = (width - length) / 2;
|
||||
break;
|
||||
case J_RIGHT:
|
||||
ident = width - length;
|
||||
break;
|
||||
}
|
||||
|
||||
if (remain <= ident) goto finally;
|
||||
memset (actual, ' ', ident);
|
||||
actual+= ident;
|
||||
remain-= ident;
|
||||
|
||||
for (; pos < length && remain > 1; pos++, actual++, remain--) {
|
||||
actual[0] = isprint (text[pos]) ? text[pos] : '.';
|
||||
}
|
||||
if (width - length - ident > 0) {
|
||||
if (remain <= width - length - ident) goto finally;
|
||||
memset (actual, ' ', width - length - ident);
|
||||
actual+= width - length - ident;
|
||||
remain-= width - length - ident;
|
||||
}
|
||||
} else {
|
||||
if (IS_FIT (just_mode)) {
|
||||
for (; pos + 1 <= width / 2 && remain > 1;
|
||||
actual++, pos++, remain--) {
|
||||
|
||||
actual[0] = isprint (text[pos]) ? text[pos] : '.';
|
||||
}
|
||||
|
||||
if (remain <= 1) goto finally;
|
||||
actual[0] = '~';
|
||||
actual++;
|
||||
remain--;
|
||||
|
||||
pos+= length - width + 1;
|
||||
|
||||
for (; pos < length && remain > 1; pos++, actual++, remain--) {
|
||||
actual[0] = isprint (text[pos]) ? text[pos] : '.';
|
||||
}
|
||||
} else {
|
||||
ident = 0;
|
||||
switch (HIDE_FIT (just_mode)) {
|
||||
case J_CENTER:
|
||||
ident = (length - width) / 2;
|
||||
break;
|
||||
case J_RIGHT:
|
||||
ident = length - width;
|
||||
break;
|
||||
}
|
||||
|
||||
pos+= ident;
|
||||
for (; pos < ident + width && remain > 1;
|
||||
pos++, actual++, remain--) {
|
||||
|
||||
actual[0] = isprint (text[pos]) ? text[pos] : '.';
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
finally:
|
||||
actual[0] = '\0';
|
||||
return result;
|
||||
}
|
||||
|
||||
static const char *
|
||||
str_8bit_term_trim (const char *text, int width)
|
||||
{
|
||||
static char result[BUF_MEDIUM];
|
||||
size_t remain;
|
||||
char *actual;
|
||||
size_t pos = 0;
|
||||
size_t length;
|
||||
|
||||
length = strlen (text);
|
||||
actual = result;
|
||||
remain = sizeof (result);
|
||||
|
||||
if (width < length) {
|
||||
if (width <= 3) {
|
||||
memset (actual, '.', width);
|
||||
actual+= width;
|
||||
remain-= width;
|
||||
} else {
|
||||
memset (actual, '.', 3);
|
||||
actual+= 3;
|
||||
remain-= 3;
|
||||
|
||||
pos+= length - width + 3;
|
||||
|
||||
for (; pos < length && remain > 1; pos++, actual++, remain--) {
|
||||
actual[0] = isprint (text[pos]) ? text[pos] : '.';
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (; pos < length && remain > 1; pos++, actual++, remain--) {
|
||||
actual[0] = isprint (text[pos]) ? text[pos] : '.';
|
||||
}
|
||||
}
|
||||
|
||||
actual[0] = '\0';
|
||||
return result;
|
||||
}
|
||||
|
||||
static int
|
||||
str_8bit_term_width2 (const char *text, size_t length)
|
||||
{
|
||||
return (length != (size_t)(-1))
|
||||
? min (strlen (text), length)
|
||||
: strlen (text);
|
||||
}
|
||||
|
||||
static int
|
||||
str_8bit_term_width1 (const char *text)
|
||||
{
|
||||
return str_8bit_term_width2 (text, (size_t)(-1));
|
||||
}
|
||||
|
||||
static int
|
||||
str_8bit_term_char_width (const char *text)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void
|
||||
str_8bit_msg_term_size (const char *text, int *lines, int *columns)
|
||||
{
|
||||
(*lines) = 1;
|
||||
(*columns) = 0;
|
||||
|
||||
char *p, *tmp = g_strdup (text);
|
||||
char *q;
|
||||
char c = '\0';
|
||||
int width;
|
||||
p = tmp;
|
||||
|
||||
for (;;) {
|
||||
q = strchr (p, '\n');
|
||||
if (q != NULL) {
|
||||
c = q[0];
|
||||
q[0] = '\0';
|
||||
}
|
||||
|
||||
width = str_8bit_term_width1 (p);
|
||||
if (width > (*columns)) (*columns) = width;
|
||||
|
||||
if (q == NULL)
|
||||
break;
|
||||
q[0] = c;
|
||||
p = q + 1;
|
||||
(*lines)++;
|
||||
}
|
||||
g_free (tmp);
|
||||
}
|
||||
|
||||
static const char *
|
||||
str_8bit_term_substring (const char *text, int start, int width)
|
||||
{
|
||||
static char result[BUF_MEDIUM];
|
||||
size_t remain;
|
||||
char *actual;
|
||||
size_t pos = 0;
|
||||
size_t length;
|
||||
|
||||
actual = result;
|
||||
remain = sizeof (result);
|
||||
length = strlen (text);
|
||||
|
||||
if (start < length) {
|
||||
pos+= start;
|
||||
for (; pos < length && width > 0 && remain > 1;
|
||||
pos++, width--, actual++, remain--) {
|
||||
|
||||
actual[0] = isprint (text[pos]) ? text[pos] : '.';
|
||||
}
|
||||
}
|
||||
|
||||
for (; width > 0 && remain > 1; actual++, remain--, width--) {
|
||||
actual[0] = ' ';
|
||||
}
|
||||
|
||||
actual[0] = '\0';
|
||||
return result;
|
||||
}
|
||||
|
||||
static const char *
|
||||
str_8bit_trunc (const char *text, int width)
|
||||
{
|
||||
static char result[MC_MAXPATHLEN];
|
||||
int remain;
|
||||
char *actual;
|
||||
size_t pos = 0;
|
||||
size_t length;
|
||||
|
||||
actual = result;
|
||||
remain = sizeof (result);
|
||||
length = strlen (text);
|
||||
|
||||
if (length > width) {
|
||||
for (; pos + 1 <= width / 2 && remain > 1; actual++, pos++, remain--) {
|
||||
actual[0] = isprint (text[pos]) ? text[pos] : '.';
|
||||
}
|
||||
|
||||
if (remain <= 1) goto finally;
|
||||
actual[0] = '~';
|
||||
actual++;
|
||||
remain--;
|
||||
|
||||
pos+= length - width + 1;
|
||||
|
||||
for (; pos < length && remain > 1; pos++, actual++, remain--) {
|
||||
actual[0] = isprint (text[pos]) ? text[pos] : '.';
|
||||
}
|
||||
} else {
|
||||
for (; pos < length && remain > 1; pos++, actual++, remain--) {
|
||||
actual[0] = isprint (text[pos]) ? text[pos] : '.';
|
||||
}
|
||||
}
|
||||
|
||||
finally:
|
||||
actual[0] = '\0';
|
||||
return result;
|
||||
}
|
||||
|
||||
static int
|
||||
str_8bit_offset_to_pos (const char *text, size_t length)
|
||||
{
|
||||
return (int)length;
|
||||
}
|
||||
|
||||
static int
|
||||
str_8bit_column_to_pos (const char *text, size_t pos)
|
||||
{
|
||||
return (int)pos;
|
||||
}
|
||||
|
||||
static char *
|
||||
str_8bit_create_search_needle (const char *needle, int case_sen)
|
||||
{
|
||||
return (char*) needle;
|
||||
}
|
||||
|
||||
static void
|
||||
str_8bit_release_search_needle (char *needle, int case_sen)
|
||||
{
|
||||
}
|
||||
|
||||
static const char *
|
||||
str_8bit_search_first (const char *text, const char *search, int case_sen)
|
||||
{
|
||||
char *fold_text;
|
||||
char *fold_search;
|
||||
const char *match;
|
||||
size_t offsset;
|
||||
|
||||
fold_text = (case_sen) ? (char*) text : g_strdown (g_strdup (text));
|
||||
fold_search = (case_sen) ? (char*) text : g_strdown (g_strdup (search));
|
||||
|
||||
match = g_strstr_len (fold_text, -1, fold_search);
|
||||
if (match != NULL) {
|
||||
offsset = match - fold_text;
|
||||
match = text + offsset;
|
||||
}
|
||||
|
||||
if (!case_sen) {
|
||||
g_free (fold_text);
|
||||
g_free (fold_search);
|
||||
}
|
||||
|
||||
return match;
|
||||
}
|
||||
|
||||
static const char *
|
||||
str_8bit_search_last (const char *text, const char *search, int case_sen)
|
||||
{
|
||||
char *fold_text;
|
||||
char *fold_search;
|
||||
const char *match;
|
||||
size_t offsset;
|
||||
|
||||
fold_text = (case_sen) ? (char*) text : g_strdown (g_strdup (text));
|
||||
fold_search = (case_sen) ? (char*) text : g_strdown (g_strdup (search));
|
||||
|
||||
match = g_strrstr_len (fold_text, -1, fold_search);
|
||||
if (match != NULL) {
|
||||
offsset = match - fold_text;
|
||||
match = text + offsset;
|
||||
}
|
||||
|
||||
if (!case_sen) {
|
||||
g_free (fold_text);
|
||||
g_free (fold_search);
|
||||
}
|
||||
|
||||
return match;
|
||||
}
|
||||
|
||||
static int
|
||||
str_8bit_compare (const char *t1, const char *t2)
|
||||
{
|
||||
return strcmp (t1, t2);
|
||||
}
|
||||
|
||||
static int
|
||||
str_8bit_ncompare (const char *t1, const char *t2)
|
||||
{
|
||||
return strncmp (t1, t2, min (strlen (t1), strlen (t2)));
|
||||
}
|
||||
|
||||
static int
|
||||
str_8bit_casecmp (const char *t1, const char *t2)
|
||||
{
|
||||
return g_strcasecmp (t1, t2);
|
||||
}
|
||||
|
||||
static int
|
||||
str_8bit_ncasecmp (const char *t1, const char *t2)
|
||||
{
|
||||
return g_strncasecmp (t1, t2, min (strlen (t1), strlen (t2)));
|
||||
}
|
||||
|
||||
static int
|
||||
str_8bit_prefix (const char *text, const char *prefix)
|
||||
{
|
||||
int result;
|
||||
for (result = 0; text[result] != '\0' && prefix[result] != '\0'
|
||||
&& text[result] == prefix[result]; result++);
|
||||
return result;
|
||||
}
|
||||
|
||||
static int
|
||||
str_8bit_caseprefix (const char *text, const char *prefix)
|
||||
{
|
||||
int result;
|
||||
for (result = 0; text[result] != '\0' && prefix[result] != '\0'
|
||||
&& toupper (text[result]) == toupper (prefix[result]);
|
||||
result++);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void
|
||||
str_8bit_fix_string (char *text)
|
||||
{
|
||||
}
|
||||
|
||||
static char *
|
||||
str_8bit_create_key (const char *text, int case_sen)
|
||||
{
|
||||
return (case_sen) ? (char*)text : g_strdown (g_strdup (text));
|
||||
}
|
||||
|
||||
static int
|
||||
str_8bit_key_collate (const char *t1, const char *t2, int case_sen)
|
||||
{
|
||||
if (case_sen) return strcmp (t1, t2);
|
||||
else return strcoll (t1, t2);
|
||||
}
|
||||
|
||||
static void
|
||||
str_8bit_release_key (char *key, int case_sen)
|
||||
{
|
||||
if (!case_sen) g_free (key);
|
||||
}
|
||||
|
||||
struct str_class
|
||||
str_8bit_init ()
|
||||
{
|
||||
struct str_class result;
|
||||
|
||||
result.vfs_convert_to = str_8bit_vfs_convert_to;
|
||||
result.insert_replace_char = str_8bit_insert_replace_char;
|
||||
result.is_valid_string = str_8bit_is_valid_string;
|
||||
result.is_valid_char = str_8bit_is_valid_char;
|
||||
result.cnext_char = str_8bit_cnext_char;
|
||||
result.cprev_char = str_8bit_cprev_char;
|
||||
result.cnext_char_safe = str_8bit_cnext_char;
|
||||
result.cprev_char_safe = str_8bit_cprev_char;
|
||||
result.cnext_noncomb_char = str_8bit_cnext_noncomb_char;
|
||||
result.cprev_noncomb_char = str_8bit_cprev_noncomb_char;
|
||||
result.isspace = str_8bit_isspace;
|
||||
result.ispunct = str_8bit_ispunct;
|
||||
result.isalnum = str_8bit_isalnum;
|
||||
result.isdigit = str_8bit_isdigit;
|
||||
result.isprint = str_8bit_isprint;
|
||||
result.iscombiningmark = str_8bit_iscombiningmark;
|
||||
result.toupper = str_8bit_toupper;
|
||||
result.tolower = str_8bit_tolower;
|
||||
result.length = str_8bit_length;
|
||||
result.length2 = str_8bit_length2;
|
||||
result.length_noncomb = str_8bit_length;
|
||||
result.fix_string = str_8bit_fix_string;
|
||||
result.term_form = str_8bit_term_form;
|
||||
result.fit_to_term = str_8bit_fit_to_term;
|
||||
result.term_trim = str_8bit_term_trim;
|
||||
result.term_width2 = str_8bit_term_width2;
|
||||
result.term_width1 = str_8bit_term_width1;
|
||||
result.term_char_width = str_8bit_term_char_width;
|
||||
result.msg_term_size = str_8bit_msg_term_size;
|
||||
result.term_substring = str_8bit_term_substring;
|
||||
result.trunc = str_8bit_trunc;
|
||||
result.offset_to_pos = str_8bit_offset_to_pos;
|
||||
result.column_to_pos = str_8bit_column_to_pos;
|
||||
result.create_search_needle = str_8bit_create_search_needle;
|
||||
result.release_search_needle = str_8bit_release_search_needle;
|
||||
result.search_first = str_8bit_search_first;
|
||||
result.search_last = str_8bit_search_last;
|
||||
result.compare = str_8bit_compare;
|
||||
result.ncompare = str_8bit_ncompare;
|
||||
result.casecmp = str_8bit_casecmp;
|
||||
result.ncasecmp = str_8bit_ncasecmp;
|
||||
result.prefix = str_8bit_prefix;
|
||||
result.caseprefix = str_8bit_caseprefix;
|
||||
result.create_key = str_8bit_create_key;
|
||||
result.create_key_for_filename = str_8bit_create_key;
|
||||
result.key_collate = str_8bit_key_collate;
|
||||
result.release_key = str_8bit_release_key;
|
||||
|
||||
return result;
|
||||
}
|
657
src/strutilascii.c
Normal file
657
src/strutilascii.c
Normal file
@ -0,0 +1,657 @@
|
||||
/* ASCII strings utilities
|
||||
Copyright (C) 2007 Free Software Foundation, Inc.
|
||||
|
||||
Written 2007 by:
|
||||
Rostislav Benes
|
||||
|
||||
The file_date routine is mostly from GNU's fileutils package,
|
||||
written by Richard Stallman and David MacKenzie.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <ctype.h>
|
||||
#include <config.h>
|
||||
#include <errno.h>
|
||||
#include <iconv.h>
|
||||
|
||||
#include "global.h"
|
||||
#include "strutil.h"
|
||||
|
||||
/* using g_ascii function from glib
|
||||
* on terminal are showed only ascii characters (lower then 0x80)
|
||||
*/
|
||||
|
||||
static const char replch = '?';
|
||||
|
||||
static void
|
||||
str_ascii_insert_replace_char (struct str_buffer *buffer)
|
||||
{
|
||||
str_insert_char (replch, buffer);
|
||||
}
|
||||
|
||||
static int
|
||||
str_ascii_is_valid_string (const char *text)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
str_ascii_is_valid_char (const char *ch, size_t size)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void
|
||||
str_ascii_cnext_char (const char **text)
|
||||
{
|
||||
(*text)++;
|
||||
}
|
||||
|
||||
static void
|
||||
str_ascii_cprev_char (const char **text)
|
||||
{
|
||||
(*text)--;
|
||||
}
|
||||
|
||||
static int
|
||||
str_ascii_cnext_noncomb_char (const char **text)
|
||||
{
|
||||
if (*text[0] != '\0') {
|
||||
(*text)++;
|
||||
return 1;
|
||||
} else return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
str_ascii_cprev_noncomb_char (const char **text, const char *begin)
|
||||
{
|
||||
if ((*text) != begin) {
|
||||
(*text)--;
|
||||
return 1;
|
||||
} else return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
str_ascii_isspace (const char *text)
|
||||
{
|
||||
return g_ascii_isspace ((gchar) text[0]);
|
||||
}
|
||||
|
||||
static int
|
||||
str_ascii_ispunct (const char *text)
|
||||
{
|
||||
return g_ascii_ispunct ((gchar) text[0]);
|
||||
}
|
||||
|
||||
static int
|
||||
str_ascii_isalnum (const char *text)
|
||||
{
|
||||
return g_ascii_isalnum ((gchar) text[0]);
|
||||
}
|
||||
|
||||
static int
|
||||
str_ascii_isdigit (const char *text)
|
||||
{
|
||||
return g_ascii_isdigit ((gchar) text[0]);
|
||||
}
|
||||
|
||||
static int
|
||||
str_ascii_isprint (const char *text)
|
||||
{
|
||||
return g_ascii_isprint ((gchar) text[0]);
|
||||
}
|
||||
|
||||
static int
|
||||
str_ascii_iscombiningmark (const char *text)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
str_ascii_toupper (const char *text, char **out, size_t *remain)
|
||||
{
|
||||
if (*remain <= 1) return 0;
|
||||
(*out)[0] = (char) g_ascii_toupper ((gchar) text[0]);
|
||||
(*out)++;
|
||||
(*remain)--;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
str_ascii_tolower (const char *text, char **out, size_t *remain)
|
||||
{
|
||||
if (*remain <= 1) return 0;
|
||||
(*out)[0] = (char) g_ascii_tolower ((gchar) text[0]);
|
||||
(*out)++;
|
||||
(*remain)--;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
str_ascii_length (const char *text)
|
||||
{
|
||||
return strlen (text);
|
||||
}
|
||||
|
||||
static int
|
||||
str_ascii_length2 (const char *text, int size)
|
||||
{
|
||||
return (size >= 0) ? min (strlen (text), size) : strlen (text);
|
||||
}
|
||||
|
||||
int
|
||||
str_ascii_vfs_convert_to (str_conv_t coder, const char *string,
|
||||
int size, struct str_buffer *buffer)
|
||||
{
|
||||
str_insert_string2 (string, size, buffer);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static const char *
|
||||
str_ascii_term_form (const char *text)
|
||||
{
|
||||
static char result[BUF_MEDIUM];
|
||||
char *actual;
|
||||
size_t remain;
|
||||
size_t length;
|
||||
size_t pos = 0;
|
||||
|
||||
actual = result;
|
||||
remain = sizeof (result);
|
||||
length = strlen (text);
|
||||
|
||||
/* go throw all characters and check, if they are ascii and printable */
|
||||
for (; pos < length && remain > 1; pos++, actual++, remain--) {
|
||||
actual[0] = isascii((unsigned char)text[pos]) ? text[pos] : '?';
|
||||
actual[0] = g_ascii_isprint ((gchar) actual[0]) ? actual[0] : '.';
|
||||
}
|
||||
|
||||
actual[0] = '\0';
|
||||
return result;
|
||||
}
|
||||
|
||||
static const char *
|
||||
str_ascii_fit_to_term (const char *text, int width, int just_mode)
|
||||
{
|
||||
static char result[BUF_MEDIUM];
|
||||
char *actual;
|
||||
size_t remain;
|
||||
int ident;
|
||||
size_t length;
|
||||
size_t pos = 0;
|
||||
|
||||
length = strlen (text);
|
||||
actual = result;
|
||||
remain = sizeof(result);
|
||||
|
||||
if (length <= width) {
|
||||
ident = 0;
|
||||
switch (HIDE_FIT (just_mode)) {
|
||||
case J_CENTER_LEFT:
|
||||
case J_CENTER:
|
||||
ident = (width - length) / 2;
|
||||
break;
|
||||
case J_RIGHT:
|
||||
ident = width - length;
|
||||
break;
|
||||
}
|
||||
|
||||
/* add space before text */
|
||||
if (remain <= ident) goto finally;
|
||||
memset (actual, ' ', ident);
|
||||
actual+= ident;
|
||||
remain-= ident;
|
||||
|
||||
/* copy all characters */
|
||||
for (; pos < length && remain > 1; pos++, actual++, remain--) {
|
||||
actual[0] = isascii((unsigned char)text[pos]) ? text[pos] : '?';
|
||||
actual[0] = g_ascii_isprint ((gchar) actual[0]) ? actual[0] : '.';
|
||||
}
|
||||
|
||||
/* add space after text */
|
||||
if (width - length - ident > 0) {
|
||||
if (remain <= width - length - ident) goto finally;
|
||||
memset (actual, ' ', width - length - ident);
|
||||
actual+= width - length - ident;
|
||||
remain-= width - length - ident;
|
||||
}
|
||||
} else {
|
||||
if (IS_FIT (just_mode)) {
|
||||
/* copy prefix of text, that is not wider than width / 2 */
|
||||
for (; pos + 1 <= width / 2 && remain > 1;
|
||||
actual++, pos++, remain--) {
|
||||
actual[0] = isascii((unsigned char)text[pos])
|
||||
? text[pos] : '?';
|
||||
actual[0] = g_ascii_isprint ((gchar) actual[0])
|
||||
? actual[0] : '.';
|
||||
}
|
||||
|
||||
if (remain <= 1) goto finally;
|
||||
actual[0] = '~';
|
||||
actual++;
|
||||
remain--;
|
||||
|
||||
pos+= length - width + 1;
|
||||
|
||||
/* copy suffix of text */
|
||||
for (; pos < length && remain > 1; pos++, actual++, remain--) {
|
||||
actual[0] = isascii((unsigned char)text[pos])
|
||||
? text[pos] : '?';
|
||||
actual[0] = g_ascii_isprint ((gchar) actual[0])
|
||||
? actual[0] : '.';
|
||||
}
|
||||
} else {
|
||||
ident = 0;
|
||||
switch (HIDE_FIT (just_mode)) {
|
||||
case J_CENTER:
|
||||
ident = (length - width) / 2;
|
||||
break;
|
||||
case J_RIGHT:
|
||||
ident = length - width;
|
||||
break;
|
||||
}
|
||||
|
||||
/* copy substring text, substring start from ident and take width
|
||||
* characters from text */
|
||||
pos+= ident;
|
||||
for (; pos < ident + width && remain > 1;
|
||||
pos++, actual++, remain--) {
|
||||
actual[0] = isascii((unsigned char)text[pos])
|
||||
? text[pos] : '?';
|
||||
actual[0] = g_ascii_isprint ((gchar) actual[0])
|
||||
? actual[0] : '.';
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
finally:
|
||||
actual[0] = '\0';
|
||||
return result;
|
||||
}
|
||||
|
||||
static const char *
|
||||
str_ascii_term_trim (const char *text, int width)
|
||||
{
|
||||
static char result[BUF_MEDIUM];
|
||||
size_t remain;
|
||||
char *actual;
|
||||
size_t pos = 0;
|
||||
size_t length;
|
||||
|
||||
length = strlen (text);
|
||||
actual = result;
|
||||
remain = sizeof (result);
|
||||
|
||||
if (width < length) {
|
||||
if (width <= 3) {
|
||||
memset (actual, '.', width);
|
||||
actual+= width;
|
||||
remain-= width;
|
||||
} else {
|
||||
memset (actual, '.', 3);
|
||||
actual+= 3;
|
||||
remain-= 3;
|
||||
|
||||
pos+= length - width + 3;
|
||||
|
||||
/* copy suffix of text*/
|
||||
for (; pos < length && remain > 1; pos++, actual++, remain--) {
|
||||
actual[0] = isascii((unsigned char)text[pos])
|
||||
? text[pos] : '?';
|
||||
actual[0] = g_ascii_isprint ((gchar) actual[0])
|
||||
? actual[0] : '.';
|
||||
}
|
||||
}
|
||||
} else {
|
||||
/* copy all characters */
|
||||
for (; pos < length && remain > 1; pos++, actual++, remain--) {
|
||||
actual[0] = isascii((unsigned char)text[pos]) ? text[pos] : '?';
|
||||
actual[0] = g_ascii_isprint ((gchar) actual[0]) ? actual[0] : '.';
|
||||
}
|
||||
}
|
||||
|
||||
actual[0] = '\0';
|
||||
return result;
|
||||
}
|
||||
|
||||
static int
|
||||
str_ascii_term_width2 (const char *text, size_t length)
|
||||
{
|
||||
return (length != (size_t)(-1))
|
||||
? min (strlen (text), length)
|
||||
: strlen (text);
|
||||
}
|
||||
|
||||
static int
|
||||
str_ascii_term_width1 (const char *text)
|
||||
{
|
||||
return str_ascii_term_width2 (text, (size_t)(-1));
|
||||
}
|
||||
|
||||
static int
|
||||
str_ascii_term_char_width (const char *text)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void
|
||||
str_ascii_msg_term_size (const char *text, int *lines, int *columns)
|
||||
{
|
||||
(*lines) = 1;
|
||||
(*columns) = 0;
|
||||
|
||||
char *p, *tmp = g_strdup (text);
|
||||
char *q;
|
||||
char c = '\0';
|
||||
int width;
|
||||
p = tmp;
|
||||
|
||||
for (;;) {
|
||||
q = strchr (p, '\n');
|
||||
if (q != NULL) {
|
||||
c = q[0];
|
||||
q[0] = '\0';
|
||||
}
|
||||
|
||||
width = str_ascii_term_width1 (p);
|
||||
if (width > (*columns)) (*columns) = width;
|
||||
|
||||
if (q == NULL)
|
||||
break;
|
||||
q[0] = c;
|
||||
p = q + 1;
|
||||
(*lines)++;
|
||||
}
|
||||
g_free (tmp);
|
||||
}
|
||||
|
||||
static const char *
|
||||
str_ascii_term_substring (const char *text, int start, int width)
|
||||
{
|
||||
static char result[BUF_MEDIUM];
|
||||
size_t remain;
|
||||
char *actual;
|
||||
size_t pos = 0;
|
||||
size_t length;
|
||||
|
||||
actual = result;
|
||||
remain = sizeof (result);
|
||||
length = strlen (text);
|
||||
|
||||
if (start < length) {
|
||||
pos+= start;
|
||||
/* copy at most width characters from text from start */
|
||||
for (; pos < length && width > 0 && remain > 1;
|
||||
pos++, width--, actual++, remain--) {
|
||||
|
||||
actual[0] = isascii((unsigned char)text[pos]) ? text[pos] : '?';
|
||||
actual[0] = g_ascii_isprint ((gchar) actual[0]) ? actual[0] : '.';
|
||||
}
|
||||
}
|
||||
|
||||
/* if text is shorter then width, add space to the end */
|
||||
for (; width > 0 && remain > 1; actual++, remain--, width--) {
|
||||
actual[0] = ' ';
|
||||
}
|
||||
|
||||
actual[0] = '\0';
|
||||
return result;
|
||||
}
|
||||
|
||||
static const char *
|
||||
str_ascii_trunc (const char *text, int width)
|
||||
{
|
||||
static char result[MC_MAXPATHLEN];
|
||||
int remain;
|
||||
char *actual;
|
||||
size_t pos = 0;
|
||||
size_t length;
|
||||
|
||||
actual = result;
|
||||
remain = sizeof (result);
|
||||
length = strlen (text);
|
||||
|
||||
if (length > width) {
|
||||
/* copy prefix of text */
|
||||
for (; pos + 1 <= width / 2 && remain > 1; actual++, pos++, remain--) {
|
||||
actual[0] = isascii((unsigned char)text[pos]) ? text[pos] : '?';
|
||||
actual[0] = g_ascii_isprint ((gchar) actual[0]) ? actual[0] : '.';
|
||||
}
|
||||
|
||||
if (remain <= 1) goto finally;
|
||||
actual[0] = '~';
|
||||
actual++;
|
||||
remain--;
|
||||
|
||||
pos+= length - width + 1;
|
||||
|
||||
/* copy suffix of text */
|
||||
for (; pos < length && remain > 1; pos++, actual++, remain--) {
|
||||
actual[0] = isascii((unsigned char)text[pos]) ? text[pos] : '?';
|
||||
actual[0] = g_ascii_isprint ((gchar) actual[0]) ? actual[0] : '.';
|
||||
}
|
||||
} else {
|
||||
/* copy all characters */
|
||||
for (; pos < length && remain > 1; pos++, actual++, remain--) {
|
||||
actual[0] = isascii((unsigned char)text[pos]) ? text[pos] : '?';
|
||||
actual[0] = g_ascii_isprint ((gchar) actual[0]) ? actual[0] : '.';
|
||||
}
|
||||
}
|
||||
|
||||
finally:
|
||||
actual[0] = '\0';
|
||||
return result;
|
||||
}
|
||||
|
||||
static int
|
||||
str_ascii_offset_to_pos (const char *text, size_t length)
|
||||
{
|
||||
return (int)length;
|
||||
}
|
||||
|
||||
static int
|
||||
str_ascii_column_to_pos (const char *text, size_t pos)
|
||||
{
|
||||
return (int)pos;
|
||||
}
|
||||
|
||||
static char *
|
||||
str_ascii_create_search_needle (const char *needle, int case_sen)
|
||||
{
|
||||
return (char*) needle;
|
||||
}
|
||||
|
||||
static void
|
||||
str_ascii_release_search_needle (char *needle, int case_sen)
|
||||
{
|
||||
}
|
||||
|
||||
static const char *
|
||||
str_ascii_search_first (const char *text, const char *search, int case_sen)
|
||||
{
|
||||
char *fold_text;
|
||||
char *fold_search;
|
||||
const char *match;
|
||||
size_t offset;
|
||||
|
||||
fold_text = (case_sen) ? (char*) text : g_ascii_strdown (text, -1);
|
||||
fold_search = (case_sen) ? (char*) search : g_ascii_strdown (search, -1);
|
||||
|
||||
match = g_strstr_len (fold_text, -1, fold_search);
|
||||
if (match != NULL) {
|
||||
offset = match - fold_text;
|
||||
match = text + offset;
|
||||
}
|
||||
|
||||
if (!case_sen) {
|
||||
g_free (fold_text);
|
||||
g_free (fold_search);
|
||||
}
|
||||
|
||||
return match;
|
||||
}
|
||||
|
||||
static const char *
|
||||
str_ascii_search_last (const char *text, const char *search, int case_sen)
|
||||
{
|
||||
char *fold_text;
|
||||
char *fold_search;
|
||||
const char *match;
|
||||
size_t offset;
|
||||
|
||||
fold_text = (case_sen) ? (char*) text : g_ascii_strdown (text, -1);
|
||||
fold_search = (case_sen) ? (char*) search : g_ascii_strdown (search, -1);
|
||||
|
||||
match = g_strrstr_len (fold_text, -1, fold_search);
|
||||
if (match != NULL) {
|
||||
offset = match - fold_text;
|
||||
match = text + offset;
|
||||
}
|
||||
|
||||
if (!case_sen) {
|
||||
g_free (fold_text);
|
||||
g_free (fold_search);
|
||||
}
|
||||
|
||||
return match;
|
||||
}
|
||||
|
||||
static int
|
||||
str_ascii_compare (const char *t1, const char *t2)
|
||||
{
|
||||
return strcmp (t1, t2);
|
||||
}
|
||||
|
||||
static int
|
||||
str_ascii_ncompare (const char *t1, const char *t2)
|
||||
{
|
||||
return strncmp (t1, t2, min (strlen (t1), strlen(t2)));
|
||||
}
|
||||
|
||||
static int
|
||||
str_ascii_casecmp (const char *t1, const char *t2)
|
||||
{
|
||||
return g_ascii_strcasecmp (t1, t2);
|
||||
}
|
||||
|
||||
static int
|
||||
str_ascii_ncasecmp (const char *t1, const char *t2)
|
||||
{
|
||||
return g_ascii_strncasecmp (t1, t2, min (strlen (t1), strlen (t2)));
|
||||
}
|
||||
|
||||
static void
|
||||
str_ascii_fix_string (char *text)
|
||||
{
|
||||
for (; text[0] != '\0'; text++) {
|
||||
text[0] = ((unsigned char)text[0] < 128) ? text[0] : '?';
|
||||
}
|
||||
}
|
||||
|
||||
static char *
|
||||
str_ascii_create_key (const char *text, int case_sen)
|
||||
{
|
||||
return (char*)text;
|
||||
}
|
||||
|
||||
static int
|
||||
str_ascii_key_collate (const char *t1, const char *t2, int case_sen)
|
||||
{
|
||||
return (case_sen) ? strcmp (t1, t2) : g_ascii_strcasecmp (t1, t2);
|
||||
}
|
||||
|
||||
static void
|
||||
str_ascii_release_key (char *key, int case_sen)
|
||||
{
|
||||
}
|
||||
|
||||
static int
|
||||
str_ascii_prefix (const char *text, const char *prefix)
|
||||
{
|
||||
int result;
|
||||
for (result = 0; text[result] != '\0' && prefix[result] != '\0'
|
||||
&& text[result] == prefix[result]; result++);
|
||||
return result;
|
||||
}
|
||||
|
||||
static int
|
||||
str_ascii_caseprefix (const char *text, const char *prefix)
|
||||
{
|
||||
int result;
|
||||
for (result = 0; text[result] != '\0' && prefix[result] != '\0'
|
||||
&& g_ascii_toupper (text[result]) == g_ascii_toupper (prefix[result]);
|
||||
result++);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
struct str_class
|
||||
str_ascii_init ()
|
||||
{
|
||||
struct str_class result;
|
||||
|
||||
result.vfs_convert_to = str_ascii_vfs_convert_to;
|
||||
result.insert_replace_char = str_ascii_insert_replace_char;
|
||||
result.is_valid_string = str_ascii_is_valid_string;
|
||||
result.is_valid_char = str_ascii_is_valid_char;
|
||||
result.cnext_char = str_ascii_cnext_char;
|
||||
result.cprev_char = str_ascii_cprev_char;
|
||||
result.cnext_char_safe = str_ascii_cnext_char;
|
||||
result.cprev_char_safe = str_ascii_cprev_char;
|
||||
result.cnext_noncomb_char = str_ascii_cnext_noncomb_char;
|
||||
result.cprev_noncomb_char = str_ascii_cprev_noncomb_char;
|
||||
result.isspace = str_ascii_isspace;
|
||||
result.ispunct = str_ascii_ispunct;
|
||||
result.isalnum = str_ascii_isalnum;
|
||||
result.isdigit = str_ascii_isdigit;
|
||||
result.isprint = str_ascii_isprint;
|
||||
result.iscombiningmark = str_ascii_iscombiningmark;
|
||||
result.toupper = str_ascii_toupper;
|
||||
result.tolower = str_ascii_tolower;
|
||||
result.length = str_ascii_length;
|
||||
result.length2 = str_ascii_length2;
|
||||
result.length_noncomb = str_ascii_length;
|
||||
result.fix_string = str_ascii_fix_string;
|
||||
result.term_form = str_ascii_term_form;
|
||||
result.fit_to_term = str_ascii_fit_to_term;
|
||||
result.term_trim = str_ascii_term_trim;
|
||||
result.term_width2 = str_ascii_term_width2;
|
||||
result.term_width1 = str_ascii_term_width1;
|
||||
result.term_char_width = str_ascii_term_char_width;
|
||||
result.msg_term_size = str_ascii_msg_term_size;
|
||||
result.term_substring = str_ascii_term_substring;
|
||||
result.trunc = str_ascii_trunc;
|
||||
result.offset_to_pos = str_ascii_offset_to_pos;
|
||||
result.column_to_pos = str_ascii_column_to_pos;
|
||||
result.create_search_needle = str_ascii_create_search_needle;
|
||||
result.release_search_needle = str_ascii_release_search_needle;
|
||||
result.search_first = str_ascii_search_first;
|
||||
result.search_last = str_ascii_search_last;
|
||||
result.compare = str_ascii_compare;
|
||||
result.ncompare = str_ascii_ncompare;
|
||||
result.casecmp = str_ascii_casecmp;
|
||||
result.ncasecmp = str_ascii_ncasecmp;
|
||||
result.prefix = str_ascii_prefix;
|
||||
result.caseprefix = str_ascii_caseprefix;
|
||||
result.create_key = str_ascii_create_key;
|
||||
result.create_key_for_filename = str_ascii_create_key;
|
||||
result.key_collate = str_ascii_key_collate;
|
||||
result.release_key = str_ascii_release_key;
|
||||
|
||||
return result;
|
||||
}
|
1241
src/strutilutf8.c
Normal file
1241
src/strutilutf8.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -52,6 +52,7 @@
|
||||
#include "cons.saver.h" /* handle_console() */
|
||||
#include "key.h" /* XCTRL */
|
||||
#include "subshell.h"
|
||||
#include "strutil.h"
|
||||
|
||||
#ifndef WEXITSTATUS
|
||||
# define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8)
|
||||
@ -529,6 +530,8 @@ static void init_raw_mode ()
|
||||
|
||||
int invoke_subshell (const char *command, int how, char **new_dir)
|
||||
{
|
||||
char *pcwd;
|
||||
|
||||
/* Make the MC terminal transparent */
|
||||
tcsetattr (STDOUT_FILENO, TCSANOW, &raw_mode);
|
||||
|
||||
@ -559,8 +562,10 @@ int invoke_subshell (const char *command, int how, char **new_dir)
|
||||
|
||||
feed_subshell (how, FALSE);
|
||||
|
||||
if (new_dir && subshell_alive && strcmp (subshell_cwd, current_panel->cwd))
|
||||
pcwd = vfs_translate_path_n (current_panel->cwd);
|
||||
if (new_dir && subshell_alive && strcmp (subshell_cwd, pcwd))
|
||||
*new_dir = subshell_cwd; /* Make MC change to the subshell's CWD */
|
||||
g_free (pcwd);
|
||||
|
||||
/* Restart the subshell if it has died by SIGHUP, SIGQUIT, etc. */
|
||||
while (!subshell_alive && !quit && use_subshell)
|
||||
@ -700,8 +705,10 @@ static char *
|
||||
subshell_name_quote (const char *s)
|
||||
{
|
||||
char *ret, *d;
|
||||
const char *su, *n;
|
||||
const char quote_cmd_start[] = "\"`printf \"%b\" '";
|
||||
const char quote_cmd_end[] = "'`\"";
|
||||
int c;
|
||||
|
||||
/* Factor 5 because we need \, 0 and 3 other digits per character. */
|
||||
d = ret = g_malloc (1 + (5 * strlen (s)) + (sizeof(quote_cmd_start) - 1)
|
||||
@ -724,13 +731,19 @@ subshell_name_quote (const char *s)
|
||||
* sequence of the form \0nnn, where "nnn" is the numeric value of the
|
||||
* character converted to octal number.
|
||||
*/
|
||||
for (; *s; s++) {
|
||||
if (isalnum ((unsigned char) *s)) {
|
||||
*d++ = (unsigned char) *s;
|
||||
su = s;
|
||||
for (; su[0] != '\0'; ) {
|
||||
n = str_cget_next_char_safe (su);
|
||||
if (str_isalnum (su)) {
|
||||
memcpy (d, su, n - su);
|
||||
d+= n - su;
|
||||
} else {
|
||||
sprintf (d, "\\0%03o", (unsigned char) *s);
|
||||
d += 5;
|
||||
for (c = 0; c < n - su; c++) {
|
||||
sprintf (d, "\\0%03o", (unsigned char) su[c]);
|
||||
d += 5;
|
||||
}
|
||||
}
|
||||
su = n;
|
||||
}
|
||||
|
||||
strcpy (d, quote_cmd_end);
|
||||
@ -743,15 +756,22 @@ subshell_name_quote (const char *s)
|
||||
void
|
||||
do_subshell_chdir (const char *directory, int do_update, int reset_prompt)
|
||||
{
|
||||
char *pcwd;
|
||||
char *temp;
|
||||
char *translate;
|
||||
|
||||
pcwd = vfs_translate_path_n (current_panel->cwd);
|
||||
|
||||
if (!
|
||||
(subshell_state == INACTIVE
|
||||
&& strcmp (subshell_cwd, current_panel->cwd))) {
|
||||
&& strcmp (subshell_cwd, pcwd))) {
|
||||
/* We have to repaint the subshell prompt if we read it from
|
||||
* the main program. Please note that in the code after this
|
||||
* if, the cd command that is sent will make the subshell
|
||||
* repaint the prompt, so we don't have to paint it. */
|
||||
if (do_update)
|
||||
do_update_prompt ();
|
||||
g_free (pcwd);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -759,7 +779,9 @@ do_subshell_chdir (const char *directory, int do_update, int reset_prompt)
|
||||
because we set "HISTCONTROL=ignorespace") */
|
||||
write_all (subshell_pty, " cd ", 4);
|
||||
if (*directory) {
|
||||
char *temp = subshell_name_quote (directory);
|
||||
translate = vfs_translate_path_n (directory);
|
||||
if (translate) {
|
||||
temp = subshell_name_quote (translate);
|
||||
if (temp) {
|
||||
write_all (subshell_pty, temp, strlen (temp));
|
||||
g_free (temp);
|
||||
@ -768,6 +790,10 @@ do_subshell_chdir (const char *directory, int do_update, int reset_prompt)
|
||||
that we don't have memory to quote it. */
|
||||
write_all (subshell_pty, ".", 1);
|
||||
}
|
||||
g_free (translate);
|
||||
} else {
|
||||
write_all (subshell_pty, ".", 1);
|
||||
}
|
||||
} else {
|
||||
write_all (subshell_pty, "/", 1);
|
||||
}
|
||||
@ -777,7 +803,7 @@ do_subshell_chdir (const char *directory, int do_update, int reset_prompt)
|
||||
feed_subshell (QUIETLY, FALSE);
|
||||
|
||||
if (subshell_alive) {
|
||||
int bPathNotEq = strcmp (subshell_cwd, current_panel->cwd);
|
||||
int bPathNotEq = strcmp (subshell_cwd, pcwd);
|
||||
|
||||
if (bPathNotEq && subshell_type == TCSH) {
|
||||
char rp_subshell_cwd[PATH_MAX];
|
||||
@ -786,17 +812,17 @@ do_subshell_chdir (const char *directory, int do_update, int reset_prompt)
|
||||
char *p_subshell_cwd =
|
||||
mc_realpath (subshell_cwd, rp_subshell_cwd);
|
||||
char *p_current_panel_cwd =
|
||||
mc_realpath (current_panel->cwd, rp_current_panel_cwd);
|
||||
mc_realpath (pcwd, rp_current_panel_cwd);
|
||||
|
||||
if (p_subshell_cwd == NULL)
|
||||
p_subshell_cwd = subshell_cwd;
|
||||
if (p_current_panel_cwd == NULL)
|
||||
p_current_panel_cwd = current_panel->cwd;
|
||||
p_current_panel_cwd = pcwd;
|
||||
bPathNotEq = strcmp (p_subshell_cwd, p_current_panel_cwd);
|
||||
}
|
||||
|
||||
if (bPathNotEq && strcmp (current_panel->cwd, ".")) {
|
||||
char *cwd = strip_password (g_strdup (current_panel->cwd), 1);
|
||||
if (bPathNotEq && strcmp (pcwd, ".")) {
|
||||
char *cwd = strip_password (g_strdup (pcwd), 1);
|
||||
fprintf (stderr, _("Warning: Cannot change to %s.\n"), cwd);
|
||||
g_free (cwd);
|
||||
}
|
||||
@ -805,6 +831,8 @@ do_subshell_chdir (const char *directory, int do_update, int reset_prompt)
|
||||
if (reset_prompt)
|
||||
prompt_pos = 0;
|
||||
update_prompt = FALSE;
|
||||
|
||||
g_free (pcwd);
|
||||
/* Make sure that MC never stores the CWD in a silly format */
|
||||
/* like /usr////lib/../bin, or the strcmp() above will fail */
|
||||
}
|
||||
|
@ -66,6 +66,8 @@ static const char *const features[] = {
|
||||
|
||||
#elif defined(USE_NCURSES)
|
||||
N_("Using the ncurses library"),
|
||||
#elif defined(USE_NCURSESW)
|
||||
N_("Using the ncursesw library"),
|
||||
#else
|
||||
#error "Cannot compile mc without S-Lang or ncurses"
|
||||
#endif /* !HAVE_SLANG && !USE_NCURSES */
|
||||
|
17
src/tree.c
17
src/tree.c
@ -50,6 +50,7 @@
|
||||
#include "treestore.h"
|
||||
#include "cmd.h"
|
||||
#include "history.h"
|
||||
#include "strutil.h"
|
||||
|
||||
#define tlines(t) (t->is_panel ? t->widget.lines-2 - (show_mini_info ? 2 : 0) : t->widget.lines)
|
||||
|
||||
@ -177,12 +178,14 @@ static void tree_show_mini_info (WTree *tree, int tree_lines, int tree_cols)
|
||||
attrset (DLG_FOCUSC (h));
|
||||
addch (PATH_SEP);
|
||||
|
||||
addstr ((char *) name_trunc (tree->search_buffer, tree_cols-2));
|
||||
addstr (str_fit_to_term (tree->search_buffer,
|
||||
tree_cols - 2, J_LEFT_FIT));
|
||||
addch (' ');
|
||||
attrset (DLG_FOCUSC (h));
|
||||
} else {
|
||||
/* Show full name of selected directory */
|
||||
addstr ((char *) name_trunc (tree->selected_ptr->name, tree_cols));
|
||||
addstr (str_fit_to_term (tree->selected_ptr->name,
|
||||
tree_cols, J_LEFT_FIT));
|
||||
}
|
||||
}
|
||||
|
||||
@ -268,7 +271,7 @@ static void show_tree (WTree *tree)
|
||||
}
|
||||
|
||||
/* Show full name */
|
||||
addstr ((char *) name_trunc (current->name, tree_cols - 6));
|
||||
addstr (str_fit_to_term (current->name, tree_cols - 6, J_LEFT_FIT));
|
||||
} else{
|
||||
/* Sub level directory */
|
||||
|
||||
@ -302,8 +305,8 @@ static void show_tree (WTree *tree)
|
||||
|
||||
/* Show sub-name */
|
||||
addch (' ');
|
||||
addstr ((char *) name_trunc (current->subname,
|
||||
tree_cols - 2 - 4 - 3 * j));
|
||||
addstr (str_fit_to_term (current->subname,
|
||||
tree_cols - 2 - 4 - 3 * j, J_LEFT_FIT));
|
||||
}
|
||||
addch (' ');
|
||||
|
||||
@ -598,7 +601,7 @@ static void tree_copy (WTree *tree, const char *default_dest)
|
||||
if (!tree->selected_ptr)
|
||||
return;
|
||||
g_snprintf (cmd_buf, sizeof(cmd_buf), _("Copy \"%s\" directory to:"),
|
||||
name_trunc (tree->selected_ptr->name, 50));
|
||||
str_trunc (tree->selected_ptr->name, 50));
|
||||
dest = input_expand_dialog (_(" Copy "), cmd_buf, MC_HISTORY_FM_TREE_COPY, default_dest);
|
||||
|
||||
if (!dest)
|
||||
@ -641,7 +644,7 @@ static void tree_move (WTree *tree, const char *default_dest)
|
||||
if (!tree->selected_ptr)
|
||||
return;
|
||||
g_snprintf (cmd_buf, sizeof (cmd_buf), _("Move \"%s\" directory to:"),
|
||||
name_trunc (tree->selected_ptr->name, 50));
|
||||
str_trunc (tree->selected_ptr->name, 50));
|
||||
dest = input_expand_dialog (_(" Move "), cmd_buf, MC_HISTORY_FM_TREE_MOVE, default_dest);
|
||||
if (!dest)
|
||||
return;
|
||||
|
@ -32,8 +32,9 @@
|
||||
#include "global.h"
|
||||
#include "color.h"
|
||||
#include "main.h" /* for slow_terminal */
|
||||
#include "strutil.h"
|
||||
|
||||
#ifdef USE_NCURSES
|
||||
#if defined(USE_NCURSES) || defined(USE_NCURSESW)
|
||||
#define WANT_TERM_H
|
||||
#endif
|
||||
#include "tty.h"
|
||||
@ -159,9 +160,9 @@ extern void
|
||||
tty_print_string(const char *s)
|
||||
{
|
||||
#ifdef HAVE_SLANG
|
||||
SLsmg_write_string(str_unconst(s));
|
||||
SLsmg_write_string (str_unconst (str_term_form (s)));
|
||||
#else
|
||||
addstr(s);
|
||||
addstr (str_term_form (s));
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -15,6 +15,8 @@
|
||||
#ifdef USE_NCURSES
|
||||
# ifdef HAVE_NCURSES_CURSES_H
|
||||
# include <ncurses/curses.h>
|
||||
# elif HAVE_NCURSESW_CURSES_H
|
||||
# include <ncursesw/curses.h>
|
||||
# elif HAVE_NCURSES_H
|
||||
# include <ncurses.h>
|
||||
# else
|
||||
@ -25,6 +27,13 @@
|
||||
#endif /* WANT_TERM_H */
|
||||
#endif /* USE_NCURSES */
|
||||
|
||||
#ifdef USE_NCURSESW
|
||||
# include <ncursesw/curses.h>
|
||||
#ifdef WANT_TERM_H
|
||||
# include <term.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* {{{ Input }}} */
|
||||
|
||||
extern void tty_enable_interrupt_key(void);
|
||||
|
31
src/user.c
31
src/user.c
@ -34,6 +34,7 @@
|
||||
#include "execute.h"
|
||||
#include "setup.h"
|
||||
#include "history.h"
|
||||
#include "strutil.h"
|
||||
|
||||
#include "../edit/edit.h" /* BLOCK_FILE */
|
||||
#include "../edit/edit-widget.h" /* WEdit */
|
||||
@ -184,7 +185,7 @@ expand_format (struct WEdit *edit_widget, char c, int quote)
|
||||
if (edit_one_file != NULL)
|
||||
fname = edit_widget->filename;
|
||||
else {
|
||||
if (islower ((unsigned char) c))
|
||||
if (g_ascii_islower ((gchar) c))
|
||||
panel = current_panel;
|
||||
else {
|
||||
if (get_other_type () != view_listing)
|
||||
@ -199,7 +200,7 @@ expand_format (struct WEdit *edit_widget, char c, int quote)
|
||||
else
|
||||
quote_func = fake_name_quote;
|
||||
|
||||
c_lc = tolower ((unsigned char) c);
|
||||
c_lc = g_ascii_tolower ((gchar) c);
|
||||
|
||||
switch (c_lc) {
|
||||
case 'f':
|
||||
@ -324,16 +325,22 @@ check_patterns (char *p)
|
||||
point after argument. */
|
||||
static char *extract_arg (char *p, char *arg, int size)
|
||||
{
|
||||
char *np;
|
||||
|
||||
while (*p && (*p == ' ' || *p == '\t' || *p == '\n'))
|
||||
p++;
|
||||
/* support quote space .mnu */
|
||||
while (size > 1 && *p && (*p != ' ' || *(p-1) == '\\') && *p != '\t' && *p != '\n') {
|
||||
*arg++ = *p++;
|
||||
size--;
|
||||
while (*p && (*p != ' ' || *(p-1) == '\\') && *p != '\t' && *p != '\n') {
|
||||
np = str_get_next_char (p);
|
||||
if (np - p >= size) break;
|
||||
memcpy (arg, p, np - p);
|
||||
arg+= np - p;
|
||||
size-= np - p;
|
||||
p = np;
|
||||
}
|
||||
*arg = 0;
|
||||
if (!*p || *p == '\n')
|
||||
p --;
|
||||
str_prev_char (&p);
|
||||
return p;
|
||||
}
|
||||
|
||||
@ -410,7 +417,7 @@ static char *test_condition (WEdit *edit_widget, char *p, int *condition)
|
||||
case '!':
|
||||
p = test_condition (edit_widget, p, condition);
|
||||
*condition = ! *condition;
|
||||
p--;
|
||||
str_prev_char (&p);
|
||||
break;
|
||||
case 'f': /* file name pattern */
|
||||
p = extract_arg (p, arg, sizeof (arg));
|
||||
@ -554,7 +561,7 @@ static char *test_line (WEdit *edit_widget, char *p, int *result)
|
||||
debug_out (NULL, NULL, 1);
|
||||
|
||||
if (!*p || *p == '\n')
|
||||
p --;
|
||||
str_prev_char (&p);
|
||||
return p;
|
||||
}
|
||||
|
||||
@ -627,9 +634,9 @@ execute_menu_command (WEdit *edit_widget, const char *commands)
|
||||
}
|
||||
} else if (expand_prefix_found){
|
||||
expand_prefix_found = 0;
|
||||
if (isdigit ((unsigned char) *commands)) {
|
||||
if (g_ascii_isdigit ((gchar) *commands)) {
|
||||
do_quote = atoi (commands);
|
||||
while (isdigit ((unsigned char) *commands))
|
||||
while (g_ascii_isdigit ((gchar) *commands))
|
||||
commands++;
|
||||
}
|
||||
if (*commands == '{')
|
||||
@ -746,7 +753,7 @@ user_menu_cmd (struct WEdit *edit_widget)
|
||||
/* Parse the menu file */
|
||||
old_patterns = easy_patterns;
|
||||
p = check_patterns (data);
|
||||
for (menu_lines = col = 0; *p; p++){
|
||||
for (menu_lines = col = 0; *p; str_next_char (&p)){
|
||||
if (menu_lines >= menu_limit){
|
||||
char ** new_entries;
|
||||
|
||||
@ -789,7 +796,7 @@ user_menu_cmd (struct WEdit *edit_widget)
|
||||
selected = menu_lines;
|
||||
}
|
||||
}
|
||||
else if (*p != ' ' && *p != '\t' && is_printable (*p)) {
|
||||
else if (*p != ' ' && *p != '\t' && str_isprint (p)) {
|
||||
/* A menu entry title line */
|
||||
if (accept_entry)
|
||||
entries [menu_lines] = p;
|
||||
|
128
src/util.c
128
src/util.c
@ -41,6 +41,7 @@
|
||||
#include "mountlist.h"
|
||||
#include "win.h" /* xterm_flag */
|
||||
#include "timefmt.h"
|
||||
#include "strutil.h"
|
||||
|
||||
#ifdef HAVE_CHARSET
|
||||
#include "charsets.h"
|
||||
@ -228,32 +229,7 @@ fake_name_quote (const char *s, int quote_percent)
|
||||
const char *
|
||||
name_trunc (const char *txt, size_t trunc_len)
|
||||
{
|
||||
static char x[MC_MAXPATHLEN + MC_MAXPATHLEN];
|
||||
size_t txt_len;
|
||||
char *p;
|
||||
|
||||
if (!txt)
|
||||
return NULL;
|
||||
if (!*txt)
|
||||
return txt;
|
||||
|
||||
if (trunc_len > sizeof (x) - 1) {
|
||||
trunc_len = sizeof (x) - 1;
|
||||
}
|
||||
txt_len = strlen (txt);
|
||||
if (txt_len <= trunc_len) {
|
||||
strcpy (x, txt);
|
||||
} else {
|
||||
size_t y = (trunc_len / 2) + (trunc_len % 2);
|
||||
strncpy (x, txt, (size_t) y);
|
||||
strncpy (x + y, txt + (txt_len - (trunc_len / 2)), trunc_len / 2);
|
||||
x[y] = '~';
|
||||
}
|
||||
x[trunc_len] = 0;
|
||||
for (p = x; *p; p++)
|
||||
if (!is_printable (*p))
|
||||
*p = '?';
|
||||
return x;
|
||||
return str_trunc (txt, trunc_len);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -263,12 +239,11 @@ name_trunc (const char *txt, size_t trunc_len)
|
||||
*/
|
||||
const char *
|
||||
path_trunc (const char *path, size_t trunc_len) {
|
||||
const char *ret;
|
||||
char *secure_path = strip_password (g_strdup (path), 1);
|
||||
|
||||
ret = name_trunc (secure_path, trunc_len);
|
||||
|
||||
const char *ret = str_trunc (secure_path, trunc_len);
|
||||
g_free (secure_path);
|
||||
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -725,48 +700,52 @@ load_mc_home_file (const char *filename, char **allocated_filename)
|
||||
}
|
||||
|
||||
/* Check strftime() results. Some systems (i.e. Solaris) have different
|
||||
short-month-name sizes for different locales */
|
||||
short-month-name sizes for different locales */
|
||||
size_t
|
||||
i18n_checktimelength (void)
|
||||
{
|
||||
size_t length;
|
||||
time_t testtime = time (NULL);
|
||||
struct tm* lt = localtime(&testtime);
|
||||
size_t length;
|
||||
|
||||
if (lt == NULL) {
|
||||
// huh, localtime() doesnt seem to work ... falling back to "(invalid)"
|
||||
length = strlen(INVALID_TIME_TEXT);
|
||||
/* huh, localtime() doesnt seem to work ... falling back to "(invalid)" */
|
||||
length = str_term_width1 (_(INVALID_TIME_TEXT));
|
||||
} else {
|
||||
char buf [MAX_I18NTIMELENGTH + 1];
|
||||
size_t a, b;
|
||||
a = strftime (buf, sizeof(buf)-1, _("%b %e %H:%M"), lt);
|
||||
b = strftime (buf, sizeof(buf)-1, _("%b %e %Y"), lt);
|
||||
length = max (a, b);
|
||||
char buf [MB_LEN_MAX * MAX_I18NTIMELENGTH + 1];
|
||||
size_t a, b;
|
||||
|
||||
strftime (buf, sizeof(buf) - 1, _("%b %e %H:%M"), lt);
|
||||
a = str_term_width1 (buf);
|
||||
strftime (buf, sizeof(buf) - 1, _("%b %e %Y"), lt);
|
||||
b = str_term_width1 (buf);
|
||||
|
||||
length = max (a, b);
|
||||
length = max (str_term_width1 (_(INVALID_TIME_TEXT)), length);
|
||||
}
|
||||
|
||||
/* Don't handle big differences. Use standard value (email bug, please) */
|
||||
if ( length > MAX_I18NTIMELENGTH || length < MIN_I18NTIMELENGTH )
|
||||
length = STD_I18NTIMELENGTH;
|
||||
|
||||
if (length > MAX_I18NTIMELENGTH || length < MIN_I18NTIMELENGTH)
|
||||
length = STD_I18NTIMELENGTH;
|
||||
|
||||
return length;
|
||||
}
|
||||
|
||||
const char *
|
||||
file_date (time_t when)
|
||||
{
|
||||
static char timebuf [MAX_I18NTIMELENGTH + 1];
|
||||
static char timebuf [MB_LEN_MAX * MAX_I18NTIMELENGTH + 1];
|
||||
time_t current_time = time ((time_t) 0);
|
||||
static size_t i18n_timelength = 0;
|
||||
static int i18n = 0;
|
||||
static const char *fmtyear, *fmttime;
|
||||
const char *fmt;
|
||||
|
||||
if (i18n_timelength == 0){
|
||||
i18n_timelength = i18n_checktimelength() + 1;
|
||||
|
||||
if (!i18n){
|
||||
/* strftime() format string for old dates */
|
||||
fmtyear = _("%b %e %Y");
|
||||
/* strftime() format string for recent dates */
|
||||
fmttime = _("%b %e %H:%M");
|
||||
i18n = 1;
|
||||
}
|
||||
|
||||
if (current_time > when + 6L * 30L * 24L * 60L * 60L /* Old. */
|
||||
@ -781,8 +760,8 @@ file_date (time_t when)
|
||||
fmt = fmtyear;
|
||||
else
|
||||
fmt = fmttime;
|
||||
|
||||
FMT_LOCALTIME(timebuf, i18n_timelength, fmt, when);
|
||||
|
||||
FMT_LOCALTIME(timebuf, sizeof (timebuf), fmt, when);
|
||||
|
||||
return timebuf;
|
||||
}
|
||||
@ -814,7 +793,7 @@ _icase_search (const char *text, const char *data, int *lng)
|
||||
e += 2;
|
||||
dlng += 2;
|
||||
}
|
||||
if (toupper((unsigned char) *d) == toupper((unsigned char) *e))
|
||||
if (g_ascii_toupper((gchar) *d) == g_ascii_toupper((gchar) *e))
|
||||
d++;
|
||||
else {
|
||||
e -= d - text;
|
||||
@ -860,19 +839,23 @@ unix_error_string (int error_num)
|
||||
const char *
|
||||
skip_separators (const char *s)
|
||||
{
|
||||
for (;*s; s++)
|
||||
if (*s != ' ' && *s != '\t' && *s != ',')
|
||||
break;
|
||||
return s;
|
||||
const char *su = s;
|
||||
|
||||
for (;*su; str_cnext_char (&su))
|
||||
if (*su != ' ' && *su != '\t' && *su != ',') break;
|
||||
|
||||
return su;
|
||||
}
|
||||
|
||||
const char *
|
||||
skip_numbers (const char *s)
|
||||
{
|
||||
for (;*s; s++)
|
||||
if (!isdigit ((unsigned char) *s))
|
||||
break;
|
||||
return s;
|
||||
const char *su = s;
|
||||
|
||||
for (;*su; str_cnext_char (&su))
|
||||
if (!str_isdigit (su)) break;
|
||||
|
||||
return su;
|
||||
}
|
||||
|
||||
/* Remove all control sequences from the argument string. We define
|
||||
@ -893,6 +876,7 @@ strip_ctrl_codes (char *s)
|
||||
{
|
||||
char *w; /* Current position where the stripped data is written */
|
||||
char *r; /* Current position where the original data is read */
|
||||
char *n;
|
||||
|
||||
if (!s)
|
||||
return 0;
|
||||
@ -914,9 +898,12 @@ strip_ctrl_codes (char *s)
|
||||
continue;
|
||||
}
|
||||
|
||||
if (is_printable(*r))
|
||||
*w++ = *r;
|
||||
++r;
|
||||
n = str_get_next_char (r);
|
||||
if (str_isprint (r)) {
|
||||
memmove (w, r, n - r);
|
||||
w+= n - r;
|
||||
}
|
||||
r = n;
|
||||
}
|
||||
*w = 0;
|
||||
return s;
|
||||
@ -1503,21 +1490,10 @@ save_file_position (const char *filename, long line, long column)
|
||||
extern const char *
|
||||
cstrcasestr (const char *haystack, const char *needle)
|
||||
{
|
||||
const char *hptr;
|
||||
size_t i, needle_len;
|
||||
|
||||
needle_len = strlen (needle);
|
||||
for (hptr = haystack; *hptr != '\0'; hptr++) {
|
||||
for (i = 0; i < needle_len; i++) {
|
||||
if (toupper ((unsigned char) hptr[i]) !=
|
||||
toupper ((unsigned char) needle[i]))
|
||||
goto next_try;
|
||||
}
|
||||
return hptr;
|
||||
next_try:
|
||||
(void) 0;
|
||||
}
|
||||
return NULL;
|
||||
char *nee = str_create_search_needle (needle, 0);
|
||||
const char *result = str_search_first (haystack, nee, 0);
|
||||
str_release_search_needle (nee, 0);
|
||||
return result;
|
||||
}
|
||||
|
||||
const char *
|
||||
|
2004
src/view.c
2004
src/view.c
File diff suppressed because it is too large
Load Diff
594
src/widget.c
594
src/widget.c
File diff suppressed because it is too large
Load Diff
44
src/widget.h
44
src/widget.h
@ -26,6 +26,26 @@ typedef enum {
|
||||
/* button callback */
|
||||
typedef int (*bcback) (int);
|
||||
|
||||
/* structure for label (caption) with hotkey, if original text does not contain
|
||||
* hotkey, only start is valid and is equal to original text
|
||||
* hotkey is defined as char*, but mc support only singlebyte hotkey
|
||||
*/
|
||||
struct hotkey_t {
|
||||
char *start;
|
||||
char *hotkey;
|
||||
char *end;
|
||||
};
|
||||
|
||||
/* used in static definition of menu entries */
|
||||
#define NULL_HOTKEY {NULL, NULL, NULL}
|
||||
|
||||
/* create hotkey from text */
|
||||
struct hotkey_t parse_hotkey (const char *text);
|
||||
/* release hotkey, free all mebers of hotkey_t */
|
||||
void release_hotkey (const struct hotkey_t hotkey);
|
||||
/* return width on terminal of hotkey */
|
||||
int hotkey_width (const struct hotkey_t hotkey);
|
||||
|
||||
typedef struct WButton {
|
||||
Widget widget;
|
||||
int action; /* what to do when pressed */
|
||||
@ -36,8 +56,7 @@ typedef struct WButton {
|
||||
#define NORMAL_BUTTON 2
|
||||
#define DEFPUSH_BUTTON 3
|
||||
unsigned int flags; /* button flags */
|
||||
char *text; /* text of button */
|
||||
int hotkey; /* hot KEY */
|
||||
struct hotkey_t text; /* text of button, contain hotkey too */
|
||||
int hotpos; /* offset hot KEY char in text */
|
||||
bcback callback; /* Callback function */
|
||||
} WButton;
|
||||
@ -47,7 +66,7 @@ typedef struct WRadio {
|
||||
unsigned int state; /* radio button state */
|
||||
int pos, sel;
|
||||
int count; /* number of members */
|
||||
const char **texts; /* texts of labels */
|
||||
struct hotkey_t *texts; /* texts of labels */
|
||||
} WRadio;
|
||||
|
||||
typedef struct WCheck {
|
||||
@ -56,9 +75,7 @@ typedef struct WCheck {
|
||||
#define C_BOOL 0x0001
|
||||
#define C_CHANGE 0x0002
|
||||
unsigned int state; /* check button state */
|
||||
char *text; /* text of check button */
|
||||
int hotkey; /* hot KEY */
|
||||
int hotpos; /* offset hot KEY char in text */
|
||||
struct hotkey_t text; /* text of check button */
|
||||
} WCheck;
|
||||
|
||||
typedef struct WGauge {
|
||||
@ -74,11 +91,11 @@ char *show_hist (GList *history, int widget_y, int widget_x);
|
||||
|
||||
typedef struct {
|
||||
Widget widget;
|
||||
int point; /* cursor position in the input line */
|
||||
int mark; /* The mark position */
|
||||
int first_shown; /* Index of the first shown character */
|
||||
int current_max_len; /* Maximum length of input line */
|
||||
int field_len; /* Length of the editing field */
|
||||
int point; /* cursor position in the input line in characters */
|
||||
int mark; /* The mark position in characters */
|
||||
int term_first_shown; /* column of the first shown character */
|
||||
size_t current_max_size; /* Maximum length of input line (bytes) */
|
||||
int field_width; /* width of the editing field */
|
||||
int color; /* color used */
|
||||
int first; /* Is first keystroke? */
|
||||
int disable_update; /* Do we want to skip updates? */
|
||||
@ -89,6 +106,8 @@ typedef struct {
|
||||
char **completions; /* Possible completions array */
|
||||
INPUT_COMPLETE_FLAGS completion_flags; /* INPUT_COMPLETE* bitwise flags(complete.h) */
|
||||
char *history_name; /* name of history for loading and saving */
|
||||
char charbuf[MB_LEN_MAX]; /* buffer for multibytes characters */
|
||||
size_t charpoint; /* point to end of mulibyte sequence in charbuf */
|
||||
} WInput;
|
||||
|
||||
/* For history load-save functions */
|
||||
@ -152,7 +171,7 @@ WListbox *listbox_new (int x, int y, int width, int height, lcback callback);
|
||||
WGroupbox *groupbox_new (int x, int y, int width, int height, const char *title);
|
||||
|
||||
/* Input lines */
|
||||
void winput_set_origin (WInput *i, int x, int field_len);
|
||||
void winput_set_origin (WInput *i, int x, int field_width);
|
||||
cb_ret_t handle_char (WInput *in, int c_code);
|
||||
int is_in_input_map (WInput *in, int c_code);
|
||||
void update_input (WInput *in, int clear_first);
|
||||
@ -175,6 +194,7 @@ void gauge_set_value (WGauge *g, int max, int current);
|
||||
void gauge_show (WGauge *g, int shown);
|
||||
|
||||
/* Buttons */
|
||||
/* return copy of button text */
|
||||
const char *button_get_text (WButton *b);
|
||||
void button_set_text (WButton *b, const char *text);
|
||||
|
||||
|
@ -34,6 +34,7 @@
|
||||
#include "win.h"
|
||||
#include "key.h" /* XCTRL and ALT macros */
|
||||
#include "layout.h"
|
||||
#include "strutil.h"
|
||||
|
||||
/*
|
||||
* Common handler for standard movement keys in a text area. Provided
|
||||
@ -217,7 +218,7 @@ int lookup_key (char *keyname)
|
||||
int i;
|
||||
|
||||
for (i = 0; key_name_conv_tab [i].code; i++){
|
||||
if ( g_strcasecmp (key_name_conv_tab [i].name, keyname))
|
||||
if (str_casecmp (key_name_conv_tab [i].name, keyname))
|
||||
continue;
|
||||
return key_name_conv_tab [i].code;
|
||||
}
|
||||
|
17
src/wtools.c
17
src/wtools.c
@ -37,6 +37,7 @@
|
||||
#include "wtools.h"
|
||||
#include "key.h" /* mi_getch() */
|
||||
#include "background.h" /* parent_call */
|
||||
#include "strutil.h"
|
||||
|
||||
|
||||
Listbox *
|
||||
@ -49,11 +50,11 @@ create_listbox_window (int cols, int lines, const char *title, const char *help)
|
||||
/* Adjust sizes */
|
||||
lines = (lines > LINES - 6) ? LINES - 6 : lines;
|
||||
|
||||
if (title && (cols < (len = strlen (title) + 2)))
|
||||
if (title && (cols < (len = str_term_width1 (title) + 2)))
|
||||
cols = len;
|
||||
|
||||
/* no &, but 4 spaces around button for brackets and such */
|
||||
if (cols < (len = strlen (cancel_string) + 3))
|
||||
if (cols < (len = str_term_width1 (cancel_string) + 3))
|
||||
cols = len;
|
||||
|
||||
cols = cols > COLS - 6 ? COLS - 6 : cols;
|
||||
@ -124,7 +125,7 @@ query_dialog (const char *header, const char *text, int flags, int count, ...)
|
||||
va_start (ap, count);
|
||||
for (i = 0; i < count; i++) {
|
||||
char *cp = va_arg (ap, char *);
|
||||
win_len += strlen (cp) + 6;
|
||||
win_len += str_term_width1 (cp) + 6;
|
||||
if (strchr (cp, '&') != NULL)
|
||||
win_len--;
|
||||
}
|
||||
@ -132,8 +133,8 @@ query_dialog (const char *header, const char *text, int flags, int count, ...)
|
||||
}
|
||||
|
||||
/* count coordinates */
|
||||
msglen (text, &lines, &cols);
|
||||
cols = 6 + max (win_len, max ((int) strlen (header), cols));
|
||||
str_msg_term_size (text, &lines, &cols);
|
||||
cols = 6 + max (win_len, max (str_term_width1 (header), cols));
|
||||
lines += 4 + (count > 0 ? 2 : 0);
|
||||
xpos = COLS / 2 - cols / 2;
|
||||
ypos = LINES / 3 - (lines - 3) / 2;
|
||||
@ -148,7 +149,7 @@ query_dialog (const char *header, const char *text, int flags, int count, ...)
|
||||
va_start (ap, count);
|
||||
for (i = 0; i < count; i++) {
|
||||
cur_name = va_arg (ap, char *);
|
||||
xpos = strlen (cur_name) + 6;
|
||||
xpos = str_term_width1 (cur_name) + 6;
|
||||
if (strchr (cur_name, '&') != NULL)
|
||||
xpos--;
|
||||
|
||||
@ -467,7 +468,7 @@ fg_input_dialog_help (const char *header, const char *text, const char *help,
|
||||
}
|
||||
|
||||
msglen (text, &lines, &cols);
|
||||
len = max ((int) strlen (header), cols) + 4;
|
||||
len = max (str_term_width1 (header), cols) + 4;
|
||||
len = max (len, 64);
|
||||
|
||||
/* The special value of def_text is used to identify password boxes
|
||||
@ -489,7 +490,7 @@ fg_input_dialog_help (const char *header, const char *text, const char *help,
|
||||
quick_widgets[1].text = _(quick_widgets[1].text);
|
||||
quick_widgets[0].relative_x = len / 2 + 4;
|
||||
quick_widgets[1].relative_x =
|
||||
len / 2 - (strlen (quick_widgets[1].text) + 9);
|
||||
len / 2 - (str_term_width1 (quick_widgets[1].text) + 9);
|
||||
quick_widgets[0].x_divisions = quick_widgets[1].x_divisions = len;
|
||||
#endif /* ENABLE_NLS */
|
||||
|
||||
|
@ -27,6 +27,7 @@
|
||||
#include <sys/types.h>
|
||||
|
||||
#undef USE_NCURSES /* Don't include *curses.h */
|
||||
#undef USE_NCURSESW
|
||||
#include "../src/global.h"
|
||||
#include "../src/tty.h" /* enable/disable interrupt key */
|
||||
#include "../src/wtools.h" /* message() */
|
||||
|
373
vfs/vfs.c
373
vfs/vfs.c
@ -42,6 +42,7 @@
|
||||
#include "../src/tty.h" /* enable/disable interrupt key */
|
||||
#include "../src/wtools.h" /* message() */
|
||||
#include "../src/main.h" /* print_vfs_message */
|
||||
#include "../src/strutil.h"
|
||||
#include "utilvfs.h"
|
||||
#include "gc.h"
|
||||
|
||||
@ -64,10 +65,32 @@ struct vfs_openfile {
|
||||
void *fsinfo;
|
||||
};
|
||||
|
||||
struct vfs_dirinfo{
|
||||
DIR *info;
|
||||
str_conv_t converter;
|
||||
};
|
||||
|
||||
|
||||
static GSList *vfs_openfiles;
|
||||
#define VFS_FIRST_HANDLE 100
|
||||
|
||||
static struct vfs_class *localfs_class;
|
||||
static struct str_buffer *vfs_str_buffer;
|
||||
|
||||
static const char *supported_encodings[] = {
|
||||
"UTF8",
|
||||
"UTF-8",
|
||||
"BIG5",
|
||||
"ASCII",
|
||||
"ISO8859",
|
||||
"ISO-8859",
|
||||
"ISO_8859",
|
||||
"KOI8",
|
||||
"CP852",
|
||||
"CP866",
|
||||
"CP125",
|
||||
NULL
|
||||
};
|
||||
|
||||
/* Create new VFS handle and put it to the list */
|
||||
static int
|
||||
@ -309,6 +332,161 @@ vfs_get_class (const char *pathname)
|
||||
return vfs;
|
||||
}
|
||||
|
||||
const char *
|
||||
vfs_get_encoding (const char *path)
|
||||
{
|
||||
static char result[16];
|
||||
char *work;
|
||||
char *semi;
|
||||
char *slash;
|
||||
|
||||
work = g_strdup (path);
|
||||
semi = g_strrstr (work, "#enc:");
|
||||
|
||||
if (semi != NULL) {
|
||||
semi+= 5 * sizeof (char);
|
||||
slash = strchr (semi, PATH_SEP);
|
||||
if (slash != NULL)
|
||||
slash[0] = '\0';
|
||||
|
||||
g_strlcpy (result, semi, sizeof(result));
|
||||
g_free (work);
|
||||
return result;
|
||||
} else {
|
||||
g_free (work);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/* return if encoding can by used in vfs (is ascci full compactible) */
|
||||
/* contains only a few encoding now */
|
||||
static int
|
||||
vfs_supported_enconding (const char *encoding) {
|
||||
int t;
|
||||
int result = 0;
|
||||
|
||||
for (t = 0; supported_encodings[t] != NULL; t++) {
|
||||
result+= (g_ascii_strncasecmp (encoding, supported_encodings[t],
|
||||
strlen (supported_encodings[t])) == 0);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/* now used only by vfs_translate_path, but could be used in other vfs
|
||||
* plugin to automatic detect encoding
|
||||
* path - path to translate
|
||||
* size - how many bytes from path translate
|
||||
* defcnv - convertor, that is used as default, when path does not contain any
|
||||
* #enc: subtring
|
||||
* buffer - used to store result of translation
|
||||
*/
|
||||
static int
|
||||
_vfs_translate_path (const char *path, int size,
|
||||
str_conv_t defcnv, struct str_buffer *buffer)
|
||||
{
|
||||
const char *semi;
|
||||
const char *ps;
|
||||
const char *slash;
|
||||
int state = 0;
|
||||
static char encoding[16];
|
||||
str_conv_t coder;
|
||||
int ms;
|
||||
|
||||
if (size == 0) return 0;
|
||||
size = (size > 0) ? size : strlen (path);
|
||||
|
||||
/* try found #end: */
|
||||
semi = g_strrstr_len (path, size, "#enc:");
|
||||
if (semi != NULL) {
|
||||
/* first must be translated part before #enc: */
|
||||
ms = semi - path;
|
||||
|
||||
/* remove '/' before #enc */
|
||||
ps = str_cget_prev_char (semi);
|
||||
if (ps[0] == PATH_SEP) ms = ps - path;
|
||||
|
||||
state = _vfs_translate_path (path, ms, defcnv, buffer);
|
||||
|
||||
if (state != 0) return state;
|
||||
/* now can be translated part after #enc: */
|
||||
|
||||
semi+= 5;
|
||||
slash = strchr (semi, PATH_SEP);
|
||||
// ignore slashes after size;
|
||||
if (slash - path >= size) slash = NULL;
|
||||
|
||||
ms = (slash != NULL) ? slash - semi : strlen (semi);
|
||||
ms = min (ms, sizeof (encoding) - 1);
|
||||
// limit encoding size (ms) to path size (size)
|
||||
if (semi + ms > path + size) ms = path + size - semi;
|
||||
memcpy (encoding, semi, ms);
|
||||
encoding[ms] = '\0';
|
||||
|
||||
switch (vfs_supported_enconding (encoding)) {
|
||||
case 1:
|
||||
coder = str_crt_conv_to (encoding);
|
||||
if (coder != (iconv_t) (-1)) {
|
||||
if (slash != NULL) {
|
||||
state = str_vfs_convert_to (coder, slash,
|
||||
path + size - slash, buffer);
|
||||
} else if (buffer->data[0] == '\0') {
|
||||
/* exmaple "/#enc:utf-8" */
|
||||
str_insert_char (PATH_SEP, buffer);
|
||||
}
|
||||
str_close_conv (coder);
|
||||
return state;
|
||||
} else {
|
||||
errno = EINVAL;
|
||||
return ESTR_FAILURE;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
errno = EINVAL;
|
||||
return ESTR_FAILURE;
|
||||
}
|
||||
|
||||
} else {
|
||||
/* path can be translated whole at once */
|
||||
state = str_vfs_convert_to (defcnv, path, size, buffer);
|
||||
return state;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
char *
|
||||
vfs_translate_path (const char *path)
|
||||
{
|
||||
int state;
|
||||
|
||||
str_reset_buffer (vfs_str_buffer);
|
||||
state = _vfs_translate_path (path, -1, str_cnv_from_term, vfs_str_buffer);
|
||||
// strict version
|
||||
//return (state == 0) ? vfs_str_buffer->data : NULL;
|
||||
return (state != ESTR_FAILURE) ? vfs_str_buffer->data : NULL;
|
||||
}
|
||||
|
||||
char *
|
||||
vfs_translate_path_n (const char *path)
|
||||
{
|
||||
char *result;
|
||||
|
||||
result = vfs_translate_path (path);
|
||||
return (result != NULL) ? g_strdup (result) : NULL;
|
||||
}
|
||||
|
||||
char *
|
||||
vfs_canon_and_translate (const char *path)
|
||||
{
|
||||
char *canon;
|
||||
char *result;
|
||||
canon = vfs_canon (path);
|
||||
result = vfs_translate_path_n (canon);
|
||||
g_free (canon);
|
||||
return result;
|
||||
}
|
||||
|
||||
static int
|
||||
ferrno (struct vfs_class *vfs)
|
||||
{
|
||||
@ -323,7 +501,8 @@ mc_open (const char *filename, int flags, ...)
|
||||
void *info;
|
||||
va_list ap;
|
||||
|
||||
char *file = vfs_canon (filename);
|
||||
char *file = vfs_canon_and_translate (filename);
|
||||
if (file != NULL) {
|
||||
struct vfs_class *vfs = vfs_get_class (file);
|
||||
|
||||
/* Get the mode flag */
|
||||
@ -348,6 +527,7 @@ mc_open (const char *filename, int flags, ...)
|
||||
}
|
||||
|
||||
return vfs_new_handle (vfs, info);
|
||||
} else return -1;
|
||||
}
|
||||
|
||||
|
||||
@ -356,13 +536,15 @@ int mc_##name inarg \
|
||||
{ \
|
||||
struct vfs_class *vfs; \
|
||||
int result; \
|
||||
char *mpath = vfs_canon (path); \
|
||||
char *mpath = vfs_canon_and_translate (path); \
|
||||
if (mpath != NULL) { \
|
||||
vfs = vfs_get_class (mpath); \
|
||||
result = vfs->name ? (*vfs->name)callarg : -1; \
|
||||
g_free (mpath); \
|
||||
if (result == -1) \
|
||||
errno = vfs->name ? ferrno (vfs) : E_NOTSUPP; \
|
||||
return result; \
|
||||
} else return -1; \
|
||||
}
|
||||
|
||||
MC_NAMEOP (chmod, (const char *path, mode_t mode), (vfs, mpath, mode))
|
||||
@ -370,11 +552,38 @@ MC_NAMEOP (chown, (const char *path, uid_t owner, gid_t group), (vfs, mpath, own
|
||||
MC_NAMEOP (utime, (const char *path, struct utimbuf *times), (vfs, mpath, times))
|
||||
MC_NAMEOP (readlink, (const char *path, char *buf, int bufsiz), (vfs, mpath, buf, bufsiz))
|
||||
MC_NAMEOP (unlink, (const char *path), (vfs, mpath))
|
||||
MC_NAMEOP (symlink, (const char *name1, const char *path), (vfs, name1, mpath))
|
||||
MC_NAMEOP (mkdir, (const char *path, mode_t mode), (vfs, mpath, mode))
|
||||
MC_NAMEOP (rmdir, (const char *path), (vfs, mpath))
|
||||
MC_NAMEOP (mknod, (const char *path, mode_t mode, dev_t dev), (vfs, mpath, mode, dev))
|
||||
|
||||
int
|
||||
mc_symlink (const char *name1, const char *path)
|
||||
{
|
||||
struct vfs_class *vfs;
|
||||
int result;
|
||||
char *mpath;
|
||||
char *lpath;
|
||||
char *tmp;
|
||||
|
||||
mpath = vfs_canon_and_translate (path);
|
||||
if (mpath != NULL) {
|
||||
tmp = g_strdup (name1);
|
||||
lpath = vfs_translate_path_n (tmp);
|
||||
g_free (tmp);
|
||||
|
||||
if (lpath != NULL) {
|
||||
vfs = vfs_get_class (mpath);
|
||||
result = vfs->symlink ? (*vfs->symlink) (vfs, lpath, mpath) : -1;
|
||||
g_free (lpath);
|
||||
|
||||
if (result == -1)
|
||||
errno = vfs->symlink ? ferrno (vfs) : E_NOTSUPP;
|
||||
return result;
|
||||
}
|
||||
g_free (mpath);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
#define MC_HANDLEOP(name, inarg, callarg) \
|
||||
ssize_t mc_##name inarg \
|
||||
@ -399,9 +608,12 @@ int mc_##name (const char *fname1, const char *fname2) \
|
||||
{ \
|
||||
struct vfs_class *vfs; \
|
||||
int result; \
|
||||
char *name2, *name1 = vfs_canon (fname1); \
|
||||
char *name2, *name1; \
|
||||
name1 = vfs_canon_and_translate (fname1); \
|
||||
if (name1 != NULL) { \
|
||||
name2 = vfs_canon_and_translate (fname2); \
|
||||
if (name2 != NULL) { \
|
||||
vfs = vfs_get_class (name1); \
|
||||
name2 = vfs_canon (fname2); \
|
||||
if (vfs != vfs_get_class (name2)){ \
|
||||
errno = EXDEV; \
|
||||
g_free (name1); \
|
||||
@ -414,6 +626,11 @@ int mc_##name (const char *fname1, const char *fname2) \
|
||||
if (result == -1) \
|
||||
errno = vfs->name ? ferrno (vfs) : E_NOTSUPP; \
|
||||
return result; \
|
||||
} else { \
|
||||
g_free (name1); \
|
||||
return -1; \
|
||||
} \
|
||||
} else return -1; \
|
||||
}
|
||||
|
||||
MC_RENAMEOP (link)
|
||||
@ -438,11 +655,13 @@ mc_setctl (const char *path, int ctlop, void *arg)
|
||||
if (!path)
|
||||
vfs_die("You don't want to pass NULL to mc_setctl.");
|
||||
|
||||
mpath = vfs_canon (path);
|
||||
mpath = vfs_canon_and_translate (path);
|
||||
if (mpath != NULL) {
|
||||
vfs = vfs_get_class (mpath);
|
||||
result = vfs->setctl ? (*vfs->setctl)(vfs, mpath, ctlop, arg) : 0;
|
||||
g_free (mpath);
|
||||
return result;
|
||||
} else return -1;
|
||||
}
|
||||
|
||||
int
|
||||
@ -474,22 +693,43 @@ mc_opendir (const char *dirname)
|
||||
int handle, *handlep;
|
||||
void *info;
|
||||
struct vfs_class *vfs;
|
||||
char *canon;
|
||||
char *dname;
|
||||
struct vfs_dirinfo *dirinfo;
|
||||
const char *encoding;
|
||||
|
||||
dname = vfs_canon (dirname);
|
||||
vfs = vfs_get_class (dname);
|
||||
canon = vfs_canon (dirname);
|
||||
dname = vfs_translate_path_n (canon);
|
||||
|
||||
if (dname != NULL) {
|
||||
vfs = vfs_get_class (dname);
|
||||
info = vfs->opendir ? (*vfs->opendir)(vfs, dname) : NULL;
|
||||
g_free (dname);
|
||||
|
||||
if (!info){
|
||||
errno = vfs->opendir ? ferrno (vfs) : E_NOTSUPP;
|
||||
g_free (canon);
|
||||
return NULL;
|
||||
}
|
||||
handle = vfs_new_handle (vfs, info);
|
||||
|
||||
dirinfo = g_new (struct vfs_dirinfo, 1);
|
||||
dirinfo->info = info;
|
||||
|
||||
encoding = vfs_get_encoding (canon);
|
||||
g_free (canon);
|
||||
dirinfo->converter = (encoding != NULL) ? str_crt_conv_from (encoding) :
|
||||
str_cnv_from_term;
|
||||
if (dirinfo->converter == (iconv_t) (-1)) dirinfo->converter =str_cnv_from_term;
|
||||
|
||||
handle = vfs_new_handle (vfs, dirinfo);
|
||||
|
||||
handlep = g_new (int, 1);
|
||||
*handlep = handle;
|
||||
return (DIR *) handlep;
|
||||
} else {
|
||||
g_free (canon);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
struct dirent *
|
||||
@ -497,7 +737,10 @@ mc_readdir (DIR *dirp)
|
||||
{
|
||||
int handle;
|
||||
struct vfs_class *vfs;
|
||||
struct dirent *result = NULL;
|
||||
static struct dirent result;
|
||||
struct dirent *entry = NULL;
|
||||
struct vfs_dirinfo *dirinfo;
|
||||
int state;
|
||||
|
||||
if (!dirp) {
|
||||
errno = EFAULT;
|
||||
@ -505,11 +748,21 @@ mc_readdir (DIR *dirp)
|
||||
}
|
||||
handle = *(int *) dirp;
|
||||
vfs = vfs_op (handle);
|
||||
if (vfs->readdir)
|
||||
result = (*vfs->readdir) (vfs_info (handle));
|
||||
if (!result)
|
||||
errno = vfs->readdir ? ferrno (vfs) : E_NOTSUPP;
|
||||
return result;
|
||||
dirinfo = vfs_info (handle);
|
||||
if (vfs->readdir) {
|
||||
do {
|
||||
entry = (*vfs->readdir) (dirinfo->info);
|
||||
if (entry == NULL) return NULL;
|
||||
str_reset_buffer (vfs_str_buffer);
|
||||
state = str_vfs_convert_from (dirinfo->converter,
|
||||
entry->d_name, vfs_str_buffer);
|
||||
} while (state != 0);
|
||||
memcpy (&result, entry, sizeof (struct dirent));
|
||||
g_strlcpy (result.d_name, vfs_str_buffer->data, NAME_MAX + 1);
|
||||
result.d_reclen = strlen (result.d_name);
|
||||
}
|
||||
if (entry == NULL) errno = vfs->readdir ? ferrno (vfs) : E_NOTSUPP;
|
||||
return (entry != NULL) ? &result : NULL;
|
||||
}
|
||||
|
||||
int
|
||||
@ -518,9 +771,14 @@ mc_closedir (DIR *dirp)
|
||||
int handle = *(int *) dirp;
|
||||
struct vfs_class *vfs = vfs_op (handle);
|
||||
int result;
|
||||
struct vfs_dirinfo *dirinfo;
|
||||
|
||||
result = vfs->closedir ? (*vfs->closedir)(vfs_info (handle)) : -1;
|
||||
dirinfo = vfs_info (handle);
|
||||
if (dirinfo->converter != str_cnv_from_term) str_close_conv (dirinfo->converter);
|
||||
|
||||
result = vfs->closedir ? (*vfs->closedir)(dirinfo->info) : -1;
|
||||
vfs_free_handle (handle);
|
||||
g_free (dirinfo);
|
||||
g_free (dirp);
|
||||
return result;
|
||||
}
|
||||
@ -529,24 +787,37 @@ int mc_stat (const char *filename, struct stat *buf) {
|
||||
struct vfs_class *vfs;
|
||||
int result;
|
||||
char *path;
|
||||
path = vfs_canon (filename); vfs = vfs_get_class (path);
|
||||
|
||||
path = vfs_canon_and_translate (filename);
|
||||
|
||||
if (path != NULL) {
|
||||
vfs = vfs_get_class (path);
|
||||
|
||||
result = vfs->stat ? (*vfs->stat) (vfs, path, buf) : -1;
|
||||
|
||||
g_free (path);
|
||||
|
||||
if (result == -1)
|
||||
errno = vfs->name ? ferrno (vfs) : E_NOTSUPP;
|
||||
return result;
|
||||
} else return -1;
|
||||
}
|
||||
|
||||
int mc_lstat (const char *filename, struct stat *buf) {
|
||||
struct vfs_class *vfs;
|
||||
int result;
|
||||
char *path;
|
||||
path = vfs_canon (filename); vfs = vfs_get_class (path);
|
||||
|
||||
path = vfs_canon_and_translate (filename);
|
||||
|
||||
if (path != NULL) {
|
||||
vfs = vfs_get_class (path);
|
||||
result = vfs->lstat ? (*vfs->lstat) (vfs, path, buf) : -1;
|
||||
g_free (path);
|
||||
if (result == -1)
|
||||
errno = vfs->name ? ferrno (vfs) : E_NOTSUPP;
|
||||
return result;
|
||||
} else return -1;
|
||||
}
|
||||
|
||||
int mc_fstat (int handle, struct stat *buf) {
|
||||
@ -569,25 +840,40 @@ int mc_fstat (int handle, struct stat *buf) {
|
||||
static const char *
|
||||
_vfs_get_cwd (void)
|
||||
{
|
||||
char *p;
|
||||
char *sys_cwd;
|
||||
char *trans;
|
||||
const char *encoding;
|
||||
char *tmp;
|
||||
int state;
|
||||
struct stat my_stat, my_stat2;
|
||||
|
||||
if (!_vfs_get_class (current_dir)) {
|
||||
p = g_get_current_dir ();
|
||||
if (!p) /* One of the directories in the path is not readable */
|
||||
trans = vfs_translate_path_n (current_dir); //add check if NULL
|
||||
|
||||
if (!_vfs_get_class (trans)) {
|
||||
encoding = vfs_get_encoding (current_dir);
|
||||
if (encoding == NULL) {
|
||||
tmp = g_get_current_dir ();
|
||||
if (tmp != NULL) { /* One of the directories in the path is not readable */
|
||||
str_reset_buffer (vfs_str_buffer);
|
||||
state = str_vfs_convert_from (str_cnv_from_term, tmp, vfs_str_buffer);
|
||||
g_free (tmp);
|
||||
sys_cwd = (state == 0) ? g_strdup (vfs_str_buffer->data) : NULL;
|
||||
if (!sys_cwd)
|
||||
return current_dir;
|
||||
|
||||
/* Otherwise check if it is O.K. to use the current_dir */
|
||||
if (!cd_symlinks || mc_stat (p, &my_stat)
|
||||
if (!cd_symlinks || mc_stat (sys_cwd, &my_stat)
|
||||
|| mc_stat (current_dir, &my_stat2)
|
||||
|| my_stat.st_ino != my_stat2.st_ino
|
||||
|| my_stat.st_dev != my_stat2.st_dev) {
|
||||
g_free (current_dir);
|
||||
current_dir = p;
|
||||
return p;
|
||||
} /* Otherwise we return current_dir below */
|
||||
g_free (p);
|
||||
current_dir = sys_cwd;
|
||||
return sys_cwd;
|
||||
}/* Otherwise we return current_dir below */
|
||||
}
|
||||
}
|
||||
}
|
||||
g_free (trans);
|
||||
return current_dir;
|
||||
}
|
||||
|
||||
@ -682,22 +968,27 @@ int
|
||||
mc_chdir (const char *path)
|
||||
{
|
||||
char *new_dir;
|
||||
char *trans_dir;
|
||||
struct vfs_class *old_vfs, *new_vfs;
|
||||
vfsid old_vfsid;
|
||||
int result;
|
||||
|
||||
new_dir = vfs_canon (path);
|
||||
new_vfs = vfs_get_class (new_dir);
|
||||
trans_dir = vfs_translate_path_n (new_dir);
|
||||
if (trans_dir != NULL) {
|
||||
new_vfs = vfs_get_class (trans_dir);
|
||||
if (!new_vfs->chdir) {
|
||||
g_free (new_dir);
|
||||
g_free (trans_dir);
|
||||
return -1;
|
||||
}
|
||||
|
||||
result = (*new_vfs->chdir) (new_vfs, new_dir);
|
||||
result = (*new_vfs->chdir) (new_vfs, trans_dir);
|
||||
|
||||
if (result == -1) {
|
||||
errno = ferrno (new_vfs);
|
||||
g_free (new_dir);
|
||||
g_free (trans_dir);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -720,7 +1011,12 @@ mc_chdir (const char *path)
|
||||
*p = 0;
|
||||
}
|
||||
|
||||
g_free (trans_dir);
|
||||
return 0;
|
||||
} else {
|
||||
g_free (new_dir);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
/* Return 1 is the current VFS class is local */
|
||||
@ -737,10 +1033,12 @@ vfs_file_class_flags (const char *filename)
|
||||
struct vfs_class *vfs;
|
||||
char *fname;
|
||||
|
||||
fname = vfs_canon (filename);
|
||||
fname = vfs_canon_and_translate (filename);
|
||||
if (fname != NULL) {
|
||||
vfs = vfs_get_class (fname);
|
||||
g_free (fname);
|
||||
return vfs->flags;
|
||||
} else return -1;
|
||||
}
|
||||
|
||||
static char *
|
||||
@ -792,7 +1090,10 @@ char *
|
||||
mc_getlocalcopy (const char *pathname)
|
||||
{
|
||||
char *result;
|
||||
char *path = vfs_canon (pathname);
|
||||
char *path;
|
||||
|
||||
path = vfs_canon_and_translate (pathname);
|
||||
if (path != NULL) {
|
||||
struct vfs_class *vfs = vfs_get_class (path);
|
||||
|
||||
result = vfs->getlocalcopy ? (*vfs->getlocalcopy)(vfs, path) :
|
||||
@ -801,6 +1102,7 @@ mc_getlocalcopy (const char *pathname)
|
||||
if (!result)
|
||||
errno = ferrno (vfs);
|
||||
return result;
|
||||
} else return NULL;
|
||||
}
|
||||
|
||||
static int
|
||||
@ -854,7 +1156,10 @@ int
|
||||
mc_ungetlocalcopy (const char *pathname, const char *local, int has_changed)
|
||||
{
|
||||
int return_value = 0;
|
||||
char *path = vfs_canon (pathname);
|
||||
char *path;
|
||||
|
||||
path = vfs_canon_and_translate (pathname);
|
||||
if (path != NULL) {
|
||||
struct vfs_class *vfs = vfs_get_class (path);
|
||||
|
||||
return_value = vfs->ungetlocalcopy ?
|
||||
@ -862,12 +1167,14 @@ mc_ungetlocalcopy (const char *pathname, const char *local, int has_changed)
|
||||
mc_def_ungetlocalcopy (vfs, path, local, has_changed);
|
||||
g_free (path);
|
||||
return return_value;
|
||||
} else return -1;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
vfs_init (void)
|
||||
{
|
||||
vfs_str_buffer = str_get_buffer ();
|
||||
/* localfs needs to be the first one */
|
||||
init_localfs();
|
||||
/* fallback value for vfs_get_class() */
|
||||
@ -911,6 +1218,8 @@ vfs_shut (void)
|
||||
(*vfs->done) (vfs);
|
||||
|
||||
g_slist_free (vfs_openfiles);
|
||||
|
||||
str_release_buffer (vfs_str_buffer);
|
||||
}
|
||||
|
||||
/*
|
||||
|
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);
|
||||
int vfs_current_is_local (void);
|
||||
int vfs_file_is_local (const char *filename);
|
||||
/* translate path back to terminal encoding, remove all #enc:
|
||||
* every invalid character is replaced with question mark
|
||||
* return static buffer */
|
||||
char *vfs_translate_path (const char *path);
|
||||
/* return new string */
|
||||
char *vfs_translate_path_n (const char *path);
|
||||
/* return encoding after last #enc: or NULL, if part does not contain #enc:
|
||||
* return static buffer */
|
||||
const char *vfs_get_encoding (const char *path);
|
||||
// canonize and translate path, return new string */
|
||||
char *vfs_canon_and_translate (const char *path);
|
||||
|
||||
/* Only the routines outside of the VFS module need the emulation macros */
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user