|
@@ -0,0 +1,110 @@
|
|
|
+/*
|
|
|
+ *$Id$
|
|
|
+ *
|
|
|
+ * - various general purpose functions
|
|
|
+ */
|
|
|
+
|
|
|
+#ifndef ut_h
|
|
|
+#define ut_h
|
|
|
+
|
|
|
+#include "dprint.h"
|
|
|
+
|
|
|
+/* converts a str to an u. short, returns the u. short and sets *err on
|
|
|
+ * error and if err!=null
|
|
|
+ * */
|
|
|
+static inline unsigned short str2s(unsigned char* str, unsigned int len,
|
|
|
+ int *err)
|
|
|
+{
|
|
|
+ unsigned short ret;
|
|
|
+ int i;
|
|
|
+ unsigned char *limit;
|
|
|
+ unsigned char *init;
|
|
|
+
|
|
|
+ /*init*/
|
|
|
+ ret=i=0;
|
|
|
+ limit=str+len;
|
|
|
+ init=str;
|
|
|
+
|
|
|
+ for(;str<limit ;str++){
|
|
|
+ if ( (*str <= '9' ) && (*str >= '0') ){
|
|
|
+ ret=ret*10+*str-'0';
|
|
|
+ i++;
|
|
|
+ if (i>5) goto error_digits;
|
|
|
+ }else{
|
|
|
+ //error unknown char
|
|
|
+ goto error_char;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (err) *err=0;
|
|
|
+ return ret;
|
|
|
+
|
|
|
+error_digits:
|
|
|
+ DBG("str2s: ERROR: too many letters in [%s]\n", init);
|
|
|
+ if (err) *err=1;
|
|
|
+ return 0;
|
|
|
+error_char:
|
|
|
+ DBG("str2s: ERROR: unexpected char %c in %s\n", *str, init);
|
|
|
+ if (err) *err=1;
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+/* converts a str to an ipv4 address, returns the address and sets *err
|
|
|
+ * if error and err!=null
|
|
|
+ */
|
|
|
+static inline unsigned int str2ip(unsigned char* str, unsigned int len,
|
|
|
+ int * err)
|
|
|
+{
|
|
|
+ unsigned int ret;
|
|
|
+ int i;
|
|
|
+ unsigned char *limit;
|
|
|
+ unsigned char *init;
|
|
|
+
|
|
|
+ /*init*/
|
|
|
+ ret=i=0;
|
|
|
+ limit=str+len;
|
|
|
+ init=str;
|
|
|
+
|
|
|
+ for(;str<limit ;str++){
|
|
|
+ if (*str=='.'){
|
|
|
+ i++;
|
|
|
+ if (i>3) goto error_dots;
|
|
|
+ }else if ( (*str <= '9' ) && (*str >= '0') ){
|
|
|
+ ((unsigned char*)&ret)[i]=((unsigned char*)&ret)[i]*10+
|
|
|
+ *str-'0';
|
|
|
+ }else{
|
|
|
+ //error unknown char
|
|
|
+ goto error_char;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (err) *err=0;
|
|
|
+ return ret;
|
|
|
+
|
|
|
+error_dots:
|
|
|
+ DBG("str2ip: ERROR: too many dots in [%s]\n", init);
|
|
|
+ if (err) *err=1;
|
|
|
+ return 0;
|
|
|
+error_char:
|
|
|
+ DBG("str2ip: ERROR: unexpected char %c in %s\n", *str, init);
|
|
|
+ if (err) *err=1;
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+/* faster memchr version */
|
|
|
+
|
|
|
+static inline char* q_memchr(char* p, int c, unsigned int size)
|
|
|
+{
|
|
|
+ char* end;
|
|
|
+
|
|
|
+ end=p+size;
|
|
|
+ for(;p<end;p++){
|
|
|
+ if (*p==(unsigned char)c) return p;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+#endif
|