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 ...
随机推荐
- ios 图形学习笔记
一.显示文本: 1.UIFont,用于设置显示的字体 初始化方法:fontNamesForFamilyName:(类方法) fontWithName:size:(类方法) 2.绘制文本的方法: NSS ...
- UVA 10720 Graph Construction 贪心+优先队列
题目链接: 题目 Graph Construction Time limit: 3.000 seconds 问题描述 Graph is a collection of edges E and vert ...
- 编写一个小程序,从标准输入读入一系列string对象,寻找连续重复出现的单词。程序应该找出满足一下条件的单词:该单词的后面紧接着再次出现自己本身。跟踪重复次数最多的单词及其重复次数,输出.
// test13.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...
- Maven开源中国镜像
mirrors> <mirror> <id>nexus-osc</id> <mirrorOf>central</mirrorOf> ...
- hadoop+hbase
hadoop的配置见下面这篇文章 http://www.powerxing.com/install-hadoop-2-4-1-single-node/ Hadoop安装教程_单机/伪分布式配置_Had ...
- Git fetch和git pull的区别(转)
原文: http://www.tech126.com/git-fetch-pull/ Git中从远程的分支获取最新的版本到本地有这样2个命令:1. git fetch:相当于是从远程获取最新版本到本地 ...
- Mac 如果一定要写个锁屏程序的话就这样
package test; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import ...
- lintcode 中等题:Majority number II 主元素 II
题目 主元素II 给定一个整型数组,找到主元素,它在数组中的出现次数严格大于数组元素个数的三分之一. 样例 给出数组[1,2,1,2,1,3,3] 返回 1 注意 数组中只有唯一的主元素 挑战 要求时 ...
- Python中Lambda, filter, reduce and map 的区别
Lambda, filter, reduce and map Lambda Operator Some like it, others hate it and many are afraid of t ...
- lintcode:Fibonacci 斐波纳契数列
题目: 斐波纳契数列 查找斐波纳契数列中第 N 个数. 所谓的斐波纳契数列是指: 前2个数是 0 和 1 . 第 i 个数是第 i-1 个数和第i-2 个数的和. 斐波纳契数列的前10个数字是: 0, ...