static void sl_base64_decode (void){ char* input, *in; BIO* bmem,* b64; SLang_BString_Type* output; int i, outlen; char nl[]="\n"; if (SLang_Num_Function_Args != 1 || SLang_pop_slstring(&in) == -1 ){ return; } /* For some reason, the input is required to have a newline at the end, doesn't matter how many, so tack one on here*/ input = SLang_concat_slstrings(in,nl); SLang_free_slstring(in); unsigned char* buff = (char*)malloc((int)strlen(input)+1); memset(buff,0,(int)strlen(input)); b64 = BIO_new(BIO_f_base64()); bmem = BIO_new_mem_buf(input,(int)strlen(input)); bmem = BIO_push(b64,bmem); outlen = BIO_read(bmem,buff,(int)strlen(input)); BIO_free_all(bmem); output = SLbstring_create(buff, outlen); SLang_push_bstring(output); SLang_free_slstring(input); SLbstring_free(output); free(buff); }
static int string_string_bin_op (int op, SLtype a_type, VOID_STAR ap, unsigned int na, SLtype b_type, VOID_STAR bp, unsigned int nb, VOID_STAR cp) { char *ic; char **a, **b, **c; unsigned int n, n_max; unsigned int da, db; (void) a_type; (void) b_type; if (na == 1) da = 0; else da = 1; if (nb == 1) db = 0; else db = 1; if (na > nb) n_max = na; else n_max = nb; a = (char **) ap; b = (char **) bp; if ((op != SLANG_NE) && (op != SLANG_EQ)) for (n = 0; n < n_max; n++) { if ((*a == NULL) || (*b == NULL)) { _pSLang_verror (SL_VARIABLE_UNINITIALIZED, "String element[%u] not initialized for binary operation", n); return -1; } a += da; b += db; } a = (char **) ap; b = (char **) bp; ic = (char *) cp; c = NULL; switch (op) { case SLANG_DIVIDE: case SLANG_MINUS: default: return 0; case SLANG_PLUS: /* Concat */ c = (char **) cp; for (n = 0; n < n_max; n++) { if (NULL == (c[n] = SLang_concat_slstrings (*a, *b))) goto return_error; a += da; b += db; } break; case SLANG_NE: for (n = 0; n < n_max; n++) { if ((*a == NULL) || (*b == NULL)) ic [n] = (*a != *b); else ic [n] = (*a != *b) && (0 != strcmp (*a, *b)); a += da; b += db; } break; case SLANG_GT: for (n = 0; n < n_max; n++) { ic [n] = (strcmp (*a, *b) > 0); a += da; b += db; } break; case SLANG_GE: for (n = 0; n < n_max; n++) { ic [n] = (strcmp (*a, *b) >= 0); a += da; b += db; } break; case SLANG_LT: for (n = 0; n < n_max; n++) { ic [n] = (strcmp (*a, *b) < 0); a += da; b += db; } break; case SLANG_LE: for (n = 0; n < n_max; n++) { ic [n] = (strcmp (*a, *b) <= 0); a += da; b += db; } break; case SLANG_EQ: for (n = 0; n < n_max; n++) { if ((*a == NULL) || (*b == NULL)) ic[n] = (*a == *b); else ic [n] = (*a == *b) || (strcmp (*a, *b) == 0); a += da; b += db; } break; } return 1; return_error: if (c != NULL) { unsigned int nn; for (nn = 0; nn < n; nn++) { SLang_free_slstring (c[nn]); c[nn] = NULL; } for (nn = n; nn < n_max; nn++) c[nn] = NULL; } return -1; }