Procházet zdrojové kódy

Feat: column index from string and string from column index

viest před 5 roky
rodič
revize
759ca973d2

+ 1 - 0
include/xlswriter.h

@@ -182,5 +182,6 @@ void worksheet_set_rows(lxw_row_t start, lxw_row_t end, double height, xls_resou
 lxw_error workbook_file(xls_resource_write_t *self);
 
 void xls_file_path(zend_string *file_name, zval *dir_path, zval *file_path);
+zend_string* str_pick_up(zend_string *left, char *right);
 
 #endif

+ 18 - 0
kernel/common.c

@@ -30,4 +30,22 @@ void xls_file_path(zend_string *file_name, zval *dir_path, zval *file_path)
 
     ZVAL_STR(file_path, full_path);
 }
+/* }}} */
+
+/* {{{ */
+zend_string* str_pick_up(zend_string *left, char *right)
+{
+    zend_string *full = NULL;
+
+    size_t _left_length = ZSTR_LEN(left);
+    size_t _extend_length = _left_length + strlen(right);
+
+    full = zend_string_extend(left, _extend_length, 0);
+
+    memcpy(ZSTR_VAL(full) + _left_length, right, strlen(right));
+
+    zend_string_release(left);
+
+    return full;
+}
 /* }}} */

+ 53 - 0
kernel/excel.c

@@ -710,6 +710,56 @@ PHP_METHOD(vtiful_xls, setRow)
 }
 /* }}} */
 
+/** {{{ \Vtiful\Kernel\xls::columnIndexFromString(string $index)
+ */
+PHP_METHOD(vtiful_xls, columnIndexFromString)
+{
+    zend_string *index = NULL;
+
+    ZEND_PARSE_PARAMETERS_START(1, 1)
+            Z_PARAM_STR(index)
+    ZEND_PARSE_PARAMETERS_END();
+
+    RETURN_LONG(lxw_name_to_col(ZSTR_VAL(index)));
+}
+/* }}} */
+
+/** {{{ \Vtiful\Kernel\xls::stringFromColumnIndex(int $index)
+ */
+PHP_METHOD(vtiful_xls, stringFromColumnIndex)
+{
+    zend_long index = 0, current = 0;
+    zend_string *result = NULL;
+
+    ZEND_PARSE_PARAMETERS_START(1, 1)
+            Z_PARAM_LONG(index)
+    ZEND_PARSE_PARAMETERS_END();
+
+    if (index < 26) {
+        current = index + 65;
+        result  = zend_string_init((char *)(&current), 1, 0);
+        RETURN_STR(result);
+    }
+
+    if (index < 702) {
+        current = index / 26 + 64;
+        result  = zend_string_init((char *)(&current), 1, 0);
+
+        current = index % 26 + 65;
+        RETURN_STR(str_pick_up(result, (char *)(&current)));
+    }
+
+    current = (index - 26) / 676 + 64;
+    result  = zend_string_init((char *)(&current), 1, 0);
+
+    current = ((index - 26) % 676) / 26 + 65;
+    result  = str_pick_up(result, (char *)(&current));
+
+    current = index % 26 + 65;
+    RETURN_STR(str_pick_up(result, (char *)(&current)));
+}
+/* }}} */
+
 #ifdef ENABLE_READER
 
 /** {{{ \Vtiful\Kernel\xls::openFile()
@@ -877,6 +927,9 @@ zend_function_entry xls_methods[] = {
         PHP_ME(vtiful_xls, setColumn,     xls_set_column_arginfo,     ZEND_ACC_PUBLIC)
         PHP_ME(vtiful_xls, setRow,        xls_set_row_arginfo,        ZEND_ACC_PUBLIC)
 
+        PHP_ME(vtiful_xls, columnIndexFromString,        NULL,        ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
+        PHP_ME(vtiful_xls, stringFromColumnIndex,        NULL,        ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
+
 #ifdef ENABLE_READER
         PHP_ME(vtiful_xls, openFile,         xls_open_file_arginfo,          ZEND_ACC_PUBLIC)
         PHP_ME(vtiful_xls, openSheet,        xls_open_sheet_arginfo,         ZEND_ACC_PUBLIC)

+ 26 - 0
tests/column_index_from_string.phpt

@@ -0,0 +1,26 @@
+--TEST--
+Check for vtiful presence
+--SKIPIF--
+<?php if (!extension_loaded("xlswriter")) print "skip"; ?>
+--FILE--
+<?php
+var_dump(\Vtiful\Kernel\Excel::columnIndexFromString('A'));
+var_dump(\Vtiful\Kernel\Excel::columnIndexFromString('AC'));
+var_dump(\Vtiful\Kernel\Excel::columnIndexFromString('AB'));
+var_dump(\Vtiful\Kernel\Excel::columnIndexFromString('AZ'));
+var_dump(\Vtiful\Kernel\Excel::columnIndexFromString('ABC'));
+var_dump(\Vtiful\Kernel\Excel::columnIndexFromString('ADE'));
+var_dump(\Vtiful\Kernel\Excel::columnIndexFromString('AS'));
+var_dump(\Vtiful\Kernel\Excel::columnIndexFromString('XF'));
+var_dump(\Vtiful\Kernel\Excel::columnIndexFromString('ST'));
+?>
+--EXPECT--
+int(0)
+int(28)
+int(27)
+int(51)
+int(730)
+int(784)
+int(44)
+int(629)
+int(513)

+ 26 - 0
tests/string_from_column_index.phpt

@@ -0,0 +1,26 @@
+--TEST--
+Check for vtiful presence
+--SKIPIF--
+<?php if (!extension_loaded("xlswriter")) print "skip"; ?>
+--FILE--
+<?php
+var_dump(\Vtiful\Kernel\Excel::stringFromColumnIndex(0));
+var_dump(\Vtiful\Kernel\Excel::stringFromColumnIndex(28));
+var_dump(\Vtiful\Kernel\Excel::stringFromColumnIndex(27));
+var_dump(\Vtiful\Kernel\Excel::stringFromColumnIndex(51));
+var_dump(\Vtiful\Kernel\Excel::stringFromColumnIndex(730));
+var_dump(\Vtiful\Kernel\Excel::stringFromColumnIndex(784));
+var_dump(\Vtiful\Kernel\Excel::stringFromColumnIndex(44));
+var_dump(\Vtiful\Kernel\Excel::stringFromColumnIndex(629));
+var_dump(\Vtiful\Kernel\Excel::stringFromColumnIndex(513));
+?>
+--EXPECT--
+string(1) "A"
+string(2) "AC"
+string(2) "AB"
+string(2) "AZ"
+string(3) "ABC"
+string(3) "ADE"
+string(2) "AS"
+string(2) "XF"
+string(2) "ST"