// 지정텍스트의 라인 구하기
int text_counter(char filename[MAX_INPUT_LENGTH])
{
char buffer[MAX_INPUT_LENGTH]="";
char buf[MAX_INPUT_LENGTH]="";
int linechk = 0;
FILE *fp;
if (!(fp = fopen(filename, "r"))) {
sprintf(buf, "SYSERR:%s 파일없음", filename);
log(buf);
return 0;
}
while (!feof(fp)) {
if (fgets(buffer, MAX_INPUT_LENGTH, fp) == NULL)
break;
linechk++;
}
fclose(fp);
if (linechk)
return linechk;
return 0;
}
#define PAGE_MAX 512
// 2024-07-31., 최종 2024-08-05
void load_text(struct char_data *ch, char line1[MAX_INPUT_LENGTH], char line2[MAX_INPUT_LENGTH], char filename[MAX_INPUT_LENGTH], char output[MAX_STRING_LENGTH], int opt)
{
int text_counter(char lname[MAX_INPUT_LENGTH]);
char buffer[MAX_INPUT_LENGTH]="";
char sbuf[MAX_INPUT_LENGTH]="";
int i = 0, found = 0, linechk = 0;
FILE *fp;
output[0] = '0';
linechk = text_counter(filename);
if (!(fp = fopen(filename, "r"))) {
sprintf(sbuf,"에러! %s 파일이 없습니다.rn", filename);
log(sbuf);
return;
}
if (opt == 0) {
if (linechk > 0) {
sprintf(sbuf, "&c02%s&c07 안에는 &c02%d&c07 줄의 내용이 저장되어 있습니다.rnrn",
filename, linechk);
send_to_char(sbuf, ch);
} else {
send_to_char("저장된 내용이 없습니다.rn", ch);
fclose(fp);
return;
}
}
if (is_number(line1) && !*line2) {
sprintf(line2, "%d", linechk);
}
if (is_number(line1)) {
if (atoi(line1) < 1 || atoi(line1) > linechk)
sprintf(line1, "%d", 1);
while (!feof(fp)) {
if (fgets(buffer, MAX_INPUT_LENGTH, fp) == NULL)
break;
found++;
if (found < atoi(line1)) // 지정 라인부터 출력
continue;
if (found > atoi(line2))
continue;
if ((strlen(output + PAGE_MAX) > MAX_STRING_LENGTH))
break;
// 이것을 넣지 않으면 줄 정렬이 되지 않음 그냥 r 이 아니라 CR(캐리지리턴) 백슬래시 입니다.
strcat(buffer, "r");
strcat(output, buffer);
}
fclose(fp);
if (opt == 0) {
if (!found) {
send_to_char("일치하는 내용을 찾을 수 없습니다.rn", ch);
}
}
return;
} else { // 문자 입력이면
while (!feof(fp)) {
if (fgets(buffer, MAX_INPUT_LENGTH, fp) == NULL)
break;
if (!strstr(buffer, line1)) // 지정 라인부터 출력
continue;
if ((strlen(output + PAGE_MAX) > MAX_STRING_LENGTH))
break;
// 이것을 넣지 않으면 줄 정렬이 되지 않음 그냥 r 이 아니라 CR(캐리지리턴) 백슬래시 입니다.
strcat(buffer, "r");
strcat(output, buffer);
found++;
}
fclose(fp);
if (opt == 0) {
if (!found) {
send_to_char("일치하는 내용을 찾을 수 없습니다.rn", ch);
}
}
return;
}
}
/*
이 코드는 텍스트 파일명을 입력하고 숫자로 범위를 지정하거나 문자열을 입력하면 일치하는 라인을 모아서 output 으로 출력하는 기능을 합니다. 최종적으로 send_to_char(buf, ch); 를 이용하거나 page_string(ch->desc, buf, 0, 0); 을 이용해서 출력하면 됩니다.
기본 폴더가 lib 이니 다른 폴더를 찾을 시 경로를 입력해야합니다. "../syslog.txt" 또는 "text/motd" 와 같은 방식으로.
숫자로 범위 지정시 load_text(ch, arg1, arg2, "text/motd.txt", buf); 와 같은 방식으로 설정
문자로 지정시 load_text(ch, arg1, "", "../syslog.txt", buf); 와 같은 방식으로 설정
공백을 포함한 문자열 검색을 하려면 arg1 이 적힌 자리에 two_arguments 함수를 사용해 나눠져 단어 하나가 담긴 arg1 과 같은 것이 아닌 전체 명령어가 담긴 argument+1 혹은 argument 를 입력하면 됩니다. 참고: argument[0] 에는 공백이 담겨져 있을 수 있습니다.
*/