/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#include "plstr.h"

PR_IMPLEMENT(char*)
PL_strtok_r(char* s1, const char* s2, char** lasts) {
  const char* sepp;
  int c, sc;
  char* tok;

  if (s1 == NULL) {
    if (*lasts == NULL) {
      return NULL;
    }

    s1 = *lasts;
  }

  for (; (c = *s1) != 0; s1++) {
    for (sepp = s2; (sc = *sepp) != 0; sepp++) {
      if (c == sc) {
        break;
      }
    }
    if (sc == 0) {
      break;
    }
  }

  if (c == 0) {
    *lasts = NULL;
    return NULL;
  }

  tok = s1++;

  for (; (c = *s1) != 0; s1++) {
    for (sepp = s2; (sc = *sepp) != 0; sepp++) {
      if (c == sc) {
        *s1++ = '\0';
        *lasts = s1;
        return tok;
      }
    }
  }
  *lasts = NULL;
  return tok;
}
