1*0d6140beSAndroid Build Coastguard Worker /*
2*0d6140beSAndroid Build Coastguard Worker * This file is part of the flashrom project.
3*0d6140beSAndroid Build Coastguard Worker *
4*0d6140beSAndroid Build Coastguard Worker * Copyright (C) 2009-2010 Carl-Daniel Hailfinger
5*0d6140beSAndroid Build Coastguard Worker * Copyright (C) 2013 Stefan Tauner
6*0d6140beSAndroid Build Coastguard Worker *
7*0d6140beSAndroid Build Coastguard Worker * This program is free software; you can redistribute it and/or modify
8*0d6140beSAndroid Build Coastguard Worker * it under the terms of the GNU General Public License as published by
9*0d6140beSAndroid Build Coastguard Worker * the Free Software Foundation; either version 2 of the License, or
10*0d6140beSAndroid Build Coastguard Worker * (at your option) any later version.
11*0d6140beSAndroid Build Coastguard Worker *
12*0d6140beSAndroid Build Coastguard Worker * This program is distributed in the hope that it will be useful,
13*0d6140beSAndroid Build Coastguard Worker * but WITHOUT ANY WARRANTY; without even the implied warranty of
14*0d6140beSAndroid Build Coastguard Worker * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15*0d6140beSAndroid Build Coastguard Worker * GNU General Public License for more details.
16*0d6140beSAndroid Build Coastguard Worker */
17*0d6140beSAndroid Build Coastguard Worker
18*0d6140beSAndroid Build Coastguard Worker #include <ctype.h>
19*0d6140beSAndroid Build Coastguard Worker #include <stdlib.h>
20*0d6140beSAndroid Build Coastguard Worker #include <string.h>
21*0d6140beSAndroid Build Coastguard Worker #include "flash.h"
22*0d6140beSAndroid Build Coastguard Worker
23*0d6140beSAndroid Build Coastguard Worker /* Returns the minimum number of bits needed to represent the given address.
24*0d6140beSAndroid Build Coastguard Worker * FIXME: use mind-blowing implementation. */
address_to_bits(uint32_t addr)25*0d6140beSAndroid Build Coastguard Worker uint32_t address_to_bits(uint32_t addr)
26*0d6140beSAndroid Build Coastguard Worker {
27*0d6140beSAndroid Build Coastguard Worker unsigned int lzb = 0;
28*0d6140beSAndroid Build Coastguard Worker while (((1u << (31 - lzb)) & ~addr) != 0)
29*0d6140beSAndroid Build Coastguard Worker lzb++;
30*0d6140beSAndroid Build Coastguard Worker return 32 - lzb;
31*0d6140beSAndroid Build Coastguard Worker }
32*0d6140beSAndroid Build Coastguard Worker
bitcount(unsigned long a)33*0d6140beSAndroid Build Coastguard Worker unsigned int bitcount(unsigned long a)
34*0d6140beSAndroid Build Coastguard Worker {
35*0d6140beSAndroid Build Coastguard Worker unsigned int i = 0;
36*0d6140beSAndroid Build Coastguard Worker for (; a != 0; a >>= 1)
37*0d6140beSAndroid Build Coastguard Worker if (a & 1)
38*0d6140beSAndroid Build Coastguard Worker i++;
39*0d6140beSAndroid Build Coastguard Worker return i;
40*0d6140beSAndroid Build Coastguard Worker }
41*0d6140beSAndroid Build Coastguard Worker
max(int a,int b)42*0d6140beSAndroid Build Coastguard Worker int max(int a, int b)
43*0d6140beSAndroid Build Coastguard Worker {
44*0d6140beSAndroid Build Coastguard Worker return (a > b) ? a : b;
45*0d6140beSAndroid Build Coastguard Worker }
46*0d6140beSAndroid Build Coastguard Worker
min(int a,int b)47*0d6140beSAndroid Build Coastguard Worker int min(int a, int b)
48*0d6140beSAndroid Build Coastguard Worker {
49*0d6140beSAndroid Build Coastguard Worker return (a < b) ? a : b;
50*0d6140beSAndroid Build Coastguard Worker }
51*0d6140beSAndroid Build Coastguard Worker
strcat_realloc(char * dest,const char * src)52*0d6140beSAndroid Build Coastguard Worker char *strcat_realloc(char *dest, const char *src)
53*0d6140beSAndroid Build Coastguard Worker {
54*0d6140beSAndroid Build Coastguard Worker dest = realloc(dest, strlen(dest) + strlen(src) + 1);
55*0d6140beSAndroid Build Coastguard Worker if (!dest) {
56*0d6140beSAndroid Build Coastguard Worker msg_gerr("Out of memory!\n");
57*0d6140beSAndroid Build Coastguard Worker return NULL;
58*0d6140beSAndroid Build Coastguard Worker }
59*0d6140beSAndroid Build Coastguard Worker strcat(dest, src);
60*0d6140beSAndroid Build Coastguard Worker return dest;
61*0d6140beSAndroid Build Coastguard Worker }
62*0d6140beSAndroid Build Coastguard Worker
tolower_string(char * str)63*0d6140beSAndroid Build Coastguard Worker void tolower_string(char *str)
64*0d6140beSAndroid Build Coastguard Worker {
65*0d6140beSAndroid Build Coastguard Worker for (; *str != '\0'; str++)
66*0d6140beSAndroid Build Coastguard Worker *str = (char)tolower((unsigned char)*str);
67*0d6140beSAndroid Build Coastguard Worker }
68*0d6140beSAndroid Build Coastguard Worker
reverse_byte(uint8_t x)69*0d6140beSAndroid Build Coastguard Worker uint8_t reverse_byte(uint8_t x)
70*0d6140beSAndroid Build Coastguard Worker {
71*0d6140beSAndroid Build Coastguard Worker x = ((x >> 1) & 0x55) | ((x << 1) & 0xaa);
72*0d6140beSAndroid Build Coastguard Worker x = ((x >> 2) & 0x33) | ((x << 2) & 0xcc);
73*0d6140beSAndroid Build Coastguard Worker x = ((x >> 4) & 0x0f) | ((x << 4) & 0xf0);
74*0d6140beSAndroid Build Coastguard Worker
75*0d6140beSAndroid Build Coastguard Worker return x;
76*0d6140beSAndroid Build Coastguard Worker }
77*0d6140beSAndroid Build Coastguard Worker
reverse_bytes(uint8_t * dst,const uint8_t * src,size_t length)78*0d6140beSAndroid Build Coastguard Worker void reverse_bytes(uint8_t *dst, const uint8_t *src, size_t length)
79*0d6140beSAndroid Build Coastguard Worker {
80*0d6140beSAndroid Build Coastguard Worker size_t i;
81*0d6140beSAndroid Build Coastguard Worker
82*0d6140beSAndroid Build Coastguard Worker for (i = 0; i < length; i++)
83*0d6140beSAndroid Build Coastguard Worker dst[i] = reverse_byte(src[i]);
84*0d6140beSAndroid Build Coastguard Worker }
85*0d6140beSAndroid Build Coastguard Worker
86*0d6140beSAndroid Build Coastguard Worker /* FIXME: Find a better solution for MinGW. Maybe wrap strtok_s (C11) if it becomes available */
87*0d6140beSAndroid Build Coastguard Worker #ifdef __MINGW32__
strtok_r(char * str,const char * delim,char ** nextp)88*0d6140beSAndroid Build Coastguard Worker char* strtok_r(char *str, const char *delim, char **nextp)
89*0d6140beSAndroid Build Coastguard Worker {
90*0d6140beSAndroid Build Coastguard Worker if (str == NULL)
91*0d6140beSAndroid Build Coastguard Worker str = *nextp;
92*0d6140beSAndroid Build Coastguard Worker
93*0d6140beSAndroid Build Coastguard Worker str += strspn(str, delim); /* Skip leading delimiters */
94*0d6140beSAndroid Build Coastguard Worker if (*str == '\0')
95*0d6140beSAndroid Build Coastguard Worker return NULL;
96*0d6140beSAndroid Build Coastguard Worker
97*0d6140beSAndroid Build Coastguard Worker char *ret = str;
98*0d6140beSAndroid Build Coastguard Worker str += strcspn(str, delim); /* Find end of token */
99*0d6140beSAndroid Build Coastguard Worker if (*str != '\0')
100*0d6140beSAndroid Build Coastguard Worker *str++ = '\0';
101*0d6140beSAndroid Build Coastguard Worker
102*0d6140beSAndroid Build Coastguard Worker *nextp = str;
103*0d6140beSAndroid Build Coastguard Worker return ret;
104*0d6140beSAndroid Build Coastguard Worker }
105*0d6140beSAndroid Build Coastguard Worker
106*0d6140beSAndroid Build Coastguard Worker /* strndup is a POSIX function not present in MinGW */
strndup(const char * src,size_t maxlen)107*0d6140beSAndroid Build Coastguard Worker char *strndup(const char *src, size_t maxlen)
108*0d6140beSAndroid Build Coastguard Worker {
109*0d6140beSAndroid Build Coastguard Worker char *retbuf;
110*0d6140beSAndroid Build Coastguard Worker size_t len;
111*0d6140beSAndroid Build Coastguard Worker for (len = 0; len < maxlen; len++)
112*0d6140beSAndroid Build Coastguard Worker if (src[len] == '\0')
113*0d6140beSAndroid Build Coastguard Worker break;
114*0d6140beSAndroid Build Coastguard Worker if ((retbuf = malloc(1 + len)) != NULL) {
115*0d6140beSAndroid Build Coastguard Worker memcpy(retbuf, src, len);
116*0d6140beSAndroid Build Coastguard Worker retbuf[len] = '\0';
117*0d6140beSAndroid Build Coastguard Worker }
118*0d6140beSAndroid Build Coastguard Worker return retbuf;
119*0d6140beSAndroid Build Coastguard Worker }
120*0d6140beSAndroid Build Coastguard Worker #endif
121*0d6140beSAndroid Build Coastguard Worker
122*0d6140beSAndroid Build Coastguard Worker /* There is no strnlen in DJGPP */
123*0d6140beSAndroid Build Coastguard Worker #if defined(__DJGPP__) || (!defined(__LIBPAYLOAD__) && !defined(HAVE_STRNLEN))
strnlen(const char * str,size_t n)124*0d6140beSAndroid Build Coastguard Worker size_t strnlen(const char *str, size_t n)
125*0d6140beSAndroid Build Coastguard Worker {
126*0d6140beSAndroid Build Coastguard Worker size_t i;
127*0d6140beSAndroid Build Coastguard Worker for (i = 0; i < n && str[i] != '\0'; i++)
128*0d6140beSAndroid Build Coastguard Worker ;
129*0d6140beSAndroid Build Coastguard Worker return i;
130*0d6140beSAndroid Build Coastguard Worker }
131*0d6140beSAndroid Build Coastguard Worker #endif
132