1*ae115bc7Smrj /* 2*ae115bc7Smrj * CDDL HEADER START 3*ae115bc7Smrj * 4*ae115bc7Smrj * The contents of this file are subject to the terms of the 5*ae115bc7Smrj * Common Development and Distribution License, Version 1.0 only 6*ae115bc7Smrj * (the "License"). You may not use this file except in compliance 7*ae115bc7Smrj * with the License. 8*ae115bc7Smrj * 9*ae115bc7Smrj * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10*ae115bc7Smrj * or http://www.opensolaris.org/os/licensing. 11*ae115bc7Smrj * See the License for the specific language governing permissions 12*ae115bc7Smrj * and limitations under the License. 13*ae115bc7Smrj * 14*ae115bc7Smrj * When distributing Covered Code, include this CDDL HEADER in each 15*ae115bc7Smrj * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16*ae115bc7Smrj * If applicable, add the following below this CDDL HEADER, with the 17*ae115bc7Smrj * fields enclosed by brackets "[]" replaced with your own identifying 18*ae115bc7Smrj * information: Portions Copyright [yyyy] [name of copyright owner] 19*ae115bc7Smrj * 20*ae115bc7Smrj * CDDL HEADER END 21*ae115bc7Smrj */ 22*ae115bc7Smrj #pragma ident "%Z%%M% %I% %E% SMI" 23*ae115bc7Smrj 24*ae115bc7Smrj 25*ae115bc7Smrj /* 26*ae115bc7Smrj * Copyright 2005 Sun Microsystems, Inc. All rights reserved. 27*ae115bc7Smrj * Use is subject to license terms. 28*ae115bc7Smrj */ 29*ae115bc7Smrj 30*ae115bc7Smrj #include <stdio.h> 31*ae115bc7Smrj 32*ae115bc7Smrj extern int _error(int do_perror, char *fmt, ...); 33*ae115bc7Smrj #define NO_PERROR 0 34*ae115bc7Smrj #define PERROR 1 35*ae115bc7Smrj 36*ae115bc7Smrj /* 37*ae115bc7Smrj * Icon loader for eeprom command. 38*ae115bc7Smrj * 39*ae115bc7Smrj * Based on libsuntool/icon/icon_load.c 10.10 88/02/08 40*ae115bc7Smrj * See <suntool/icon_load.h> for icon file format. 41*ae115bc7Smrj */ 42*ae115bc7Smrj 43*ae115bc7Smrj int 44*ae115bc7Smrj loadlogo(char *name, int w, int h, char *logo) 45*ae115bc7Smrj { 46*ae115bc7Smrj FILE *f; 47*ae115bc7Smrj int c = 0; 48*ae115bc7Smrj unsigned int val; 49*ae115bc7Smrj int icw = 64, ich = 64, bits = 16; 50*ae115bc7Smrj int count; 51*ae115bc7Smrj 52*ae115bc7Smrj if (!(f = fopen(name, "r"))) 53*ae115bc7Smrj return (_error(PERROR, "cannot open %s", name)); 54*ae115bc7Smrj 55*ae115bc7Smrj do { 56*ae115bc7Smrj int nval; 57*ae115bc7Smrj char slash; 58*ae115bc7Smrj 59*ae115bc7Smrj if ((c = fscanf(f, "%*[^DFHVW*]")) == EOF) 60*ae115bc7Smrj break; 61*ae115bc7Smrj 62*ae115bc7Smrj switch (c = getc(f)) { 63*ae115bc7Smrj case 'D': 64*ae115bc7Smrj if ((c = fscanf(f, "epth=%d", &nval)) == 1 && 65*ae115bc7Smrj nval != 1) 66*ae115bc7Smrj goto badform; 67*ae115bc7Smrj break; 68*ae115bc7Smrj case 'F': 69*ae115bc7Smrj if ((c = fscanf(f, "ormat_version=%d", &nval)) == 1 && 70*ae115bc7Smrj nval != 1) 71*ae115bc7Smrj goto badform; 72*ae115bc7Smrj break; 73*ae115bc7Smrj case 'H': 74*ae115bc7Smrj c = fscanf(f, "eight=%d", &ich); 75*ae115bc7Smrj break; 76*ae115bc7Smrj case 'V': 77*ae115bc7Smrj c = fscanf(f, "alid_bits_per_item=%d", &bits); 78*ae115bc7Smrj break; 79*ae115bc7Smrj case 'W': 80*ae115bc7Smrj c = fscanf(f, "idth=%d", &icw); 81*ae115bc7Smrj break; 82*ae115bc7Smrj case '*': 83*ae115bc7Smrj c = fscanf(f, "%c", &slash); 84*ae115bc7Smrj if (slash == '/') 85*ae115bc7Smrj goto eoh; /* end of header */ 86*ae115bc7Smrj else 87*ae115bc7Smrj (void) ungetc(slash, f); 88*ae115bc7Smrj break; 89*ae115bc7Smrj } 90*ae115bc7Smrj } while (c != EOF); 91*ae115bc7Smrj 92*ae115bc7Smrj eoh: 93*ae115bc7Smrj if (c == EOF || 94*ae115bc7Smrj icw != w || ich != h || 95*ae115bc7Smrj bits != 16 && bits != 32) { 96*ae115bc7Smrj badform: 97*ae115bc7Smrj (void) fclose(f); 98*ae115bc7Smrj return (_error(NO_PERROR, "header format error in %s", name)); 99*ae115bc7Smrj } 100*ae115bc7Smrj 101*ae115bc7Smrj for (count = ((w + (bits - 1)) / bits) * h; count > 0; count--) { 102*ae115bc7Smrj c = fscanf(f, " 0x%x,", &val); 103*ae115bc7Smrj if (c == 0 || c == EOF) 104*ae115bc7Smrj break; 105*ae115bc7Smrj 106*ae115bc7Smrj switch (bits) { 107*ae115bc7Smrj case 32: 108*ae115bc7Smrj *logo++ = val >> 24; 109*ae115bc7Smrj *logo++ = val >> 16; 110*ae115bc7Smrj /* FALLTHRU */ 111*ae115bc7Smrj case 16: 112*ae115bc7Smrj *logo++ = val >> 8; 113*ae115bc7Smrj *logo++ = val; 114*ae115bc7Smrj break; 115*ae115bc7Smrj } 116*ae115bc7Smrj } 117*ae115bc7Smrj 118*ae115bc7Smrj (void) fclose(f); 119*ae115bc7Smrj 120*ae115bc7Smrj if (count > 0) 121*ae115bc7Smrj return (_error(NO_PERROR, "data format error in %s", name)); 122*ae115bc7Smrj 123*ae115bc7Smrj return (0); 124*ae115bc7Smrj } 125