/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at usr/src/OPENSOLARIS.LICENSE. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END */ #pragma ident "%Z%%M% %I% %E% SMI" /* * Copyright 2005 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ #include extern int _error(int do_perror, char *fmt, ...); #define NO_PERROR 0 #define PERROR 1 /* * Icon loader for eeprom command. * * Based on libsuntool/icon/icon_load.c 10.10 88/02/08 * See for icon file format. */ int loadlogo(char *name, int w, int h, char *logo) { FILE *f; int c = 0; unsigned int val; int icw = 64, ich = 64, bits = 16; int count; if (!(f = fopen(name, "r"))) return (_error(PERROR, "cannot open %s", name)); do { int nval; char slash; if ((c = fscanf(f, "%*[^DFHVW*]")) == EOF) break; switch (c = getc(f)) { case 'D': if ((c = fscanf(f, "epth=%d", &nval)) == 1 && nval != 1) goto badform; break; case 'F': if ((c = fscanf(f, "ormat_version=%d", &nval)) == 1 && nval != 1) goto badform; break; case 'H': c = fscanf(f, "eight=%d", &ich); break; case 'V': c = fscanf(f, "alid_bits_per_item=%d", &bits); break; case 'W': c = fscanf(f, "idth=%d", &icw); break; case '*': c = fscanf(f, "%c", &slash); if (slash == '/') goto eoh; /* end of header */ else (void) ungetc(slash, f); break; } } while (c != EOF); eoh: if (c == EOF || icw != w || ich != h || bits != 16 && bits != 32) { badform: (void) fclose(f); return (_error(NO_PERROR, "header format error in %s", name)); } for (count = ((w + (bits - 1)) / bits) * h; count > 0; count--) { c = fscanf(f, " 0x%x,", &val); if (c == 0 || c == EOF) break; switch (bits) { case 32: *logo++ = val >> 24; *logo++ = val >> 16; /* FALLTHRU */ case 16: *logo++ = val >> 8; *logo++ = val; break; } } (void) fclose(f); if (count > 0) return (_error(NO_PERROR, "data format error in %s", name)); return (0); }