ESP8266 ILI9341 display support code with printf sources, wire-frame viewer and custom fonts  1.0
ESP8266ILI9341DisplayProject
stringsup.c
Go to the documentation of this file.
1 
24 #include "user_config.h"
25 
26 #include <string.h>
27 #include "lib/stringsup.h"
28 
29 // =============================================
32 void sep()
33 {
34  printf("==============================\n");
35 }
36 
37 // =============================================
38 // Character functions
39 // =============================================
40 
41 // =============================================
46 int
48 isdigit(int c)
49 {
50  if(c >= '0' && c <= '9')
51  return(1);
52  return(0);
53 }
54 
55 // =============================================
62 int
64 isupper(int c)
65 {
66  if(c >= 'A' && c <= 'Z')
67  return(1);
68  return(0);
69 }
70 
71 // =============================================
72 //@brief Is a character lower case
78 int
80 islower(int c)
81 {
82  if(c >= 'a' && c <= 'z')
83  return(1);
84  return(0);
85 }
86 
87 // =============================================
94 int
96 tolower(int c)
97 {
98  if(isupper(c))
99  return(c - 'A' + 'a');
100  return(c);
101 }
102 
103 // =============================================
109 MEMSPACE
110 int
111 WEAK_ATR
112 toupper(int c)
113 {
114  if(islower(c))
115  return(c - 'a' + 'A');
116  return(c);
117 }
118 
124 MEMSPACE
125 void *memchr(const void *str, int c, size_t size)
126 {
127  const uint8_t *ptr = str;
128  while(size--)
129  {
130  if (*ptr++ == (uint8_t) c)
131  return (void *) (ptr - 1);
132  }
133  return NULL;
134 }
135 
136 // =============================================
137 // String functions
138 // =============================================
139 // =============================================
143 MEMSPACE
144 size_t
145 WEAK_ATR
146 strlen(const char *str)
147 {
148  int len=0;
149  // String length
150  while(*str++)
151  ++len;
152  return(len);
153 }
154 
159 MEMSPACE
160  WEAK_ATR char *
161 strcpy(char *dest, const char *src)
162 {
163  char *ptr = dest;
164  while(*src)
165  {
166  *ptr++ = *src++;
167  }
168  *ptr ++ = 0;
169  return (ptr);
170 }
171 
177 MEMSPACE
178  WEAK_ATR
179 char * strncpy(char *dest, const char *src, size_t size)
180 {
181  char *ptr = dest;
182  while(*src && size)
183  {
184  *ptr++ = *src++;
185  size--;
186  }
187  while(size--)
188  *ptr++ = 0;
189  return (dest);
190 }
191 
192 
197 MEMSPACE
198 WEAK_ATR
199 char * strcat(char *dest, const char *src)
200 {
201  char *ptr = dest;
202  while(*ptr)
203  ++ptr;
204  strcpy(ptr,src);
205  return(dest);
206 }
207 
212 MEMSPACE
213 WEAK_ATR
214 char * strncat(char *dest, const char *src, size_t max)
215 {
216  char *ptr = dest;
217  while(*ptr)
218  ++ptr;
219  strncpy(ptr,src,max);
220  return(dest);
221 }
222 
223 // =============================================
228 MEMSPACE
229 void
230 WEAK_ATR
231 reverse(char *str)
232 {
233  char temp;
234  int i;
235  int len = strlen(str);
236  // Reverse
237  // We only exchange up to half way
238  for (i = 0; i < (len >> 1); i++)
239  {
240  temp = str[len - i - 1];
241  str[len - i - 1] = str[i];
242  str[i] = temp;
243  }
244 }
245 
246 // =============================================
250 MEMSPACE
251 void
252 WEAK_ATR
253 strupper(char *str)
254 {
255  while(*str)
256  {
257  *str = toupper(*str);
258  ++str;
259  }
260 }
261 
262 
263 // =============================================
270 MEMSPACE
271 void trim_tail(char *str)
272 {
273  int len = strlen(str);
274  while(len--)
275  {
276  if(str[len] > ' ')
277  break;
278  str[len] = 0;
279  }
280 }
281 
282 // =============================================
288 MEMSPACE
289 char *skipspaces(char *ptr)
290 {
291  if(!ptr)
292  return(ptr);
293 
294  while(*ptr == ' ' || *ptr == '\t')
295  ++ptr;
296  return(ptr);
297 }
298 
299 // =============================================
305 MEMSPACE
306 char *nextspace(char *ptr)
307 {
308  if(!ptr)
309  return(ptr);
310 
311  while(*ptr)
312  {
313  if(*ptr == ' ' || *ptr == '\t')
314  break;
315  ++ptr;
316  }
317  return(ptr);
318 }
319 
320 // =============================================
327 MEMSPACE
328 char *skipchars(char *str, char *pat)
329 {
330  char *base;
331  if(!str)
332  return(str);
333 
334  while(*str)
335  {
336  base = pat;
337  while(*base)
338  {
339  if(*base == *str)
340  break;
341  ++base;
342  }
343  if(*base != *str)
344  return(str);
345  ++str;
346  }
347  return(str);
348 }
349 
350 // =============================================
351 // String Matching
352 // =============================================
359 MEMSPACE
360 int
361 WEAK_ATR
362 strcmp(const char *str, const char *pat)
363 {
364  int ret = 0;
365  int c1,c2;
366  while (1)
367  {
368  c1 = *str++;
369  c2 = *pat++;
370  if ( (ret = c1 - c2) != 0 || c2 == 0)
371  break;
372  }
373  return(ret);
374 }
375 
376 // =============================================
383 MEMSPACE
384 int
385 WEAK_ATR
386 strncmp(const char *str, const char *pat, size_t len)
387 {
388  int ret = 0;
389  int c1,c2;
390  while (len--)
391  {
392  c1 = *str++;
393  c2 = *pat++;
394  if ( (ret = c1 - c2) != 0 || c2 == 0)
395  break;
396  }
397  return(ret);
398 }
399 
400 // =============================================
407 MEMSPACE
408 int
409 WEAK_ATR
410 strcasecmp(const char *str, const char *pat)
411 {
412  int ret = 0;
413  int c1,c2;
414  while (1)
415  {
416  c1 = toupper(*str++);
417  c2 = toupper(*pat++);
418  if ( (ret = c1 - c2) != 0 || c2 == 0)
419  break;
420  }
421  return(ret);
422 }
429 MEMSPACE
430 int
431 WEAK_ATR
432 strncasecmp(const char *str, const char *pat, size_t len)
433 {
434  int ret = 0;
435  int c1,c2;
436  while (len--)
437  {
438  c1 = toupper(*str++);
439  c2 = toupper(*pat++);
440  if ( (ret = c1 - c2) != 0 || c2 == 0)
441  break;
442  }
443  return(ret);
444 }
445 
446 // =============================================
454 MEMSPACE
455 int MATCH(char *str, char *pat)
456 {
457  int len;
458  len = strlen(pat);
459  if(strcmp(str,pat) == 0 )
460  return(len);
461  return(0);
462 }
470 MEMSPACE
471 int MATCHARGS(char *str, char *pat, int min, int argc)
472 {
473  if(MATCH(str,pat))
474  {
475  if(argc >= min)
476  return(1);
477  else
478  printf("%s expected %d arguments only got %d\n", pat, min,argc);
479  }
480  return(0);
481 }
482 
483 
484 // =============================================
492 MEMSPACE
493 int MATCHI(char *str, char *pat)
494 {
495  int len;
496  len = strlen(pat);
497  if(strcasecmp(str,pat) == 0 )
498  return(len);
499  return(0);
500 }
501 // =============================================
510 MEMSPACE
511 int MATCH_LEN(char *str, char *pat)
512 {
513  int len;
514 
515  if(!str || !pat)
516  return(0);
517  len = strlen(pat);
518 
519  if( len )
520  {
521  if(strncmp(str,pat,len) == 0 )
522  return(len);
523  }
524  return(0);
525 }
526 
527 // =============================================
536 MEMSPACE
537 int MATCHI_LEN(char *str, char *pat)
538 {
539  int len;
540 
541  if(!str || !pat)
542  return(0);
543  len = strlen(pat);
544 
545  if( len )
546  {
547  if(strncasecmp(str,pat,len) == 0 )
548  return(len);
549  }
550  return(0);
551 }
552 
553 // =============================================
565 MEMSPACE
566 int split_args(char *str, char *argv[], int max)
567 {
568  int i;
569  int count = 0;
570  // NULL ?
571 
572  for(i=0;i<max;++i)
573  argv[i] = NULL;
574 
575  // You may replace argv[0]
576  // argv[count++] = "main";
577 
578  if(!max)
579  return(0);
580 
581  if(!str)
582  return(0);
583 
584  while(*str && count < max)
585  {
586  str = skipspaces(str);
587  if(!*str)
588  break;
589 
590  // string processing
591  if(*str == '"')
592  {
593  ++str;
594  // Save string pointer
595  argv[count++] = str;
596  while(*str && *str != '"')
597  ++str;
598  if(*str == '"')
599  *str++ = 0;
600  continue;
601  }
602 
603  argv[count++] = str;
604  // Find size of token
605  while(*str > ' ' && *str <= 0x7e)
606  ++str;
607  if(!*str)
608  break;
609  *str = 0;
610  ++str;
611  }
612  return(count);
613 }
614 
615 // =============================================
627 MEMSPACE
628 char *get_token(char *str, char *token, int max)
629 {
630  int len;
631 
632  *token = 0;
633 
634  // NULL ?
635  if(!str)
636  return(NULL);
637 
638  str = skipspaces(str);
639 
640  // Find size of token
641  len = 0;
642  while(*str > ' ' && *str <= 0x7e && len < max)
643  {
644  // clip token to max length
645  if(len < max)
646  {
647  *token++ = *str++;
648  ++len;
649  }
650  }
651  *token = 0;
652  // str points past the token
653  if(!len)
654  return(NULL);
655  return(str);
656 }
657 
658 
659 // =============================================
669 
670 MEMSPACE
671 int token(char *str, char *pat)
672 {
673  int patlen;
674  int len;
675  char *ptr;
676 
677  ptr = skipspaces(str);
678  len = 0;
679  while(*ptr > ' ' && *ptr <= 0x7e )
680  {
681  ++len;
682  ++ptr;
683  }
684 
685  if(!len)
686  return(0);
687 
688  patlen = strlen(pat);
689 
690  if(len != patlen)
691  return(0);
692 
693  if(strncmp(str,pat,patlen) == 0)
694  return(len);
695  return(0);
696 }
697 // =============================================
698 
705 MEMSPACE
706 int32_t get_value(char *str)
707 {
708  int base;
709  int ret;
710  char *ptr;
711  char *endptr;
712 
713 
714  ptr = skipspaces(str);
715  base = 10;
716 
717  // convert number base 10, 16, 8 and 2
718  if( (ret = MATCHI_LEN(ptr,"0x")) )
719  {
720  base = 16;
721  ptr += ret;
722  }
723  else if( (ret = MATCHI_LEN(ptr,"0o")) )
724  {
725  base = 8;
726  ptr += ret;
727  }
728  else if( (ret = MATCHI_LEN(ptr,"0b")) )
729  {
730  base = 2;
731  ptr += ret;
732  }
733  return(strtol(ptr, (char **)&endptr, base));
734 }
735 
736 // =============================================
737 // String memory allocation functions
738 // =============================================
739 // =============================================
748 
749 MEMSPACE
750 char *strnalloc(char *str, int len)
751 {
752  char *ptr;
753 
754  if(!str)
755  return(NULL);
756  ptr = safecalloc(len+1,1);
757  if(!ptr)
758  return(ptr);
759  strncpy(ptr,str,len);
760  return(ptr);
761 
762 }
763 
764 // =============================================
773 MEMSPACE
774 char *stralloc(char *str)
775 {
776  char *ptr;
777  int len;
778 
779  if(!str)
780  return(str);;
781  len = strlen(str);
782  ptr = safecalloc(len+1,1);
783  if(!ptr)
784  return(ptr);
785  strcpy(ptr,str);
786  return(ptr);
787 }
788 
789 
790 
int int32_t
MEMSPACE WEAK_ATR char * strcat(char *dest, const char *src)
Append string.
Definition: stringsup.c:199
MEMSPACE WEAK_ATR char * strncat(char *dest, const char *src, size_t max)
Append string of at most N bytes from src.
Definition: stringsup.c:214
MEMSPACE int WEAK_ATR strcmp(const char *str, const char *pat)
Compare two strings.
Definition: stringsup.c:362
MEMSPACE size_t WEAK_ATR strlen(const char *str)
String Length.
Definition: stringsup.c:146
Master include file for project Includes all project includes and defines here.
MEMSPACE int MATCH_LEN(char *str, char *pat)
Compare two strings limted to length of pattern.
Definition: stringsup.c:511
MEMSPACE int MATCH(char *str, char *pat)
Compare two strings.
Definition: stringsup.c:455
MEMSPACE int WEAK_ATR strncmp(const char *str, const char *pat, size_t len)
Compare two strings maximum len bytes in size.
Definition: stringsup.c:386
MEMSPACE WEAK_ATR char * strncpy(char *dest, const char *src, size_t size)
copy a string of at most N characters
Definition: stringsup.c:179
MEMSPACE char * get_token(char *str, char *token, int max)
return next token
Definition: stringsup.c:628
MEMSPACE int WEAK_ATR strcasecmp(const char *str, const char *pat)
Compare two strings without case.
Definition: stringsup.c:410
MEMSPACE int split_args(char *str, char *argv[], int max)
Split string into arguments stored in argv[] We split source string into arguments Warning: source st...
Definition: stringsup.c:566
MEMSPACE WEAK_ATR char * strcpy(char *dest, const char *src)
copy a string
Definition: stringsup.c:161
MEMSPACE int WEAK_ATR isupper(int c)
Is a character upper case.
Definition: stringsup.c:64
MEMSPACE char * skipchars(char *str, char *pat)
Skip characters defined in user string.
Definition: stringsup.c:328
#define NULL
Definition: cpu.h:55
MEMSPACE void trim_tail(char *str)
Trim White space and control characters from end of string.
Definition: stringsup.c:271
MEMSPACE int MATCHI_LEN(char *str, char *pat)
Compare two strings without case limted to length of pattern.
Definition: stringsup.c:537
MEMSPACE int token(char *str, char *pat)
Search for token in a string matching user pattern.
Definition: stringsup.c:671
MEMSPACE int WEAK_ATR tolower(int c)
Convert character to lower case, only if it is upper case.
Definition: stringsup.c:96
MEMSPACE char * nextspace(char *ptr)
Skip to first white space in a string - tabs and spaces.
Definition: stringsup.c:306
MEMSPACE int WEAK_ATR strncasecmp(const char *str, const char *pat, size_t len)
Compare two strings without case maximum len bytes in size.
Definition: stringsup.c:432
MEMSPACE int WEAK_ATR toupper(int c)
Convert character to upper case, only if it is lower case.
Definition: stringsup.c:112
MEMSPACE int32_t get_value(char *str)
get a number
Definition: stringsup.c:706
MEMSPACE long strtol(const char *nptr, char **endptr, int base)
Convert ASCII string to number in a given base.
Definition: mathio.c:136
Various string and character functions.
#define MEMSPACE
Definition: cpu.h:25
MEMSPACE int WEAK_ATR isdigit(int c)
test if a character is a digit
Definition: stringsup.c:48
MEMSPACE int printf(const char *format,...)
#define WEAK_ATR
Definition: stringsup.h:33
MEMSPACE int MATCHARGS(char *str, char *pat, int min, int argc)
Match two strings and compare argument index Display message if the number of arguments is too few...
Definition: stringsup.c:471
MEMSPACE void * memchr(const void *str, int c, size_t size)
find a character in a string of maximum size
Definition: stringsup.c:125
MEMSPACE int MATCHI(char *str, char *pat)
Compare two strings without case.
Definition: stringsup.c:493
MEMSPACE char * stralloc(char *str)
Allocate space for string.
Definition: stringsup.c:774
unsigned char uint8_t
Definition: send.c:17
MEMSPACE void WEAK_ATR strupper(char *str)
UPPERCASE a string.
Definition: stringsup.c:253
MEMSPACE int WEAK_ATR islower(int c)
Definition: stringsup.c:80
MEMSPACE void WEAK_ATR reverse(char *str)
Reverse a string in place Example: abcdef -> fedcba.
Definition: stringsup.c:231
MEMSPACE char * strnalloc(char *str, int len)
Allocate space for string with maximum size.
Definition: stringsup.c:750
MEMSPACE void * safecalloc(size_t nmemb, size_t size)
Safe Calloc - Display Error message if Calloc fails.
Definition: system.c:128
MEMSPACE char * skipspaces(char *ptr)
Skip white space in a string - tabs and spaces.
Definition: stringsup.c:289
MEMSPACE void sep()
print seperator
Definition: stringsup.c:32