From 0a785ccdb71ee823a8e84b69c8ae1da592741101 Mon Sep 17 00:00:00 2001
From: obarun <eric@obarun.org>
Date: Fri, 26 Apr 2019 14:48:59 +1100
Subject: [PATCH] split instance function

---
 src/lib66/instance.c | 145 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 145 insertions(+)
 create mode 100644 src/lib66/instance.c

diff --git a/src/lib66/instance.c b/src/lib66/instance.c
new file mode 100644
index 00000000..06f56e1f
--- /dev/null
+++ b/src/lib66/instance.c
@@ -0,0 +1,145 @@
+/* 
+ * instance.c
+ * 
+ * Copyright (c) 2018-2019 Eric Vidal <eric@obarun.org>
+ * 
+ * All rights reserved.
+ * 
+ * This file is part of Obarun. It is subject to the license terms in
+ * the LICENSE file found in the top-level directory of this
+ * distribution.
+ * This file may not be copied, modified, propagated, or distributed
+ * except according to the terms contained in the LICENSE file./
+ */
+
+#include <66/utils.h>
+
+#include <string.h>
+
+#include <oblibs/error2.h>
+#include <oblibs/files.h>
+#include <oblibs/string.h>
+#include <oblibs/stralist.h>
+#include <oblibs/directory.h>
+
+#include <skalibs/stralloc.h>
+#include <skalibs/djbunix.h>
+
+int insta_replace(stralloc *sa,char const *src,char const *cpy)
+{
+	
+	int curr, count ;
+	
+	if (!src || !*src) return 0;
+	
+	size_t len = strlen(src) ;
+	size_t clen= strlen(cpy) ;
+			
+	curr = count = 0 ;
+	for(int i = 0; (size_t)i < len;i++)
+		if (src[i] == '@')
+			count++ ;
+		
+	size_t resultlen = len + (clen * count) ;
+	char result[resultlen + 1 ] ;
+	
+	for(int i = 0; (size_t)i < len;i++)
+	{
+		if (src[i] == '@')
+		{
+			
+			if (((size_t)i + 1) == len) break ;
+			if (src[i + 1] == 'I')
+			{
+				memcpy(result + curr,cpy,clen) ;
+				curr = curr + clen;
+				i = i + 2 ;
+			}
+		}
+		result[curr++] = src[i] ;	
+			
+	}
+	result[curr] = 0 ;
+	
+	return stralloc_obreplace(sa,result) ;
+}
+
+/** instance -> 0, copy -> 1 */
+int insta_splitname(stralloc *sa,char const *name,int len,int what)
+{
+	char const *copy ;
+	size_t tlen = len + 1 ;
+	
+	char template[tlen + 1] ;
+	memcpy(template,name,tlen) ;
+	template[tlen] = 0 ;
+	
+	copy = name + tlen ;
+	
+	if (!what)
+		return stralloc_obreplace(sa,template) ;
+	else
+		return stralloc_obreplace(sa,copy) ;
+}
+
+int insta_create(stralloc *sasv,stralloc *sv, char const *src, int len)
+{
+	char *fdtmp ;
+	char const *copy ;
+	size_t tlen = len + 1 ;
+	
+	stralloc sa = STRALLOC_ZERO ;
+	stralloc tmp = STRALLOC_ZERO ;	
+	
+	char template[tlen + 1] ;
+	memcpy(template,sv->s,tlen) ;
+	template[tlen] = 0 ;
+	
+	copy = sv->s + tlen ;
+
+	fdtmp = dir_create_tmp(&tmp,"/tmp",copy) ;
+	if(!fdtmp)
+	{
+		VERBO3 strerr_warnwu1x("create instance tmp dir") ;
+		return 0 ;
+	}
+
+	if (!file_readputsa(&sa,src,template)){
+		VERBO3 strerr_warnwu4sys("open: ",src,"/",template) ;
+		return 0 ;
+	}
+	
+	if (!insta_replace(&sa,sa.s,copy)){
+		VERBO3 strerr_warnwu2x("replace instance character at: ",sa.s) ;
+		return 0 ;
+	}
+	/** remove the last \0 */
+	sa.len-- ;
+	
+	if (!file_write_unsafe(tmp.s,copy,sa.s,sa.len)){
+		VERBO3 strerr_warnwu4sys("create instance service file: ",tmp.s,"/",copy) ;
+		return 0 ;
+	}
+	
+	if (!read_svfile(sasv,copy,tmp.s)) return 0 ;
+	
+	if (rm_rf(tmp.s) < 0){
+		VERBO3 strerr_warnwu2x("remove tmp directory: ",tmp.s) ;
+		return 0 ;
+	}
+	
+	stralloc_free(&sa) ;
+	stralloc_free(&tmp) ;
+	
+	return stralloc_obreplace(sv,copy) ;
+}
+
+int insta_check(char const *svname)
+{
+	int r ;
+		
+	r = get_len_until(svname,'@') ;
+	if (r < 0) return -1 ;
+	
+	return r ;
+}
-- 
GitLab