Wednesday, March 28, 2007

Restoring GRUB

Today I had to reinstall windows on a computer (sigh). On the same hard disk there were a Debian and a Gentoo installation too. Of course, reinstalling windows wiped away the grub boot loader (the root of grub is in the Debian installation).

So, in order to restore grub, I started with a Netinst Debian disk and typed rescue at the boot prompt.

This led me to a shell in the root directory of my Debian installation. I then cd to the directory /boot/grub, and entered grub with the command

grub --batch

without the --batch option I got an error complaining about a non supported terminal (bterm).

at the grub prompt I checked that the root directory was actually in /dev/hdb8:

find /boot/grub/stage1

and got the expected answer (hd0,7) (remember that disks and partitions in grub start from 0 and not from 1).

So I set the root for grub

root (hd0,7)

and installed grub on hd0

setup (hd0)

quit grub and reboot... argh... bad surprise: after the message saying that grub was loading, the screen went blank and couldn't load any operating system :-(

I then booted again with the Debian netinst floppy disk. This time I tried to create a grub disk: I cd into /boot/grub and:

dd if=stage1 of=/dev/fd0 bs=512 count=1
dd if=stage2 of=/dev/fd0 bs=512 seek=1

then booted with this disk. I then got a grub prompt, and tried to reinstall grub from there (using the same steps above).

It worked!!! :-)

This time my grub menu was back and can boot all the operating systems I have.

Tuesday, March 27, 2007

Dealing with Flex generated scanner memory

I've been using Flex, a tool for generating scanners (tokenizers), for a while now, and I never worried about memory management of the C scanners it generates: I thought memory would be handled automatically, i.e., freed when the scanner finished its execution.

Actually, this is not the case: you have to deal with it yourself! If you don't you will end up with a memory leak of about 16k (see also the manual); you can use valgrind to check this.

Basically, all you have to do is to call yy_delete_buffer when the scanning is over. For instance, when you reach the end of file. Here's what I do in my flex scanners:

<<EOF>> {
/* For non-reentrant C scanner only. */
yy_delete_buffer(YY_CURRENT_BUFFER);

yyterminate();
}

Unfortunately, you'll still experience a memory leak of about 4 bytes, and this looks like a bug. Hope it will be fixed soon...

Friday, March 23, 2007

GNU Source-highlight 2.6

I've recently released the new version of GNU Source-highlight, http://www.gnu.org/software/src-highlite, which, given a source file, produces a document with syntax highlighting.

The main novelties are:

  • I've added language definitions for Makefiles, m4 and CSS.
  • In style files you can specify a color in double quotes meaning that that colro will be inserted in the output without any translation
  • In style files you can specify the formatting options for more than one element on the same line, by separating the elements with commas, e.g.,
    time, file darkblue b ;
  • In the style file you can also specify the background color for each element (not all the output formats support background colors; e.g., XHTML and LaTeX with colors support it, but plain HTML does not).
    todo black bg:cyan b;
    This formats todo elements in black with a cyan background
  • The background color for the entire output document can be specified in the style file
    bgcolor "white";
  • Furthermore, the main novelty, is that you can use a CSS file as a style file so that source-highlight will use its formatting specification to produce the output (independently from HTML); thus, instead of using
    --style-file=mystyle.style
    you can use
    --style-css-file=mystyle.css
    So that the same CSS file can be used either as a standard CSS file in a (X)HTML document, or as the style file for formatting in any format with source-highlight.
In order to show this last new feature, I inserted many CSS files (adapted from the SHJS project). Moreover, I've used all these CSS file to generate some examples; these examples are formatted in XHTML (the output does not use the CSS: the XHTML output contains direct formatting for all elements, and these elements are formatted by using the color and other style specifications taken from the CSS file).

This is the entire file (~400k) with all these examples.

../src/default.css


/*
This is a classical Hello program
to test source-highlight with Java programs.

to have an html translation type

source-highlight -s java -f html --input Hello.java --output Hello.html
source-highlight -s java -f html < Hello.java > Hello.html

or type source-highlight --help for the list of options

written by
Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite
*/

package hello;

import java.io.* ;

/**
* <p>
* A simple Hello World class, used to demonstrate some
* features of Java source highlighting.
* </p>
* TODO: nothing, just to show an highlighted TODO or FIXME
*
* @author Lorenzo Bettini
* @version 2.0
*/
public class Hello {
int foo = 1998 ;
int hex_foo = 0xCAFEBABE;
boolean b = false;
Integer i = null ;
char c = '\'', d = 'n', e = '\\' ;
String xml = "<tag attr=\"value\">&auml;</tag>", foo2 = "\\" ;

public static void main( String args[] ) {
// just some greetings ;-) /*
System.out.println( "Hello from java2html :-)" ) ;
System.out.println( "\tby Lorenzo Bettini" ) ;
System.out.println( "\thttp://www.lorenzobettini.it" ) ;
if (argc > 0)
String param = argc[0];
//System.out.println( "bye bye... :-D" ) ; // see you soon
}
}

mono.css


/*
This is a classical Hello program
to test source-highlight with Java programs.

to have an html translation type

source-highlight -s java -f html --input Hello.java --output Hello.html
source-highlight -s java -f html < Hello.java > Hello.html

or type source-highlight --help for the list of options

written by
Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite
*/

package hello;

import java.io.* ;

/**
* <p>
* A simple Hello World class, used to demonstrate some
* features of Java source highlighting.
* </p>
* TODO: nothing, just to show an highlighted TODO or FIXME
*
* @author Lorenzo Bettini
* @version 2.0
*/
public class Hello {
int foo = 1998 ;
int hex_foo = 0xCAFEBABE;
boolean b = false;
Integer i = null ;
char c = '\'', d = 'n', e = '\\' ;
String xml = "<tag attr=\"value\">&auml;</tag>", foo2 = "\\" ;

public static void main( String args[] ) {
// just some greetings ;-) /*
System.out.println( "Hello from java2html :-)" ) ;
System.out.println( "\tby Lorenzo Bettini" ) ;
System.out.println( "\thttp://www.lorenzobettini.it" ) ;
if (argc > 0)
String param = argc[0];
//System.out.println( "bye bye... :-D" ) ; // see you soon
}
}

mono-alt.css


/*
This is a classical Hello program
to test source-highlight with Java programs.

to have an html translation type

source-highlight -s java -f html --input Hello.java --output Hello.html
source-highlight -s java -f html < Hello.java > Hello.html

or type source-highlight --help for the list of options

written by
Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite
*/

package hello;

import java.io.* ;

/**
* <p>
* A simple Hello World class, used to demonstrate some
* features of Java source highlighting.
* </p>
* TODO: nothing, just to show an highlighted TODO or FIXME
*
* @author Lorenzo Bettini
* @version 2.0
*/
public class Hello {
int foo = 1998 ;
int hex_foo = 0xCAFEBABE;
boolean b = false;
Integer i = null ;
char c = '\'', d = 'n', e = '\\' ;
String xml = "<tag attr=\"value\">&auml;</tag>", foo2 = "\\" ;

public static void main( String args[] ) {
// just some greetings ;-) /*
System.out.println( "Hello from java2html :-)" ) ;
System.out.println( "\tby Lorenzo Bettini" ) ;
System.out.println( "\thttp://www.lorenzobettini.it" ) ;
if (argc > 0)
String param = argc[0];
//System.out.println( "bye bye... :-D" ) ; // see you soon
}
}

sh_golden.css


/*
This is a classical Hello program
to test source-highlight with Java programs.

to have an html translation type

source-highlight -s java -f html --input Hello.java --output Hello.html
source-highlight -s java -f html < Hello.java > Hello.html

or type source-highlight --help for the list of options

written by
Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite
*/

package hello;

import java.io.* ;

/**
* <p>
* A simple Hello World class, used to demonstrate some
* features of Java source highlighting.
* </p>
* TODO: nothing, just to show an highlighted TODO or FIXME
*
* @author Lorenzo Bettini
* @version 2.0
*/
public class Hello {
int foo = 1998 ;
int hex_foo = 0xCAFEBABE;
boolean b = false;
Integer i = null ;
char c = '\'', d = 'n', e = '\\' ;
String xml = "<tag attr=\"value\">&auml;</tag>", foo2 = "\\" ;

public static void main( String args[] ) {
// just some greetings ;-) /*
System.out.println( "Hello from java2html :-)" ) ;
System.out.println( "\tby Lorenzo Bettini" ) ;
System.out.println( "\thttp://www.lorenzobettini.it" ) ;
if (argc > 0)
String param = argc[0];
//System.out.println( "bye bye... :-D" ) ; // see you soon
}
}

sh_night.css


/*
This is a classical Hello program
to test source-highlight with Java programs.

to have an html translation type

source-highlight -s java -f html --input Hello.java --output Hello.html
source-highlight -s java -f html < Hello.java > Hello.html

or type source-highlight --help for the list of options

written by
Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite
*/

package hello;

import java.io.* ;

/**
* <p>
* A simple Hello World class, used to demonstrate some
* features of Java source highlighting.
* </p>
* TODO: nothing, just to show an highlighted TODO or FIXME
*
* @author Lorenzo Bettini
* @version 2.0
*/
public class Hello {
int foo = 1998 ;
int hex_foo = 0xCAFEBABE;
boolean b = false;
Integer i = null ;
char c = '\'', d = 'n', e = '\\' ;
String xml = "<tag attr=\"value\">&auml;</tag>", foo2 = "\\" ;

public static void main( String args[] ) {
// just some greetings ;-) /*
System.out.println( "Hello from java2html :-)" ) ;
System.out.println( "\tby Lorenzo Bettini" ) ;
System.out.println( "\thttp://www.lorenzobettini.it" ) ;
if (argc > 0)
String param = argc[0];
//System.out.println( "bye bye... :-D" ) ; // see you soon
}
}

sh_greenlcd.css


/*
This is a classical Hello program
to test source-highlight with Java programs.

to have an html translation type

source-highlight -s java -f html --input Hello.java --output Hello.html
source-highlight -s java -f html < Hello.java > Hello.html

or type source-highlight --help for the list of options

written by
Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite
*/

package hello;

import java.io.* ;

/**
* <p>
* A simple Hello World class, used to demonstrate some
* features of Java source highlighting.
* </p>
* TODO: nothing, just to show an highlighted TODO or FIXME
*
* @author Lorenzo Bettini
* @version 2.0
*/
public class Hello {
int foo = 1998 ;
int hex_foo = 0xCAFEBABE;
boolean b = false;
Integer i = null ;
char c = '\'', d = 'n', e = '\\' ;
String xml = "<tag attr=\"value\">&auml;</tag>", foo2 = "\\" ;

public static void main( String args[] ) {
// just some greetings ;-) /*
System.out.println( "Hello from java2html :-)" ) ;
System.out.println( "\tby Lorenzo Bettini" ) ;
System.out.println( "\thttp://www.lorenzobettini.it" ) ;
if (argc > 0)
String param = argc[0];
//System.out.println( "bye bye... :-D" ) ; // see you soon
}
}

sh_ide-eclipse.css


/*
This is a classical Hello program
to test source-highlight with Java programs.

to have an html translation type

source-highlight -s java -f html --input Hello.java --output Hello.html
source-highlight -s java -f html < Hello.java > Hello.html

or type source-highlight --help for the list of options

written by
Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite
*/

package hello;

import java.io.* ;

/**
* <p>
* A simple Hello World class, used to demonstrate some
* features of Java source highlighting.
* </p>
* TODO: nothing, just to show an highlighted TODO or FIXME
*
* @author Lorenzo Bettini
* @version 2.0
*/
public class Hello {
int foo = 1998 ;
int hex_foo = 0xCAFEBABE;
boolean b = false;
Integer i = null ;
char c = '\'', d = 'n', e = '\\' ;
String xml = "<tag attr=\"value\">&auml;</tag>", foo2 = "\\" ;

public static void main( String args[] ) {
// just some greetings ;-) /*
System.out.println( "Hello from java2html :-)" ) ;
System.out.println( "\tby Lorenzo Bettini" ) ;
System.out.println( "\thttp://www.lorenzobettini.it" ) ;
if (argc > 0)
String param = argc[0];
//System.out.println( "bye bye... :-D" ) ; // see you soon
}
}

sh_kwrite.css


/*
This is a classical Hello program
to test source-highlight with Java programs.

to have an html translation type

source-highlight -s java -f html --input Hello.java --output Hello.html
source-highlight -s java -f html < Hello.java > Hello.html

or type source-highlight --help for the list of options

written by
Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite
*/

package hello;

import java.io.* ;

/**
* <p>
* A simple Hello World class, used to demonstrate some
* features of Java source highlighting.
* </p>
* TODO: nothing, just to show an highlighted TODO or FIXME
*
* @author Lorenzo Bettini
* @version 2.0
*/
public class Hello {
int foo = 1998 ;
int hex_foo = 0xCAFEBABE;
boolean b = false;
Integer i = null ;
char c = '\'', d = 'n', e = '\\' ;
String xml = "<tag attr=\"value\">&auml;</tag>", foo2 = "\\" ;

public static void main( String args[] ) {
// just some greetings ;-) /*
System.out.println( "Hello from java2html :-)" ) ;
System.out.println( "\tby Lorenzo Bettini" ) ;
System.out.println( "\thttp://www.lorenzobettini.it" ) ;
if (argc > 0)
String param = argc[0];
//System.out.println( "bye bye... :-D" ) ; // see you soon
}
}

sh_easter.css


/*
This is a classical Hello program
to test source-highlight with Java programs.

to have an html translation type

source-highlight -s java -f html --input Hello.java --output Hello.html
source-highlight -s java -f html < Hello.java > Hello.html

or type source-highlight --help for the list of options

written by
Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite
*/

package hello;

import java.io.* ;

/**
* <p>
* A simple Hello World class, used to demonstrate some
* features of Java source highlighting.
* </p>
* TODO: nothing, just to show an highlighted TODO or FIXME
*
* @author Lorenzo Bettini
* @version 2.0
*/
public class Hello {
int foo = 1998 ;
int hex_foo = 0xCAFEBABE;
boolean b = false;
Integer i = null ;
char c = '\'', d = 'n', e = '\\' ;
String xml = "<tag attr=\"value\">&auml;</tag>", foo2 = "\\" ;

public static void main( String args[] ) {
// just some greetings ;-) /*
System.out.println( "Hello from java2html :-)" ) ;
System.out.println( "\tby Lorenzo Bettini" ) ;
System.out.println( "\thttp://www.lorenzobettini.it" ) ;
if (argc > 0)
String param = argc[0];
//System.out.println( "bye bye... :-D" ) ; // see you soon
}
}

sh_emacs.css


/*
This is a classical Hello program
to test source-highlight with Java programs.

to have an html translation type

source-highlight -s java -f html --input Hello.java --output Hello.html
source-highlight -s java -f html < Hello.java > Hello.html

or type source-highlight --help for the list of options

written by
Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite
*/

package hello;

import java.io.* ;

/**
* <p>
* A simple Hello World class, used to demonstrate some
* features of Java source highlighting.
* </p>
* TODO: nothing, just to show an highlighted TODO or FIXME
*
* @author Lorenzo Bettini
* @version 2.0
*/
public class Hello {
int foo = 1998 ;
int hex_foo = 0xCAFEBABE;
boolean b = false;
Integer i = null ;
char c = '\'', d = 'n', e = '\\' ;
String xml = "<tag attr=\"value\">&auml;</tag>", foo2 = "\\" ;

public static void main( String args[] ) {
// just some greetings ;-) /*
System.out.println( "Hello from java2html :-)" ) ;
System.out.println( "\tby Lorenzo Bettini" ) ;
System.out.println( "\thttp://www.lorenzobettini.it" ) ;
if (argc > 0)
String param = argc[0];
//System.out.println( "bye bye... :-D" ) ; // see you soon
}
}

sh_neon.css


/*
This is a classical Hello program
to test source-highlight with Java programs.

to have an html translation type

source-highlight -s java -f html --input Hello.java --output Hello.html
source-highlight -s java -f html < Hello.java > Hello.html

or type source-highlight --help for the list of options

written by
Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite
*/

package hello;

import java.io.* ;

/**
* <p>
* A simple Hello World class, used to demonstrate some
* features of Java source highlighting.
* </p>
* TODO: nothing, just to show an highlighted TODO or FIXME
*
* @author Lorenzo Bettini
* @version 2.0
*/
public class Hello {
int foo = 1998 ;
int hex_foo = 0xCAFEBABE;
boolean b = false;
Integer i = null ;
char c = '\'', d = 'n', e = '\\' ;
String xml = "<tag attr=\"value\">&auml;</tag>", foo2 = "\\" ;

public static void main( String args[] ) {
// just some greetings ;-) /*
System.out.println( "Hello from java2html :-)" ) ;
System.out.println( "\tby Lorenzo Bettini" ) ;
System.out.println( "\thttp://www.lorenzobettini.it" ) ;
if (argc > 0)
String param = argc[0];
//System.out.println( "bye bye... :-D" ) ; // see you soon
}
}

sh_desert.css


/*
This is a classical Hello program
to test source-highlight with Java programs.

to have an html translation type

source-highlight -s java -f html --input Hello.java --output Hello.html
source-highlight -s java -f html < Hello.java > Hello.html

or type source-highlight --help for the list of options

written by
Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite
*/

package hello;

import java.io.* ;

/**
* <p>
* A simple Hello World class, used to demonstrate some
* features of Java source highlighting.
* </p>
* TODO: nothing, just to show an highlighted TODO or FIXME
*
* @author Lorenzo Bettini
* @version 2.0
*/
public class Hello {
int foo = 1998 ;
int hex_foo = 0xCAFEBABE;
boolean b = false;
Integer i = null ;
char c = '\'', d = 'n', e = '\\' ;
String xml = "<tag attr=\"value\">&auml;</tag>", foo2 = "\\" ;

public static void main( String args[] ) {
// just some greetings ;-) /*
System.out.println( "Hello from java2html :-)" ) ;
System.out.println( "\tby Lorenzo Bettini" ) ;
System.out.println( "\thttp://www.lorenzobettini.it" ) ;
if (argc > 0)
String param = argc[0];
//System.out.println( "bye bye... :-D" ) ; // see you soon
}
}


Lots and lots of colors! :-)