Merge pull request #2060 from taosdata/hotfix/print-nchar-dead-loop
fix possible dead loop in shellPrintNChar
This commit is contained in:
commit
68a8d081f1
|
@ -68,7 +68,6 @@ void get_history_path(char* history);
|
||||||
void cleanup_handler(void* arg);
|
void cleanup_handler(void* arg);
|
||||||
void exitShell();
|
void exitShell();
|
||||||
int shellDumpResult(TAOS* con, char* fname, int* error_no, bool printMode);
|
int shellDumpResult(TAOS* con, char* fname, int* error_no, bool printMode);
|
||||||
void shellPrintNChar(const char* str, int length, int width);
|
|
||||||
void shellGetGrantInfo(void *con);
|
void shellGetGrantInfo(void *con);
|
||||||
int isCommentLine(char *line);
|
int isCommentLine(char *line);
|
||||||
|
|
||||||
|
|
|
@ -349,31 +349,6 @@ void *shellLoopQuery(void *arg) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void shellPrintNChar(const char *str, int length, int width) {
|
|
||||||
int pos = 0, cols = 0;
|
|
||||||
while (pos < length) {
|
|
||||||
wchar_t wc;
|
|
||||||
pos += mbtowc(&wc, str + pos, MB_CUR_MAX);
|
|
||||||
if (pos > length) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
int w = wcwidth(wc);
|
|
||||||
if (w > 0) {
|
|
||||||
if (width > 0 && cols + w > width) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
printf("%lc", wc);
|
|
||||||
cols += w;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (; cols < width; cols++) {
|
|
||||||
putchar(' ');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int get_old_terminal_mode(struct termios *tio) {
|
int get_old_terminal_mode(struct termios *tio) {
|
||||||
/* Make sure stdin is a terminal. */
|
/* Make sure stdin is a terminal. */
|
||||||
if (!isatty(STDIN_FILENO)) {
|
if (!isatty(STDIN_FILENO)) {
|
||||||
|
|
|
@ -435,7 +435,6 @@ static int dumpResultToFile(const char* fname, TAOS_RES* result) {
|
||||||
|
|
||||||
int num_fields = taos_num_fields(result);
|
int num_fields = taos_num_fields(result);
|
||||||
TAOS_FIELD *fields = taos_fetch_fields(result);
|
TAOS_FIELD *fields = taos_fetch_fields(result);
|
||||||
int32_t* length = taos_fetch_lengths(result);
|
|
||||||
int precision = taos_result_precision(result);
|
int precision = taos_result_precision(result);
|
||||||
|
|
||||||
for (int col = 0; col < num_fields; col++) {
|
for (int col = 0; col < num_fields; col++) {
|
||||||
|
@ -448,6 +447,7 @@ static int dumpResultToFile(const char* fname, TAOS_RES* result) {
|
||||||
|
|
||||||
int numOfRows = 0;
|
int numOfRows = 0;
|
||||||
do {
|
do {
|
||||||
|
int32_t* length = taos_fetch_lengths(result);
|
||||||
for (int i = 0; i < num_fields; i++) {
|
for (int i = 0; i < num_fields; i++) {
|
||||||
if (i > 0) {
|
if (i > 0) {
|
||||||
fputc(',', fp);
|
fputc(',', fp);
|
||||||
|
@ -465,6 +465,39 @@ static int dumpResultToFile(const char* fname, TAOS_RES* result) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void shellPrintNChar(const char *str, int length, int width) {
|
||||||
|
int pos = 0, cols = 0;
|
||||||
|
while (pos < length) {
|
||||||
|
wchar_t wc;
|
||||||
|
int bytes = mbtowc(&wc, str + pos, MB_CUR_MAX);
|
||||||
|
if (bytes == 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
pos += bytes;
|
||||||
|
if (pos > length) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef WINDOWS
|
||||||
|
int w = bytes;
|
||||||
|
#else
|
||||||
|
int w = wcwidth(wc);
|
||||||
|
#endif
|
||||||
|
if (w > 0) {
|
||||||
|
if (width > 0 && cols + w > width) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
printf("%lc", wc);
|
||||||
|
cols += w;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (; cols < width; cols++) {
|
||||||
|
putchar(' ');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void printField(const char* val, TAOS_FIELD* field, int width, int32_t length, int precision) {
|
static void printField(const char* val, TAOS_FIELD* field, int width, int32_t length, int precision) {
|
||||||
if (val == NULL) {
|
if (val == NULL) {
|
||||||
int w = width;
|
int w = width;
|
||||||
|
@ -523,7 +556,6 @@ static int verticalPrintResult(TAOS_RES* result) {
|
||||||
|
|
||||||
int num_fields = taos_num_fields(result);
|
int num_fields = taos_num_fields(result);
|
||||||
TAOS_FIELD *fields = taos_fetch_fields(result);
|
TAOS_FIELD *fields = taos_fetch_fields(result);
|
||||||
int32_t* length = taos_fetch_lengths(result);
|
|
||||||
int precision = taos_result_precision(result);
|
int precision = taos_result_precision(result);
|
||||||
|
|
||||||
int maxColNameLen = 0;
|
int maxColNameLen = 0;
|
||||||
|
@ -537,6 +569,7 @@ static int verticalPrintResult(TAOS_RES* result) {
|
||||||
int numOfRows = 0;
|
int numOfRows = 0;
|
||||||
do {
|
do {
|
||||||
printf("*************************** %d.row ***************************\n", numOfRows + 1);
|
printf("*************************** %d.row ***************************\n", numOfRows + 1);
|
||||||
|
int32_t* length = taos_fetch_lengths(result);
|
||||||
for (int i = 0; i < num_fields; i++) {
|
for (int i = 0; i < num_fields; i++) {
|
||||||
TAOS_FIELD* field = fields + i;
|
TAOS_FIELD* field = fields + i;
|
||||||
|
|
||||||
|
@ -631,7 +664,6 @@ static int horizontalPrintResult(TAOS_RES* result) {
|
||||||
|
|
||||||
int num_fields = taos_num_fields(result);
|
int num_fields = taos_num_fields(result);
|
||||||
TAOS_FIELD *fields = taos_fetch_fields(result);
|
TAOS_FIELD *fields = taos_fetch_fields(result);
|
||||||
int32_t* length = taos_fetch_lengths(result);
|
|
||||||
int precision = taos_result_precision(result);
|
int precision = taos_result_precision(result);
|
||||||
|
|
||||||
int width[TSDB_MAX_COLUMNS];
|
int width[TSDB_MAX_COLUMNS];
|
||||||
|
@ -643,6 +675,7 @@ static int horizontalPrintResult(TAOS_RES* result) {
|
||||||
|
|
||||||
int numOfRows = 0;
|
int numOfRows = 0;
|
||||||
do {
|
do {
|
||||||
|
int32_t* length = taos_fetch_lengths(result);
|
||||||
for (int i = 0; i < num_fields; i++) {
|
for (int i = 0; i < num_fields; i++) {
|
||||||
putchar(' ');
|
putchar(' ');
|
||||||
printField(row[i], fields + i, width[i], length[i], precision);
|
printField(row[i], fields + i, width[i], length[i], precision);
|
||||||
|
|
|
@ -323,30 +323,6 @@ void *shellLoopQuery(void *arg) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void shellPrintNChar(const char *str, int length, int width) {
|
|
||||||
int pos = 0, cols = 0;
|
|
||||||
while (pos < length) {
|
|
||||||
wchar_t wc;
|
|
||||||
pos += mbtowc(&wc, str + pos, MB_CUR_MAX);
|
|
||||||
if (pos > length) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
int w = wcwidth(wc);
|
|
||||||
if (w > 0) {
|
|
||||||
if (width > 0 && cols + w > width) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
printf("%lc", wc);
|
|
||||||
cols += w;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (; cols < width; cols++) {
|
|
||||||
putchar(' ');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int get_old_terminal_mode(struct termios *tio) {
|
int get_old_terminal_mode(struct termios *tio) {
|
||||||
/* Make sure stdin is a terminal. */
|
/* Make sure stdin is a terminal. */
|
||||||
if (!isatty(STDIN_FILENO)) {
|
if (!isatty(STDIN_FILENO)) {
|
||||||
|
|
|
@ -214,32 +214,6 @@ void *shellLoopQuery(void *arg) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void shellPrintNChar(const char *str, int length, int width) {
|
|
||||||
int pos = 0, cols = 0;
|
|
||||||
while (pos < length) {
|
|
||||||
wchar_t wc;
|
|
||||||
int bytes = mbtowc(&wc, str + pos, MB_CUR_MAX);
|
|
||||||
pos += bytes;
|
|
||||||
if (pos > length) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
int w = bytes;
|
|
||||||
if (w > 0) {
|
|
||||||
if (width > 0 && cols + w > width) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
printf("%lc", wc);
|
|
||||||
cols += w;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (; cols < width; cols++) {
|
|
||||||
putchar(' ');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void get_history_path(char *history) { sprintf(history, "%s/%s", ".", HISTORY_FILE); }
|
void get_history_path(char *history) { sprintf(history, "%s/%s", ".", HISTORY_FILE); }
|
||||||
|
|
||||||
void exitShell() { exit(EXIT_SUCCESS); }
|
void exitShell() { exit(EXIT_SUCCESS); }
|
||||||
|
|
Loading…
Reference in New Issue