Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

#include <u.h>
#include <libc.h>
#include <draw.h>
#include <memdraw.h>
#include <ctype.h>
#include <bio.h>
#include "imagefile.h"

void
usage(void)
{
        fprint(2, "usage: toppm [-c 'comment'] [file]\n");
        exits("usage");
}

void
main(int argc, char *argv[])
{
        Biobuf bout;
        Memimage *i, *ni;
        int fd;
        char buf[256];
        char *err, *comment;

        comment = nil;
        ARGBEGIN{
        case 'c':
                comment = ARGF();
                if(comment == nil)
                        usage();
                if(strchr(comment, '\n') != nil){
                        fprint(2, "ppm: comment cannot contain newlines\n");
                        usage();
                }
                break;
        default:
                usage();
        }ARGEND

        if(argc > 1)
                usage();

        if(Binit(&bout, 1, OWRITE) < 0)
                sysfatal("Binit failed: %r");

        memimageinit();

        err = nil;

        if(argc == 0){
                i = readmemimage(0);
                if(i == nil)
                        sysfatal("reading input: %r");
                ni = memmultichan(i);
                if(ni == nil)
                        sysfatal("converting image to RGBV: %r");
                if(i != ni){
                        freememimage(i);
                        i = ni;
                }
                if(err == nil)
                        err = memwriteppm(&bout, i, comment);
        }else{
                fd = open(argv[0], OREAD);
                if(fd < 0)
                        sysfatal("can't open %s: %r", argv[0]);
                i = readmemimage(fd);
                if(i == nil)
                        sysfatal("can't readimage %s: %r", argv[0]);
                close(fd);
                ni = memmultichan(i);
                if(ni == nil)
                        sysfatal("converting image to RGBV: %r");
                if(i != ni){
                        freememimage(i);
                        i = ni;
                }
                if(comment)
                        err = memwriteppm(&bout, i, comment);
                else{
                        snprint(buf, sizeof buf, "Converted by Plan 9 from %s", argv[0]);
                        err = memwriteppm(&bout, i, buf);
                }
                freememimage(i);
        }

        if(err != nil)
                fprint(2, "toppm: %s\n", err);
        exits(err);
}