今天组长交给我一个很无聊的任务,让我将一个包含很多.c源文件的目录上传到模拟器,然后修改一下里面的内容。
要求是必须每个给每个.c文件新建一个目录。。里面有十几个文件。。。
一个个的mkdir太麻烦了吧。于是手写了个python脚本。gendir.py 内容如下:
import os
import shutil
listdir = os.listdir('test_code')
for files in listdir:
os.makedirs(files[0:len(files)-2])
for files in listdir:
shutil.move('test_code/'+files,files[0:len(files)-2]+'/')
shutil.copy('SYSPrint.c',files[0:len(files)-2]+'/')
shutil.copy('SYSPrint.h',files[0:len(files)-2]+'/')
聪明的你看出来了 所有的文件之前放载test_code下面
我上传完之后,发现我们的模拟器没有print函数,于是手写了一个
SYSPrint.h
#include<stdarg.h>
typedef unsigned int U32;
void pchar(char c);
void print_num(U32 num, U32 base);
void print2(char *fmt,...);
SYSPrint.c
#include"SYSPrint.h"
U32 *const output = (U32*)0x80000070;
const char charlist[16] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f' };
void pchar(char c){
*output = c;
}
void print_num(U32 num, U32 base){
U32 a;
if((a = num / base) != 0){
print_num(a,base);
}
pchar(charlist[num%base]);
}
void print2(char *fmt,...){
va_list ap;
char *p, *sval;
int ival;
va_start(ap,fmt);
for(p = fmt; *p ; p++){
if(*p != '%'){
pchar(*p);
continue;
}
switch(*++p){
case 'd':
case 'i':
ival = va_arg(ap,int);
if(ival < 0){
pchar('-');
ival = -ival;
}
print_num(ival,10);
break;
case 'o':
case 'u':
case 'x':
ival = va_arg(ap,int);
print_num(ival,*p == 'o' ? 8u : *p == 'u' ? 10u : 16u);
break;
case 's':
for(sval = va_arg(ap,char*); *sval; sval++){
pchar(*sval);
}
break;
default:
pchar(*p);
break;
}
}
va_end(ap);
}
然后我想去修改一下刚刚这些文件包含的源文件可是惊奇的发现之前的头文件是这么包含的
#include"SYSPrint.c"
咋能包含.c文件呢,于是我打算修改一下 :
#include"SYSPrint.h"
十几个文件,感觉好无聊。一个个的修改,于是想到了shell,sed的用法:
sed -i 's/SYSPrint.c/SYSPrint.h/g' test_*/*.c
然后就都修改了,我只能说sed 和awk的命令的厉害之处,难怪各大公司都喜欢问,好好学习一下吧。
用学过的东西 解决无聊的问题,也算一种乐趣。