161 lines
4.1 KiB
HolyC
161 lines
4.1 KiB
HolyC
|
#help_index "DolDoc/Misc"
|
||
|
|
||
|
CColorROPU32 highlight_hash_type_colors[HTt_TYPES_NUM]=
|
||
|
DOC_COLOR_EXPORT_SYS_SYM,0,DOC_COLOR_DEFINE_STR,DOC_COLOR_GLBL_VAR,
|
||
|
DOC_COLOR_CLASS,DOC_COLOR_KEYWORD,DOC_COLOR_FUN,0,0,DOC_COLOR_KEYWORD,
|
||
|
DOC_COLOR_KEYWORD,DOC_COLOR_KEYWORD,DOC_COLOR_REG,0,0,0,0};
|
||
|
|
||
|
U32 *DocHighlight(CDocEntry *doc_e,U8 *src,I64 len,I64 _tmp_u32_attr)
|
||
|
{//Be aware of $LK,"::/Demo/ToHtmlToTXTDemo/ToHtml.HC"$.
|
||
|
U32 *res=MAlloc((len+1)*sizeof(U32)),*dst=res;
|
||
|
U8 *ptr;
|
||
|
CDocSettings *s=&doc_e->settings;
|
||
|
I64 ch,ch1,last_ch,tmp_u32_attr,mask_tmp_u32_attr=_tmp_u32_attr&0xFFFFF000,
|
||
|
comment_depth,brace_depth=s->brace_depth,paren_depth=s->paren_depth;
|
||
|
CHash *tmph;
|
||
|
switch [s->state] {
|
||
|
case DOCSS_NORMAL:
|
||
|
hl_normal:
|
||
|
while (len) {
|
||
|
while (len && !Bt(char_bmp_alpha_numeric,*src)) {
|
||
|
tmp_u32_attr=_tmp_u32_attr;
|
||
|
ch1=*src++;
|
||
|
switch (ch1) {
|
||
|
case '/':
|
||
|
if (len>=2) {
|
||
|
if (*src=='/') {
|
||
|
tmp_u32_attr=DOC_COLOR_COMMENT<<8|mask_tmp_u32_attr;
|
||
|
*dst++=ch1+tmp_u32_attr;
|
||
|
*dst++=*src++ +tmp_u32_attr;
|
||
|
len-=2;
|
||
|
goto hl_cpp_comment;
|
||
|
} else if (*src=='*') {
|
||
|
tmp_u32_attr=DOC_COLOR_COMMENT<<8|mask_tmp_u32_attr;
|
||
|
*dst++=ch1+tmp_u32_attr;
|
||
|
*dst++=*src++ +tmp_u32_attr;
|
||
|
len-=2;
|
||
|
comment_depth=1;
|
||
|
goto hl_comment;
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
case '\'':
|
||
|
tmp_u32_attr=DOC_COLOR_CHAR_CONST<<8|mask_tmp_u32_attr;
|
||
|
*dst++=ch1+tmp_u32_attr;
|
||
|
len--;
|
||
|
goto hl_single_quote;
|
||
|
case '\"':
|
||
|
tmp_u32_attr=DOC_COLOR_STR<<8|mask_tmp_u32_attr;
|
||
|
*dst++=ch1+tmp_u32_attr;
|
||
|
len--;
|
||
|
goto hl_dbl_quote;
|
||
|
case '(':
|
||
|
if (paren_depth++&1)
|
||
|
tmp_u32_attr=DOC_COLOR_ALT_TEXT<<8|mask_tmp_u32_attr;
|
||
|
break;
|
||
|
case ')':
|
||
|
if (--paren_depth&1)
|
||
|
tmp_u32_attr=DOC_COLOR_ALT_TEXT<<8|mask_tmp_u32_attr;
|
||
|
break;
|
||
|
case '{':
|
||
|
if (brace_depth++&1)
|
||
|
tmp_u32_attr=DOC_COLOR_ALT_TEXT<<8|mask_tmp_u32_attr;
|
||
|
break;
|
||
|
case '}':
|
||
|
if (--brace_depth&1)
|
||
|
tmp_u32_attr=DOC_COLOR_ALT_TEXT<<8|mask_tmp_u32_attr;
|
||
|
break;
|
||
|
}
|
||
|
*dst++=ch1+tmp_u32_attr;
|
||
|
if (!--len) goto hl_normal_done;
|
||
|
}
|
||
|
ptr=src;
|
||
|
while (len && Bt(char_bmp_alpha_numeric,*src)) {
|
||
|
src++;
|
||
|
len--;
|
||
|
}
|
||
|
ch=*src;
|
||
|
*src=0;
|
||
|
if (tmph=HashFind(ptr,adam_task->hash_table,
|
||
|
HTT_EXPORT_SYS_SYM|HTT_DEFINE_STR|HTT_GLBL_VAR|HTT_CLASS|
|
||
|
HTT_INTERNAL_TYPE|HTT_FUN|HTT_KEYWORD|HTT_ASM_KEYWORD|
|
||
|
HTT_OPCODE|HTT_REG))
|
||
|
tmp_u32_attr=highlight_hash_type_colors[HashTypeNum(tmph)]<<8|
|
||
|
mask_tmp_u32_attr;
|
||
|
else
|
||
|
tmp_u32_attr=_tmp_u32_attr;
|
||
|
while (ch1=*ptr++)
|
||
|
*dst++=ch1+tmp_u32_attr;
|
||
|
*src=ch;
|
||
|
}
|
||
|
hl_normal_done:
|
||
|
s->state=DOCSS_NORMAL;
|
||
|
s->comment_depth=0;
|
||
|
break;
|
||
|
case DOCSS_SINGLE_QUOTE:
|
||
|
tmp_u32_attr=DOC_COLOR_CHAR_CONST<<8|mask_tmp_u32_attr;
|
||
|
hl_single_quote:
|
||
|
last_ch=0;
|
||
|
while (len--) {
|
||
|
ch1=*src++;
|
||
|
*dst++=ch1+tmp_u32_attr;
|
||
|
if (last_ch!='\\' && ch1=='\'')
|
||
|
goto hl_normal;
|
||
|
if (last_ch=='\\' && ch1=='\\')
|
||
|
last_ch=0;
|
||
|
else
|
||
|
last_ch=ch1;
|
||
|
}
|
||
|
s->state=DOCSS_SINGLE_QUOTE;
|
||
|
s->comment_depth=0;
|
||
|
break;
|
||
|
case DOCSS_DBL_QUOTE:
|
||
|
tmp_u32_attr=DOC_COLOR_CHAR_CONST<<8|mask_tmp_u32_attr;
|
||
|
hl_dbl_quote:
|
||
|
last_ch=0;
|
||
|
while (len--) {
|
||
|
ch1=*src++;
|
||
|
*dst++=ch1+tmp_u32_attr;
|
||
|
if (last_ch!='\\' && ch1=='\"')
|
||
|
goto hl_normal;
|
||
|
if (last_ch=='\\' && ch1=='\\')
|
||
|
last_ch=0;
|
||
|
else
|
||
|
last_ch=ch1;
|
||
|
}
|
||
|
s->state=DOCSS_DBL_QUOTE;
|
||
|
s->comment_depth=0;
|
||
|
break;
|
||
|
case DOCSS_COMMENT:
|
||
|
tmp_u32_attr=DOC_COLOR_COMMENT<<8|mask_tmp_u32_attr;
|
||
|
comment_depth=s->comment_depth;
|
||
|
hl_comment:
|
||
|
last_ch=0;
|
||
|
while (len--) {
|
||
|
ch1=*src++;
|
||
|
*dst++=ch1+tmp_u32_attr;
|
||
|
if (last_ch=='*' && ch1=='/') {
|
||
|
if (!--comment_depth)
|
||
|
goto hl_normal;
|
||
|
} else if (last_ch=='/' && ch1=='*')
|
||
|
comment_depth++;
|
||
|
last_ch=ch1;
|
||
|
}
|
||
|
s->state=DOCSS_COMMENT;
|
||
|
s->comment_depth=comment_depth;
|
||
|
break;
|
||
|
case DOCSS_CPP_Z_COMMENT:
|
||
|
tmp_u32_attr=DOC_COLOR_COMMENT<<8|mask_tmp_u32_attr;
|
||
|
hl_cpp_comment:
|
||
|
while (len--)
|
||
|
*dst++=*src++ +tmp_u32_attr;
|
||
|
s->state=DOCSS_CPP_Z_COMMENT;
|
||
|
s->comment_depth=0;
|
||
|
break;
|
||
|
}
|
||
|
s->paren_depth=paren_depth;
|
||
|
s->brace_depth=brace_depth;
|
||
|
*dst=0;
|
||
|
return res;
|
||
|
}
|