+
+
+/* Parse nickname string. The format may be <num>!<nickname>@<server> to
+ support multiple same nicknames. The <num> is the final unifier if same
+ nickname is on same server. Note, this is only local format and server
+ does not know anything about these. */
+
+int silc_client_parse_nickname(char *string, char **nickname, char **server,
+ unsigned int *num)
+{
+ unsigned int tlen;
+ char tmp[256];
+
+ if (!string)
+ return FALSE;
+
+ if (strchr(string, '!')) {
+ tlen = strcspn(string, "!");
+ memset(tmp, 0, sizeof(tmp));
+ memcpy(tmp, string, tlen);
+
+ if (num)
+ *num = atoi(tmp);
+
+ if (tlen >= strlen(string))
+ return FALSE;
+
+ string += tlen + 1;
+ }
+
+ if (strchr(string, '@')) {
+ tlen = strcspn(string, "@");
+
+ if (nickname) {
+ *nickname = silc_calloc(tlen + 1, sizeof(char));
+ memcpy(*nickname, string, tlen);
+ }
+
+ if (server) {
+ *server = silc_calloc(strlen(string) - tlen, sizeof(char));
+ memcpy(*server, string + tlen + 1, strlen(string) - tlen - 1);
+ }
+ } else {
+ if (nickname)
+ *nickname = strdup(string);
+ }
+
+ return TRUE;
+}