Android development tools line_endings hacking
/********************************************************************
* Android development tools line_endings hacking
* 说明:
* 本文主要是对android源代码中的line_endings开发工具进行了解读,
* 目的是为了知道传说中的dos,unix文件之间转换的工作机制。
*
* 2016-5-3 深圳 南山平山村 曾剑锋
*******************************************************************/ #include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/stat.h> #define BUFSIZE (1024*8)
static void to_unix(char* buf);
static void unix_to_dos(char* buf2, const char* buf); // 使用方法
int usage()
{
fprintf(stderr, "usage: line_endings unix|dos FILES\n"
"\n"
"Convert FILES to either unix or dos line endings.\n");
return ;
} // 定义Node数据结构
typedef struct Node {
struct Node *next;
char buf[BUFSIZE*+];
} Node; int
main(int argc, char** argv)
{
// 枚举UNIX,DOS两种数据
enum { UNIX, DOS } ending;
int i; // 参数个数判断
if (argc < ) {
return usage();
} // 参数比较
if ( == strcmp("unix", argv[])) {
ending = UNIX;
}
else if ( == strcmp("dos", argv[])) {
ending = DOS;
}
else {
return usage();
} // 命令行传入的参数可能有多个,利用for循环进行轮流转换。
for (i=; i<argc; i++) {
int fd;
int len; // force implied
chmod(argv[i], S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP); // 打开文件
fd = open(argv[i], O_RDWR);
if (fd < ) {
fprintf(stderr, "unable to open file for read/write: %s\n", argv[i]);
return ;
} // 获取文件大小
len = lseek(fd, , SEEK_END);
lseek(fd, , SEEK_SET); // 文件长度正常才有必要进行转换
if (len > ) {
// 创建根节点
Node* root = malloc(sizeof(Node));
Node* node = root;
node->buf[] = ; // root节点的buf数据位0 while (len > ) {
// 创建节点,并出示节点
node->next = malloc(sizeof(Node));
node = node->next;
node->next = NULL; // 这里还是没搞太懂为什么要+2,后面有'\0',那只需要+1就行了,为什么
// 还要+2,没搞懂。
char buf[BUFSIZE+];
ssize_t amt;
ssize_t amt2 = len < BUFSIZE ? len : BUFSIZE;
amt = read(fd, buf, amt2);
if (amt != amt2) {
fprintf(stderr, "unable to read file: %s\n", argv[i]);
return ;
}
buf[amt2] = '\0'; // 字符串结尾
// 先转成unix文档
to_unix(buf);
if (ending == UNIX) {
strcpy(node->buf, buf);
} else {
// 这里BUFSIZE*2的主要原因应该是怕所有的都是换行符,这样转换出来
// 就是*2了,但是没搞懂为什么要+3,个人感觉最多有个+1就行了。
char buf2[(BUFSIZE*)+];
unix_to_dos(buf2, buf);
strcpy(node->buf, buf2);
}
len -= amt2;
} // 将文件长度修改为0,并重新从文件头开始
ftruncate(fd, );
lseek(fd, , SEEK_SET);
// 循环将链表中的内容写入文件,并释放链表中的内容
while (root) {
ssize_t amt2 = strlen(root->buf);
if (amt2 > ) {
ssize_t amt = write(fd, root->buf, amt2);
if (amt != amt2) {
fprintf(stderr, "unable to write file: %s\n", argv[i]);
return ;
}
}
node = root;
root = root->next;
free(node);
}
}
close(fd);
}
return ;
} // 这里相当于是字符的的不断的拷贝
void
to_unix(char* buf)
{
char* p = buf;
char* q = buf;
while (*p) {
if (p[] == '\r' && p[] == '\n') {
// dos
*q = '\n';
p += ;
q += ;
}
else if (p[] == '\r') {
// old mac
*q = '\n';
p += ;
q += ;
}
else {
*q = *p;
p += ;
q += ;
}
}
*q = '\0';
} // 这里和to_unix的动作正好相反
void
unix_to_dos(char* buf2, const char* buf)
{
const char* p = buf;
char* q = buf2;
while (*p) {
if (*p == '\n') {
q[] = '\r';
q[] = '\n';
q += ;
p += ;
} else {
*q = *p;
p += ;
q += ;
}
}
*q = '\0';
}
Android development tools line_endings hacking的更多相关文章
- ADT Android Development Tools
ADT(Android Development Tools)在Eclipse编译IDE环境中,需安装ADT(Android Developer Tools)Plug-in,这是Android在Ecli ...
- ADT-bundle(Android Development Tools)环境配置
Android开发环境有两套比较主流的:ADT-bundle和Android Studio,前者是Eclipse插件的形式进行开发,后者是Android的官方IDE. ADT环境的配置与调试:(1)安 ...
- Android Development Tools 发生checkAndLoadTargetData错误
之前使用时没有出现任何问题的,我把D:\IDE\ADT\adt-bundle-windows-x86_64-20140321\eclipse目录下面的 eclipse.exe重名名为adt.exe并设 ...
- 在eclipse里卸载已安装的插件[例如Android Development Tools ADT]
在eclipse里卸载已安装的插件 有四种方法: 1.到plugins和features目录中找到你要卸载的插件的文件夹, ...
- android 安装 出现Android Native Development Tools不能安装
Software being installed: Android Native Development Tools 20.0.0.v201206242043-391819 (com.android. ...
- Websites for more Android development information
There is a vibrant, helpful Android developer community on the Web. Here are a numberof useful websi ...
- android sdk tools 一览
ANDROID SDK ADKROID SDK的工具划分为两部分,一部分是SDK tools,与平台无关,另一部分是Platform tools支持最新的安卓平台 SDK tools有 SDK m ...
- Could not install the app on the device, read the error above for details. Make sure you have an Android emulator running or a device connected and have set up your Android development environment:
Administrator@DESKTOP-EHCTIOR MINGW64 /d/react-native-eyepetizer (master) $ react-native run-android ...
- [Android]Eclipse 安装 ADT[Android Development Tooling] 失败的两种解决办法
原因 最近想在新装的 Win7 里搭建一下 Android 的开发环境,虽然现在有 Android Studio 了,不过还是习惯 Eclipse 一点.众所周知的原因,Eclipse 直接安装 AD ...
随机推荐
- 【UVA】【10828】随机程序
数学期望/高斯消元/马尔可夫过程 刘汝佳老师白书上的例题- -b 本体不满足拓扑关系,但马尔可夫过程是可以高斯消元解的…… 用「高斯·约当消元」更方便! //UVA 10828 #include< ...
- 控制DIV属性——实现盒子长、宽、背景等变化
写在最前面:Demo的源起来自于http://js.fgm.cc/learn/,但是实现部分都是经过自己思考和优化的,有时会借助别人的图片,然而“窃喜”.如无特殊说明,demo都是经过ie6.ie7等 ...
- VisionTimer BUG && Start
void Start() { vp_Timer.In(0.0f, delegate() { Debug.Log("Start"); }, 10, 1.0f); } Version ...
- POJ2104 k-th number 划分树
又是不带修改的区间第k大,这次用的是一个不同的方法,划分树,划分树感觉上是模拟了快速排序的过程,依照pivot不断地往下划分,然后每一层多存一个toleft[i]数组,就可以知道在这一层里从0到i里有 ...
- iOS开发中@selector的理解
@selector 是什么? 1一种类型 SEL2代表你要发送的消息(方法), 跟字符串有点像, 也可以互转.: NSSelectorFromString() / NSSelectorFromStri ...
- lintcode:在O(1)时间复杂度删除链表节点
题目: 在O(1)时间复杂度删除链表节点 给定一个单链表中的表头和一个等待被删除的节点(非表头或表尾).请在在O(1)时间复杂度删除该链表节点.并在删除该节点后,返回表头. 样例 给定 1->2 ...
- 【mongoDB运维篇②】备份与恢复(导入与导出)
导入/导出可以操作的是本地的mongodb服务器,也可以是远程的服务器 所以,都有如下通用选项: -h host 主机 --port port 端口 -u username 用户名 -p passwd ...
- Generic repository pattern and Unit of work with Entity framework
原文 Generic repository pattern and Unit of work with Entity framework Repository pattern is an abstra ...
- SVN与Eclipse整合
SVN与Eclipse整合 下载SVN插件(http://subclipse.tigris.org) 我们使用版本eclipse_svn_site-1.6.5.zip 解压到一个文件夹中 进入ecli ...
- 深度分析Java的ClassLoader机制(源码级别)
写在前面:Java中的所有类,必须被装载到jvm中才能运行,这个装载工作是由jvm中的类装载器完成的,类装载器所做的工作实质是把类文件从硬盘读取到内存中,JVM在加载类的时候,都是通过ClassLoa ...