+// -------------------------------------------------
+// More substring functions
+
+// get last n bytes, if available
+// getting the prefix is done by str_truncate, defined in the include file
+gs_retval_t str_suffix(vstring *result, vstring *s, gs_uint32_t n){
+ register gs_p_t st = (gs_p_t)s->offset;
+ int prefix = (n > s->length) ? 0 : s->length-n;
+ result->offset = st + prefix;
+ result->length = s->length-prefix;
+ result->reserved = SHALLOW_COPY;
+ return 0;
+}
+
+
+// Split the string on sep, get the i'th substring, if any
+gs_retval_t get_list_entry(vstring *result, vstring *l, vstring *sep, gs_uint32_t pos){
+ char s;
+ gs_int32_t c;
+
+ result->offset = l->offset; // empty return string
+ result->reserved = SHALLOW_COPY;
+ result->length = 0;
+
+ if(sep->length > 0){ // get the sep char, ensure the string is nonempty
+ s = ((gs_sp_t)(sep->offset))[0];
+ }else{
+ return 0;
+ }
+
+ for(c=0;c < l->length && pos>0; ++c){
+ if(((gs_sp_t)(l->offset))[c] == s){
+ pos--;
+ }
+ }
+
+ if(pos>0 || c >= l->length-1){ // not enough seps, or final string is empty
+ return 0;
+ }
+
+ result->offset = l->offset + c;
+ for(; c<l->length && ((gs_sp_t)(l->offset))[c] != s; ++c, ++result->length);
+
+ return 0;
+}
+
+
+// -------------------------------------------------