⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lscolors.c

📁 UNIX环境下命令行FTP/SFTP工具源代码
💻 C
字号:
/* $Id: lscolors.c,v 1.5 2003/07/12 10:25:41 mhe Exp $ * * lscolors.c -- parsing of env variable LS_COLORS * * Yet Another FTP Client * Copyright (C) 1998-2001, Martin Hedenfalk <mhe@stacken.kth.se> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. See COPYING for more details. */#include "syshdr.h"#include "rfile.h"#include "xmalloc.h"#include "strq.h"typedef struct {	char *msk;	char *clr;} lscolor;static bool colors_initialized = false;static int number_of_colors = 0;/* these are the default colors */static char *diclr="01;34", *lnclr="01;36", *ficlr="00", *exclr="01;32";static char *bdclr="40;01;33", *cdclr="40;01;33", *piclr="40;33", *soclr="01;35";static char *lc="\x1B[", *rc="m", *ec="\x1B[0m";static lscolor *clrs;char *endcolor(void){	return ec;}void init_colors(void){	int i = 0;	char *p, *e, *q, *org;	unsigned int n;	if(colors_initialized)		return;	p = getenv("LS_COLORS");	if(!p)		p = getenv("LS_COLOURS");	if(p && *p) {		org = p = xstrdup(p);		n = strqnchr(p, ':')+2;		clrs = (lscolor *)xmalloc(n * sizeof(lscolor));		e = strqsep(&p, ':');		while(e && *e) {			q = strqsep(&e, '=');			clrs[i].msk = xstrdup(q);			q = strqsep(&e, ':');			clrs[i].clr = xstrdup(q);			e = strqsep(&p, ':');			if(strcmp(clrs[i].msk, "di")==0) /* directory */				diclr = clrs[i].clr;			else if(strcmp(clrs[i].msk, "ln")==0) /* link */				lnclr = clrs[i].clr;			else if(strcmp(clrs[i].msk, "fi")==0) /* normal file */				ficlr = clrs[i].clr;			else if(strcmp(clrs[i].msk, "ex")==0) /* executable */				exclr = clrs[i].clr;			else if(strcmp(clrs[i].msk, "bd")==0) /* block device */				bdclr = clrs[i].clr;			else if(strcmp(clrs[i].msk, "cd")==0) /* character device */				cdclr = clrs[i].clr;			else if(strcmp(clrs[i].msk, "pi")==0) /* pipe */				piclr = clrs[i].clr;			else if(strcmp(clrs[i].msk, "so")==0) /* socket */				soclr = clrs[i].clr;			else if(strcmp(clrs[i].msk, "lc") == 0) /* left code */				lc = clrs[i].clr;			else if(strcmp(clrs[i].msk, "rc") == 0) /* right code */				rc = clrs[i].clr;			else if(strcmp(clrs[i].msk, "ec") == 0) /* end code (lc+fi+rc) */				ec = clrs[i].clr;			else				i++;		}		number_of_colors = i;		free(org);		if(!ec) {			ec = xmalloc(strlen(lc)+strlen(ficlr)+strlen(rc)+1);			sprintf(ec, "%s%s%s", lc, ficlr, rc);		}	}}void rfile_parse_colors(rfile *f){	char *e, *q;	int i;	/* colors should already been initialized by init_colors */	e = 0;	if(risdir(f))		e = diclr;	else if(rislink(f))		e = lnclr;	else if(rischardev(f))		e = cdclr;	else if(risblockdev(f))		e = bdclr;	else if(rispipe(f))		e = piclr;	else if(rissock(f))		e = soclr;	/* do this before checking for executable, because	 * on [v]fat filesystems, all files are 'executable'	 */	for(i=0;i<number_of_colors && !e;i++) {		if(fnmatch(clrs[i].msk, base_name_ptr(f->path), 0) == 0)			e = clrs[i].clr;	}	/* a file is considered executable if there is	 * an 'x' anywhere in its permission string */	if(!e && risexec(f))		e = exclr;	q = e ? e : ficlr;	f->color = (char *)xmalloc(strlen(lc) + strlen(q) + strlen(rc) + 1);	sprintf(f->color, "%s%s%s", lc, q, rc);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -