Pon un scroll bar en tu blog

Con esta entrada quiero hacer un pequeño resumen de las distintas posibilidades que ofrece poner un scroll bar en una entrada de blog. Con éste podemos poner un trozo del programa que estáis desarrollando, o algún texto que necesiteis que este preformateado ya que éste mantiene los espacios, aunque convertirá el texto a fuente monoespaciada (habitualmente Courier).

Para poder poner un scroll bar, se ha de poner

    <pre style="border: 1px solid white; background-color: #ffffff; overflow: auto; width: 100%; height: 100px">Mensaje</pre>

Un ejemplo de ello es lo siguiente:


/**

* @file info.c

* @author Huang-Lû

* @version 1.0

* @date 12 Marzo 2007

* @brief Muestra el contenido del nodo-i de uno o varios ficheros

*

* La sintaxis de invocacion del programa es:

* <code> info fichero [fichero]* </code>

*/


#include <stdio.h>

#include <sys/types.h>

#include <sys/stat.h>


const char permisos[] = {'x', 'w', 'r'} ;


/**

* @brief Funcion principal del programa

* @param argc Numero de argumentos de la linea de ordenes, incluyendo

* el nombre del fichero ejecutable

* @param argv Puntero a un array de cadenas de caracteres. Permite acceder a

* la linea de ordenes

* @param envp Puntero a un array de cadenas de caracteres. Permite acceder a

las variables de entorno.

* @return 0 si la ejecucion es correcta

*/

int main (int argc, char **argv, char **envp) {

int i ; /* Contador */

int imprimeAtributos(char *) ; /* Declaracion de funcion */


/*

* PASO 1. Analisis de la linea de ordenes

*/

if (argc < 2) {

fprintf(stderr, "Sintaxis: info fichero\n") ;

return(-1) ;

} /* if */

/*

* PASO 2. Invocacion de la funcion imprimeAtritutos()

*/

for (i = 1; i < argc; i++)

imprimeAtributos(argv[i]) ;

return 0 ;

} /* main */



/**

* @brief Imprime por pantalla los atributos de un fichero

* @param fichero Nombre del fichero

*

* Si el fichero cuyo nombre se pasa como argumento no existe, el programa

* termina devolviendo el valor -1

*/

int imprimeAtributos(char *fichero) {

struct stat atributos ; /* Variable usada en la llamada stat() */

int i ; /* Contador */


/*

* PASO 1. Invocacion de la llamada al sistema <code>stat()<\code}

*/

if (stat(fichero, &atributos) == -1) {

perror(fichero) ;

return(-1) ;

} /* if */


/*

* PASO 2. Impresion del nombre del fichero y su numero de inode

*/

printf("\n\n") ;

printf("Fichero : %s\n", fichero) ;

printf("Numero de inode: %d\n", atributos.st_ino) ;


/*

* PASO 3. Impresion del tipo del fichero

*/

printf("Tipo : ") ;

if (S_ISDIR(atributos.st_mode)) {

printf("directorio\n") ;

} /* if */

else if (S_ISREG(atributos.st_mode)) {

printf("regular\n") ;

} /* else if */

else if (S_ISCHR(atributos.st_mode)) {

printf("especial modo caracter\n") ;

} /* else if */

else if (S_ISBLK(atributos.st_mode)) {

printf("especial modo bloque\n") ;

} /* else */


/*

* PASO 4. Se comprueba si el bit 11 (Set User ID) esta activo

*/

if (atributos.st_mode & S_ISUID)

printf("bit 11 (Set User ID) activo\n") ;


/*

* PASO 5. Se comprueba si el bit 10 (Set Group ID) esta activo

*/

if (atributos.st_mode & S_ISGID)

printf("bit 10 (Set Group ID) activo\n") ;


/*

* PASO 6. Se comprueba si el bit 9 (Stiky bit) esta activo

*/

if (atributos.st_mode & S_ISVTX)

printf("bit 9 (Stiky bit) activo\n") ;


/*

* PASO 7. Impresion de los permisos del fichero

*/

printf("Permisos : ") ;

printf("0%o ", atributos.st_mode & 0777) ;

for (i = 0; i < 9; i++)

if (atributos.st_mode & (0400 >> i))

printf("%c", permisos[(8-i)%3]) ;

else

printf("-") ;

printf("\n") ;

/*

* PASO 8. Impresion del numero de enlaces "hard"

*/

printf("Enlaces : %d\n", atributos.st_nlink) ;

/*

* PASO 9. Impresion del UID y GID

*/

printf("User ID : %d\n", atributos.st_uid) ;

printf("Group ID : %d\n", atributos.st_gid) ;


/*

* PASO 10. Impresion de la longitud del fichero

*/

printf("Longitud : %d\n", atributos.st_size) ;


/*

* PASO 11. Impresion de la fecha de ultimo acceso,

* ultima modificacion y ultimo cambio en el estado del fichero

*/

printf("Fecha de ultimo acceso: %s", asctime(localtime(&atributos.st_atime)));

printf("Fecha de ultimo modificacion: %s",

asctime(localtime(&atributos.st_mtime))) ;

printf("Fecha de ultimo cambio de estado: %s",

asctime(localtime(&atributos.st_ctime))) ;

} /* imprimeAtributos */


Ahora bien, si lo que queremos es poner el texto con color, simplemente ponemos

    <font color="#numero_color">texto con el color deseado</font>

Un ejemplo de esto es:


/**

* @file dirtree.c.

* @author Juan Luis Ruiz Criado.

* @version 1.0.

* @date 11/04/07

* @brief Dado un directorio, muestra su contenido en forma de arbol. La sintaxis de invocacion es:

* %dirtree directorio [fichero]

* El argumento [fichero] indica el nombre del fichero al que habria que redireccionar la

* salida del programa.

*/


#include <fcntl.h>

#include <stdio.h>

#include <errno.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <dirent.h>

#include <string.h>


long int numDir = 0; //Variable que contabiliza el numero de directorios

long int numFiles = 0; //Variable que contabiliza el numero de ficheros

long int numLink = 0; //Variable que contabiliza el numero de links

long double tamFicheros = 0; //Variable que contabiliza el tamano total


/*Estructura para guardar el tamaño y nombre del fihcero menor*/

struct Menor{

float tamFicheroMenor;

char nombre[256];

}ficheroMenor;


/*Estructura para guardar el tamaño y nombre del fihcero mayor*/

struct Mayor{

float tamFicheroMayor;

char nombre[256];

}ficheroMayor;


/**

* @brief Función que calcula el valor en bytes, Kbytes o Mbytes, segun sea pertinente

* @param tam Tamaño que queremos convertir

* @param strtam Caracter que se le pasa por referencia para almacenar una B, K o M

* @return Devuelve el tamaño convertido

*

*/

double imprimirTamano(float tam, char * strtam){

double salida;

if(tam < 1024){ //Son bytes

salida = tam;

strcpy(strtam,"B");

}else if (tam >= 1024 && tam < 1048576){ //Son Kbytes

salida = tam/1024;

strcpy(strtam, "Kb");

}else { //Son Mbytes

salida = tam/1048576;

strcpy(strtam ,"Mb");

}

return salida;

}


/**

* @brief Procedimiento que muestra las estadisticas

*

*/

void mostrarEstadisticas(){

double tamMedio, tam; //Variables para guardar el tamano medio y el tamano convertido

char strTam[10]; //Array de caracteres para almacenar el caracter devuelto por imprimirTamano

tamMedio = tamFicheros/(numFiles*1024*1024);

printf("=============================================================\n");

printf("= =\n");

printf("= Estadisticas =\n");

printf("= =\n");

printf("=============================================================\n");

printf(" Numero de directorios: %d \n", numDir);

printf(" Numero de ficheros : %d \n", numFiles);

printf(" Numero de links: %d \n", numLink);

printf("=============================================================\n");

tam = imprimirTamano(ficheroMenor.tamFicheroMenor, strTam);

printf(" Fichero de menor tama\303\261o: \"%s\" con %f%s \n", ficheroMenor.nombre, tam, strTam);

tam = imprimirTamano(ficheroMayor.tamFicheroMayor, strTam);

printf(" Fichero de mayor tama\303\261o: \"%s\" con %f%s \n", ficheroMayor.nombre, tam, strTam);

printf(" Tama\303\261o medio: %f Mb \n", tamMedio);

printf("=============================================================\n");

}


/**

* @brief Procedimiento que imprime por pantalla tab tabulaciones

* @param tab Numero de tabulaciones a hacer

*

*/

void imprimirTab(int tab){

int i;

for (i =0; i <= tab; i++){

printf("\t");

}

}


/**

* @brief Procedimiento que abre el directorio nombreDir y va leyendo las entradas del mismo,

* clasificando las entradas en ficheros regulares, links o directorios, creando asi

* el arbol del directorio especificado

*

* @param nombreDir Nombre del directorio a hacer el arbol

* @param tab Numero de tabulaciones a hacer

*

* La sintaxis de invocacion es la siguiente:

* imprimrTab(nombre_dir, 0)

*/

void leerDirectorio(char * nombreDir, int tab){

char tipo; //Caracter donde se alamacena el tipo de fichero

char cwd[2048]; //Cadena de caracteres para almacenar el directorio actual

DIR * directorio; //Variable donde se devuelve la llamada a opendir()

struct dirent * est_dir; //Estructura donde devuelve la entrada leida

struct stat atributos; //Estructura donde se alamacenan los atributos del fichero

float tamano; //Tamano de un fichero

char strTam[20]; //Cadena de caracteres donde se alamacena la letra que acompana al tamano

int longitud; //Variable para almacenar la longitud de cwd

/*Abrimos el directorio nombreDir*/

directorio = opendir(nombreDir);

if (directorio == NULL){

fprintf(stderr, "leerDirectorio - No se pudo abrir el directorio \"%s\"", nombreDir);

perror("");

exit(-1);

}

/*Leemos las entradas del directorio*/

est_dir = readdir(directorio);

if (est_dir == NULL){

fprintf(stderr, "leerDirectorio - Hubo un error al leer en el directorio \"%s\"", nombreDir);

perror("");

exit(-1);

}

while (est_dir != NULL){

strcpy(cwd, nombreDir); //Copiamos nombreDir en cwd

longitud = strlen(cwd); //Guardamos la longitud de cwd

/*Ponemos una '/' al final si no la tiene*/

if (cwd[longitud-1] != '/'){ //Si el directorio introducido por primera vez no termina en '/'

strcat(cwd, "/"); //Concatenamos a cwd '/'

}

strcat(cwd, est_dir->d_name); //Concatenamos a cwd el nombre del fichero

/*Leemos los atributos del fichero*/

if (lstat(cwd, &atributos) == -1){

fprintf(stderr, "leerDirectorio - Error al acceder a los atributos de \"%s\" ", cwd);

perror("");

exit(-1);

}

//Ahora vemos si el fichero es un directorio, un fichero regular o un link

if (S_ISDIR(atributos.st_mode)){ //Es un directorio

tipo = 'd';

numDir++;

}else if (S_ISREG(atributos.st_mode)){ //Es un fichero regular

tipo = '-';

numFiles++;

tamFicheros += atributos.st_size; //Sumamos el tamaño del fichero al total

//El primer archivo es el menor!!!

if (ficheroMenor.tamFicheroMenor == 0){

ficheroMenor.tamFicheroMenor = atributos.st_size;

}

//Comparamos el tamaño para saber cual es el mayor y cual el menor

if (atributos.st_size < ficheroMenor.tamFicheroMenor){ //Es menor que el menor actual

ficheroMenor.tamFicheroMenor = atributos.st_size;

strcpy(ficheroMenor.nombre, est_dir->d_name);

}else if (atributos.st_size > ficheroMayor.tamFicheroMayor){ //Es mayor que el mayor actual

ficheroMayor.tamFicheroMayor = atributos.st_size;

strcpy(ficheroMayor.nombre, est_dir->d_name);

}

}else if (S_ISLNK(atributos.st_mode)){ //Es un link

tipo = 'l';

numLink++;

}

/*Imprimimos las tabulaciones*/

imprimirTab(tab);

/*Convertimos el tamano y obtenemos su letra*/

tamano = imprimirTamano(atributos.st_size, strTam);

/*Mostramos en pantalla la informacion del fichero*/

if (tipo == '-'){ //Si es regular

printf("%c %s %f %s\n", tipo, est_dir->d_name, tamano, strTam);

}else{ //Si es un directorio o un link

printf("%c %s\n", tipo, est_dir->d_name);

}

/*Leemos recursivamente un nuevo directorio*/

if ((tipo == 'd') && (strcmp(est_dir->d_name, ".")!= 0) && (strcmp(est_dir->d_name, "..") != 0)){

leerDirectorio(cwd, tab+1);

}

/*Leemos las entradas del directorio*/

est_dir = readdir(directorio);

}

/*Cerramos el directorio*/

closedir(directorio);

}


/**

* @brief Funcion principal del programa

* @param argc Numero de argumentos de la linea de ordenes, incluyendo

* el nombre del fichero ejecutable

* @param argv Puntero a un array de cadenas de caracteres. Permite acceder a

* la linea de ordenes

* @return 0 si la ejecucion es correcta, -1 si se ha producido un error

*

* La sintaxis de invocacion de programa es:

* <code> dirtree directorio [fichero]

*/

int main(int argc, char **argv){

int error;

//Analisis de la línea de comandos

if (argc < 2 || argc > 3){

fprintf(stderr, "Main - Sintaxis incorrecta: dirtree directorio [fichero]\n");

exit(-1);

}

//En caso de que queramos redireccionar la salida a un fichero

if (argc == 3){

printf("Redireccionando la salida al archivo %s\n", argv[2]);

close(1);

error = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0666);

if (error == -1){

fprintf(stderr, "Main - Hubo un error al abrir el archivo %s", argv[2]);

perror("");

exit(-1);

}

}

//Abrimos el directorio e imprimimos su contenido

leerDirectorio(argv[1], -1);

mostrarEstadisticas();

return 0;

}/*main*/

Si queremos modificar el alto o el ancho, debemos modificar los valores width (ancho) o heigth (alto) a nuestro antojo:

Con el siguiente código

    <pre style="border: 1px solid white; background-color: #ffffff; overflow: auto; width: 100%; height: 150px">Mensaje</pre>

obtenemos:


/**

* @file info.c

* @author Huang-Lû

* @version 1.0

* @date 12 Marzo 2007

* @brief Muestra el contenido del nodo-i de uno o varios ficheros

*

* La sintaxis de invocacion del programa es:

* <code> info fichero [fichero]* </code>

*/


#include <stdio.h>

#include <sys/types.h>

#include <sys/stat.h>


const char permisos[] = {'x', 'w', 'r'} ;


/**

* @brief Funcion principal del programa

* @param argc Numero de argumentos de la linea de ordenes, incluyendo

* el nombre del fichero ejecutable

* @param argv Puntero a un array de cadenas de caracteres. Permite acceder a

* la linea de ordenes

* @param envp Puntero a un array de cadenas de caracteres. Permite acceder a

las variables de entorno.

* @return 0 si la ejecucion es correcta

*/

int main (int argc, char **argv, char **envp) {

int i ; /* Contador */

int imprimeAtributos(char *) ; /* Declaracion de funcion */


/*

* PASO 1. Analisis de la linea de ordenes

*/

if (argc < 2) {

fprintf(stderr, "Sintaxis: info fichero\n") ;

return(-1) ;

} /* if */

/*

* PASO 2. Invocacion de la funcion imprimeAtritutos()

*/

for (i = 1; i < argc; i++)

imprimeAtributos(argv[i]) ;

return 0 ;

} /* main */



/**

* @brief Imprime por pantalla los atributos de un fichero

* @param fichero Nombre del fichero

*

* Si el fichero cuyo nombre se pasa como argumento no existe, el programa

* termina devolviendo el valor -1

*/

int imprimeAtributos(char *fichero) {

struct stat atributos ; /* Variable usada en la llamada stat() */

int i ; /* Contador */


/*

* PASO 1. Invocacion de la llamada al sistema <code>stat()<\code}

*/

if (stat(fichero, &atributos) == -1) {

perror(fichero) ;

return(-1) ;

} /* if */


/*

* PASO 2. Impresion del nombre del fichero y su numero de inode

*/

printf("\n\n") ;

printf("Fichero : %s\n", fichero) ;

printf("Numero de inode: %d\n", atributos.st_ino) ;


/*

* PASO 3. Impresion del tipo del fichero

*/

printf("Tipo : ") ;

if (S_ISDIR(atributos.st_mode)) {

printf("directorio\n") ;

} /* if */

else if (S_ISREG(atributos.st_mode)) {

printf("regular\n") ;

} /* else if */

else if (S_ISCHR(atributos.st_mode)) {

printf("especial modo caracter\n") ;

} /* else if */

else if (S_ISBLK(atributos.st_mode)) {

printf("especial modo bloque\n") ;

} /* else */


/*

* PASO 4. Se comprueba si el bit 11 (Set User ID) esta activo

*/

if (atributos.st_mode & S_ISUID)

printf("bit 11 (Set User ID) activo\n") ;


/*

* PASO 5. Se comprueba si el bit 10 (Set Group ID) esta activo

*/

if (atributos.st_mode & S_ISGID)

printf("bit 10 (Set Group ID) activo\n") ;


/*

* PASO 6. Se comprueba si el bit 9 (Stiky bit) esta activo

*/

if (atributos.st_mode & S_ISVTX)

printf("bit 9 (Stiky bit) activo\n") ;


/*

* PASO 7. Impresion de los permisos del fichero

*/

printf("Permisos : ") ;

printf("0%o ", atributos.st_mode & 0777) ;

for (i = 0; i < 9; i++)

if (atributos.st_mode & (0400 >> i))

printf("%c", permisos[(8-i)%3]) ;

else

printf("-") ;

printf("\n") ;

/*

* PASO 8. Impresion del numero de enlaces "hard"

*/

printf("Enlaces : %d\n", atributos.st_nlink) ;

/*

* PASO 9. Impresion del UID y GID

*/

printf("User ID : %d\n", atributos.st_uid) ;

printf("Group ID : %d\n", atributos.st_gid) ;


/*

* PASO 10. Impresion de la longitud del fichero

*/

printf("Longitud : %d\n", atributos.st_size) ;


/*

* PASO 11. Impresion de la fecha de ultimo acceso,

* ultima modificacion y ultimo cambio en el estado del fichero

*/

printf("Fecha de ultimo acceso: %s", asctime(localtime(&atributos.st_atime)));

printf("Fecha de ultimo modificacion: %s",

asctime(localtime(&atributos.st_mtime))) ;

printf("Fecha de ultimo cambio de estado: %s",

asctime(localtime(&atributos.st_ctime))) ;

} /* imprimeAtributos */


y con este otro código

    <pre style="border: 1px solid white; background-color: #ffffff; overflow: auto; width: 80%; height: 100px">Mensaje</pre>

obtenemos:


/**

* @file info.c

* @author Huang-Lû

* @version 1.0

* @date 12 Marzo 2007

* @brief Muestra el contenido del nodo-i de uno o varios ficheros

*

* La sintaxis de invocacion del programa es:

* <code> info fichero [fichero]* </code>

*/


#include <stdio.h>

#include <sys/types.h>

#include <sys/stat.h>


const char permisos[] = {'x', 'w', 'r'} ;


/**

* @brief Funcion principal del programa

* @param argc Numero de argumentos de la linea de ordenes, incluyendo

* el nombre del fichero ejecutable

* @param argv Puntero a un array de cadenas de caracteres. Permite acceder a

* la linea de ordenes

* @param envp Puntero a un array de cadenas de caracteres. Permite acceder a

las variables de entorno.

* @return 0 si la ejecucion es correcta

*/

int main (int argc, char **argv, char **envp) {

int i ; /* Contador */

int imprimeAtributos(char *) ; /* Declaracion de funcion */


/*

* PASO 1. Analisis de la linea de ordenes

*/

if (argc < 2) {

fprintf(stderr, "Sintaxis: info fichero\n") ;

return(-1) ;

} /* if */

/*

* PASO 2. Invocacion de la funcion imprimeAtritutos()

*/

for (i = 1; i < argc; i++)

imprimeAtributos(argv[i]) ;

return 0 ;

} /* main */



/**

* @brief Imprime por pantalla los atributos de un fichero

* @param fichero Nombre del fichero

*

* Si el fichero cuyo nombre se pasa como argumento no existe, el programa

* termina devolviendo el valor -1

*/

int imprimeAtributos(char *fichero) {

struct stat atributos ; /* Variable usada en la llamada stat() */

int i ; /* Contador */


/*

* PASO 1. Invocacion de la llamada al sistema <code>stat()<\code}

*/

if (stat(fichero, &atributos) == -1) {

perror(fichero) ;

return(-1) ;

} /* if */


/*

* PASO 2. Impresion del nombre del fichero y su numero de inode

*/

printf("\n\n") ;

printf("Fichero : %s\n", fichero) ;

printf("Numero de inode: %d\n", atributos.st_ino) ;


/*

* PASO 3. Impresion del tipo del fichero

*/

printf("Tipo : ") ;

if (S_ISDIR(atributos.st_mode)) {

printf("directorio\n") ;

} /* if */

else if (S_ISREG(atributos.st_mode)) {

printf("regular\n") ;

} /* else if */

else if (S_ISCHR(atributos.st_mode)) {

printf("especial modo caracter\n") ;

} /* else if */

else if (S_ISBLK(atributos.st_mode)) {

printf("especial modo bloque\n") ;

} /* else */


/*

* PASO 4. Se comprueba si el bit 11 (Set User ID) esta activo

*/

if (atributos.st_mode & S_ISUID)

printf("bit 11 (Set User ID) activo\n") ;


/*

* PASO 5. Se comprueba si el bit 10 (Set Group ID) esta activo

*/

if (atributos.st_mode & S_ISGID)

printf("bit 10 (Set Group ID) activo\n") ;


/*

* PASO 6. Se comprueba si el bit 9 (Stiky bit) esta activo

*/

if (atributos.st_mode & S_ISVTX)

printf("bit 9 (Stiky bit) activo\n") ;


/*

* PASO 7. Impresion de los permisos del fichero

*/

printf("Permisos : ") ;

printf("0%o ", atributos.st_mode & 0777) ;

for (i = 0; i < 9; i++)

if (atributos.st_mode & (0400 >> i))

printf("%c", permisos[(8-i)%3]) ;

else

printf("-") ;

printf("\n") ;

/*

* PASO 8. Impresion del numero de enlaces "hard"

*/

printf("Enlaces : %d\n", atributos.st_nlink) ;

/*

* PASO 9. Impresion del UID y GID

*/

printf("User ID : %d\n", atributos.st_uid) ;

printf("Group ID : %d\n", atributos.st_gid) ;


/*

* PASO 10. Impresion de la longitud del fichero

*/

printf("Longitud : %d\n", atributos.st_size) ;


/*

* PASO 11. Impresion de la fecha de ultimo acceso,

* ultima modificacion y ultimo cambio en el estado del fichero

*/

printf("Fecha de ultimo acceso: %s", asctime(localtime(&atributos.st_atime)));

printf("Fecha de ultimo modificacion: %s",

asctime(localtime(&atributos.st_mtime))) ;

printf("Fecha de ultimo cambio de estado: %s",

asctime(localtime(&atributos.st_ctime))) ;

} /* imprimeAtributos */


Category(s): General

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *