⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 seewbmp.c

📁 The Kannel Open Source WAP and SMS gateway works as both an SMS gateway, for implementing keyword b
💻 C
字号:
/* ====================================================================  * The Kannel Software License, Version 1.0  *  * Copyright (c) 2001-2004 Kannel Group   * Copyright (c) 1998-2001 WapIT Ltd.    * All rights reserved.  *  * Redistribution and use in source and binary forms, with or without  * modification, are permitted provided that the following conditions  * are met:  *  * 1. Redistributions of source code must retain the above copyright  *    notice, this list of conditions and the following disclaimer.  *  * 2. Redistributions in binary form must reproduce the above copyright  *    notice, this list of conditions and the following disclaimer in  *    the documentation and/or other materials provided with the  *    distribution.  *  * 3. The end-user documentation included with the redistribution,  *    if any, must include the following acknowledgment:  *       "This product includes software developed by the  *        Kannel Group (http://www.kannel.org/)."  *    Alternately, this acknowledgment may appear in the software itself,  *    if and wherever such third-party acknowledgments normally appear.  *  * 4. The names "Kannel" and "Kannel Group" must not be used to  *    endorse or promote products derived from this software without  *    prior written permission. For written permission, please   *    contact org@kannel.org.  *  * 5. Products derived from this software may not be called "Kannel",  *    nor may "Kannel" appear in their name, without prior written  *    permission of the Kannel Group.  *  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE  * DISCLAIMED.  IN NO EVENT SHALL THE KANNEL GROUP OR ITS CONTRIBUTORS  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,   * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT   * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR   * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,   * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE   * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,   * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  * ====================================================================  *  * This software consists of voluntary contributions made by many  * individuals on behalf of the Kannel Group.  For more information on   * the Kannel Group, please see <http://www.kannel.org/>.  *  * Portions of this software are based upon software originally written at   * WapIT Ltd., Helsinki, Finland for the Kannel project.   */ /* seebmp -- simple viewer for WBMP images (image/vnd.wap.wbmp) *//* *  * Copyright (c) Richard Braakman <dark@xs4all.nl> * All rights reserved. *  * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. *  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. *  */#include <stdio.h>#include <stddef.h>#include <stdlib.h>#include <string.h>/* The spec includes a multi-byte integer format.  For reasons of simplicity, we * only handle integers that end up fitting in 31 bits.  This limits picture * sizes to about 2 billion pixels width or height, which I think we can live * with. *//* The function returns -1 in case of an error. */static long get_mbi(FILE *infile) {	int c;	long result = 0;	do {		c = getc(infile);		if (c < 0) return -1;		result = (result << 7) | (c & 0x7f);	} while (c & 0x80);	return result;}/* This function is like get_mbi, but it ignores the value of the result. * So it's not limited to 31 bits, and it ends up skipping all bytes that * have their high bit set. *//* The function returns 0 for success, or -1 in case of an error. */static int skip_mbi(FILE *infile) {	int c;	do {		c = getc(infile);		if (c < 0) return -1;	} while (c & 0x80);	return 0;}static int show_image_from_file(char *bmpname, FILE *bmpfile,			long width, long height) {	long w, h;	for (h = 0; h < height; h++) {		/* w is incremented in its inner loop */		for (w = 0; w < width; ) {			int c;			unsigned int bit;			c = getc(bmpfile);			if (c < 0) {				perror(bmpname);				return -1;			}			for (bit = 0x80; bit > 0 && w < width; bit >>= 1, w++) {				putc((c & bit) ? '*' : ' ', stdout);			}		}		putc('\n', stdout);	}	return 0;}/* These are global because that's easier.  In a real parser they would * be part of an image descriptor structure */struct parm {	struct parm *next;	char *name;	char *value;};struct parm *extparms = NULL;static void clear_extparms(void) {	while (extparms) {		struct parm *tmp = extparms;		extparms = extparms->next;		free(tmp->name);		free(tmp->value);		free(tmp);	}}/* Record a new parameter.  The name and value will be used directly, * not copied. */static int new_extparm(char *name, char *value) {	struct parm *new;	struct parm *p;		/* Construct a new node */	new = (struct parm *)malloc(sizeof(struct parm));	if (!new)		return -1;	new->name = name;	new->value = value;	new->next = NULL;	/* Add it to the end of the list. */	if (!extparms) {		extparms = new;	} else {		p = extparms;		while (p->next) { 			p = p->next;		}		p->next = new;	}	return 0;}static void print_extparms(FILE *outfile) {	struct parm *p;	for (p = extparms; p; p = p->next) {		fprintf(outfile, "%s=%s\n", p->name, p->value);	}}static int parse_headers(FILE *bmpfile) {	int c;	int exttype;	clear_extparms();	c = getc(bmpfile);	if (c < 0) return -1;	if (!(c & 0x80)) {		/* No extension headers follow */		return 0;	}	exttype = (c >> 5) & 0x03;	/* None of these headers do much at this time, but they	 * might be meaningful with later specifications */	switch (exttype) {		case 0: 			/* All we know of type 0 headers is that			 * the high bit is a continuation bit.			 * That makes them exactly like an MBI. */			if (skip_mbi(bmpfile) < 0) return -1;			break;		case 1: case 2:			/* We don't know what to do with these */			return -1;		case 3:			/* A sequence of parameter/value combinations */			do {				int namelen, valuelen;				char *name, *value;				c = getc(bmpfile);				if (c < 0) return -1;				namelen = (c >> 4) & 0x07;				name = malloc(namelen + 1);				if (!name) return -1;				if (fread(name, namelen, 1, bmpfile) < (size_t) namelen)					return -1;				valuelen = c & 0x0f;				value = malloc(valuelen + 1);				if (!value) { free(name); return -1; }				if (fread(value, valuelen, 1, bmpfile) < (size_t) valuelen)					return -1;							new_extparm(name, value);			} while (c & 0x80);			break;	}	return 0;}/* Return 0 for success, < 0 for failure */static int show_wbmp_from_file(char *bmpname, FILE *bmpfile) {	long typefield;	long width, height;	typefield = get_mbi(bmpfile);	if (typefield < 0) {		perror(bmpname);		return -1;	}	if (parse_headers(bmpfile) < 0) {		fprintf(stderr, "%s: format error in headers\n", bmpname);		return -1;	}		width = get_mbi(bmpfile);	height = get_mbi(bmpfile);	if (width < 0 || height < 0) {		fprintf(stderr, "%s: error reading height and width\n",			bmpname);		return -1;	}	switch (typefield) {		case 0:			printf("%s, %ldx%ld B/W bitmap, no compression\n",				bmpname, width, height);			print_extparms(stdout);			if (show_image_from_file(bmpname, bmpfile,						width, height) < 0) {				return -1;			}			break;		default:			fprintf(stderr, "%s: cannot handle level %ld wbmp\n",				bmpname, typefield);			return -1;	}	return 0;}int main(int argc, char *argv[]) {	int i;	/* 1 means an I/O error.  No other error values are used yet. */	int exitvalue = 0;	if (argc > 1) {		for (i = 1; i < argc; i++) {			FILE *bmpfile;			bmpfile = fopen(argv[i], "r");			if (bmpfile) {				if (show_wbmp_from_file(argv[i], bmpfile) < 0) {					/* We've already reported the error */					exitvalue = 1;				}				if (fclose(bmpfile) < 0) {					perror(argv[i]);					exitvalue = 1;				}			} else {				perror(argv[i]);				exitvalue = 1;			}			if (i < argc - 1) {				/* more files follow -- separate them */				printf("\n");			}		}	} else {		/* No files specified -- read from standard input */		if (show_wbmp_from_file("stdin", stdin)) {			exitvalue = 1;		}	}	return exitvalue;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -