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

📄 mac.c

📁 ctags-5.5.4.tar.gz,一个很好的代码开发以及编辑源码
💻 C
字号:
/**   $Id: mac.c,v 1.1 2001/11/02 04:53:43 darren Exp $**   Copyright (c) 2001, Maarten L. Hekkelman**   Author: Maarten L. Hekkelman <maarten@hekkelman.com>*           http://www.hekkelman.com**   This source code is released for free distribution under the terms of the*   GNU General Public License. It is provided on an as-is basis and no*   responsibility is accepted for its failure to perform as expected.**   This module contains support functions for Exuberant Ctags on Macintosh.*//**   INCLUDE FILES*/#include "general.h"#include <Files.h>#include <TextUtils.h>#include <stdlib.h>#include <string.h>#include <stdio.h>/**   FUNCTION DEFINITIONS*/static int get_path(const char* in_unix_path, unsigned char* out_mac_path){	int l = strlen(in_unix_path);	int result = 0;		if (l > 254)		result = -1;	else	{		const char* s = in_unix_path;		char *d = (char*)out_mac_path + 1;				if (*s != '/')			*d++ = ':';		else			++s;				while (*s)		{			if (s[0] == '.' && s[1] == '.' && s[2] == '/')			{				s += 3;				*d++ = ':';			}			else if (s[0] == '.' && s[1] == '/')				s += 2;			else if (s[0] == '/')			{				*d++ = ':';								++s;				while (*s == '/')					++s;			}			else				*d++ = *s++;		}		out_mac_path[0] = (d - (char*)out_mac_path) - 1;	}		return result;}DIR *opendir(const char *dirname){	DIR* dirp = (DIR*)calloc(1, sizeof(DIR));	if (dirp != NULL)	{		OSErr err;		Str255 s;		CInfoPBRec pb = { 0 };				if (strcmp(dirname, "."))		{			get_path(dirname, s);			pb.hFileInfo.ioNamePtr = s;		}		else			pb.hFileInfo.ioNamePtr = NULL;				err = PBGetCatInfoSync(&pb);		if (err != noErr || (pb.hFileInfo.ioFlAttrib & ioDirMask) == 0)		{			free(dirp);			dirp = NULL;		}		else		{			dirp->file.vRefNum = pb.hFileInfo.ioVRefNum;			dirp->file.parID = pb.hFileInfo.ioDirID;			dirp->file.name[0] = '\0';			dirp->index = 1;		}	}		return dirp;}struct dirent *readdir(DIR *dirp){	if (dirp)	{		CInfoPBRec pb = { 0 };				pb.hFileInfo.ioVRefNum = dirp->file.vRefNum;		pb.hFileInfo.ioDirID = dirp->file.parID;		pb.hFileInfo.ioFDirIndex = dirp->index++;		pb.hFileInfo.ioNamePtr = dirp->file.name;			if (PBGetCatInfoSync(&pb) != noErr)			return NULL;				memcpy(dirp->ent.d_name, dirp->file.name + 1, dirp->file.name[0]);		dirp->ent.d_name[dirp->file.name[0]] = 0;		return &dirp->ent;	}	return NULL;}int closedir(DIR *dirp){	if (dirp)		free(dirp);	return 0;}void rewinddir(DIR *dirp){	if (dirp)		dirp->index = 1;}int mstat(const char* file, struct stat* st){	CInfoPBRec		pb;	unsigned char	path[256];	int				result = 0;	memset(&pb, 0, sizeof(CInfoPBRec));	if (strcmp(file, ".") == 0)	{		memset(st, 0, sizeof(struct stat));		st->st_mode = S_IFDIR;		st->st_ino = -1;	}	else	{		result = get_path(file, path);				if (result == 0)		{			pb.hFileInfo.ioNamePtr = path;						if (PBGetCatInfoSync(&pb) != noErr)				result = -1;			else			{				memset(st, 0, sizeof(struct stat));					if (pb.hFileInfo.ioFlAttrib & ioDirMask)					st->st_mode = S_IFDIR;				else					st->st_mode = S_IFREG;				st->st_ino = pb.hFileInfo.ioFlStBlk;				st->st_dev = pb.hFileInfo.ioVRefNum;				st->st_nlink = 1;				st->st_size = pb.hFileInfo.ioFlLgLen;				st->st_atime = pb.hFileInfo.ioFlMdDat;				st->st_mtime = pb.hFileInfo.ioFlMdDat;				st->st_ctime = pb.hFileInfo.ioFlCrDat;			}		}	}	return result;}#undef fopenFILE* mfopen(const char* file, const char* mode){	unsigned char path[256];			if (get_path(file, path) == 0)	{		int l = path[0];		memmove(path, path + 1, l);		path[l] = 0;		return fopen((char*)path, mode);	}	else		return NULL;}char* getcwd(char* out_path, int out_path_len){	OSErr		err = noErr;	CInfoPBRec	pb;	FSSpec		cwd;	if (out_path == NULL)	{		if (out_path_len < PATH_MAX)			out_path_len = PATH_MAX;		out_path = (char*)malloc(out_path_len);	}		err = FSMakeFSSpec(0, 0, "\p:", &cwd);		if (cwd.parID == fsRtParID)	{		*out_path = '/';		memcpy(out_path + 1, cwd.name + 1, cwd.name[0]);		out_path[1 + cwd.name[0]] = 0;	}	else	{		/* The object isn't a volume */				/* Is the object a file or a directory? */				char t[PATH_MAX];		char* s;		s = t + PATH_MAX - cwd.name[0] - 1;		memcpy(s, cwd.name + 1, cwd.name[0]);		s[cwd.name[0]] = 0;				/* Get the ancestor directory names */		pb.dirInfo.ioNamePtr = cwd.name;		pb.dirInfo.ioVRefNum = cwd.vRefNum;		pb.dirInfo.ioDrParID = cwd.parID;		do	/* loop until we have an error or find the root directory */		{			pb.dirInfo.ioFDirIndex = -1;			pb.dirInfo.ioDrDirID = pb.dirInfo.ioDrParID;			err = PBGetCatInfoSync(&pb);			if ( err == noErr )			{				*--s = '/';				s -= cwd.name[0];				memcpy(s, cwd.name + 1, cwd.name[0]);			}		}		while (err == noErr && pb.dirInfo.ioDrDirID != fsRtDirID && s > t + 1);		if (s > t + 1)		{			*--s = '/';			strcpy(out_path, s);		}		else			strcpy(out_path, ".");	}	return out_path;}/* vi:set tabstop=4 shiftwidth=4: */

⌨️ 快捷键说明

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