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 ...
随机推荐
- Socket 阻塞模式和非阻塞模式
阻塞I/O模型: 简介:进程会一直阻塞,直到数据拷贝 完成 应用程序调用一个IO函数,导致应用程序阻塞,等待数据准备好. 如果数据没有准备好,一直等待….数据准备好了,从内核拷贝到用户空间,IO函数返 ...
- iOS上的jQuery.on()冒泡事件绑定 以及 iOS绝对定位元素中的输入框
上周遇到两个坑. 一是jQuery的on方法 事件冒泡,在iOS中有问题. $("body").on("click",".contentup" ...
- 《head first java 》读书笔记(五)
Updated 2014/04/09 P581--P615 如何组织.包装与部署Java程序. 部署的选择 本机: Executable Jar 两者之间的结合: Web Start, RMI app ...
- LVS+Keepalived实现高可用集群
LVS+Keepalived实现高可用集群来源: ChinaUnix博客 日期: 2009.07.21 14:49 (共有条评论) 我要评论 操作系统平台:CentOS5.2软件:LVS+keepal ...
- C#中sealed关键字
C#中sealed关键字 1. sealed关键字 当对一个类应用 sealed 修饰符时,此修饰符会阻止其他类从该类继承.类似于Java中final关键字. 在下面的示例中,类 B ...
- javascript背景淡入淡出
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- zend studio 10破解/汉化(转发)
转发:http://blog.csdn.net/qq1355541448/article/details/16807429 Zend Studio 10正式版破解及汉化 2013年03月12日 ⁄ P ...
- SQLite数据库的体系结构(翻译自sqlite.org)
$1 简介 本文档描述了SQLite库的体系结构,这些信息对那些想理解和修改SQLite的内部工作机制的人是有用的. 下图显示了SQLite的主要组成部件及其相互关系,下面的内容将描述每一 ...
- 开源调度框架Quartz最佳实践
开源调度框架Quartz最佳实践 Quartz是一个Java调度框架,当前的最新版本为2.2.1. 以Quartz 2.2.1版为例,Quartz最佳实践(用于生产系统)总结如下: 1.跳过更新检查Q ...
- Spring两种实现AOP的方式
有两种实现AOP的方式:xml配置文件的方式和注解的形式 我们知道通知Advice是指对拦截到的方法做什么事,可以细分为 前置通知:方法执行之前执行的行为. 后置通知:方法执行之后执行的行为. 异常通 ...