C語(yǔ)言自研定時(shí)器計(jì)劃任務(wù)語(yǔ)法詳解
為啥要自研
市面主流定時(shí)器計(jì)劃任務(wù)語(yǔ)法: cron ,但是使用起來(lái)非常難受,設(shè)計(jì)的比較非人性話語(yǔ)法,我想一般人都沒(méi)幾個(gè)記住的,都是靠在線生成工具進(jìn)行使用的,而且只能持續(xù)執(zhí)行不是有限執(zhí)行,下面舉幾個(gè)cron的案例:
具體想了解的可以自行百度,我試圖記住語(yǔ)法,但是因?yàn)樘靵y了,時(shí)間一長(zhǎng)就忘了,沒(méi)法只能到網(wǎng)上工具里生成,而且很多有限的場(chǎng)景沒(méi)法生成因?yàn)閏ron不支持只執(zhí)行幾次或者有規(guī)律的執(zhí)行,為了解決以上的問(wèn)題,我自己研究了一套(free time)定時(shí)器計(jì)劃任務(wù)語(yǔ)法
語(yǔ)法格式
語(yǔ)法: 0,0,7,0,0,0,0,- 長(zhǎng)度為8
對(duì)應(yīng)時(shí)間: 秒,分,時(shí),天,星期,月,年,執(zhí)行計(jì)劃
執(zhí)行計(jì)劃
數(shù)值: 執(zhí)行幾次
n: 循環(huán)執(zhí)行
^n: 時(shí)間乘階 2*2,4*2,8*2....
^數(shù)值: 時(shí)間乘階幾次 ^2 那么就是2*2,4*2
符號(hào)
~: 區(qū)間 1~4 那么就會(huì)執(zhí)行1,2,3,4
/: 間隔 2/5 那么從2開(kāi)始下次之后就從5開(kāi)始執(zhí)行
[]: 分段 [1,5,10,12] 分別在這幾個(gè)時(shí)間點(diǎn)執(zhí)行
模式
模式就是可以: 月底,月初,每周幾,星期末,年末,節(jié)假日等,(可以支持自定義擴(kuò)張需要對(duì)外提供生成器)
執(zhí)行計(jì)劃: m(循環(huán)執(zhí)行) ,m數(shù)值(有限執(zhí)行)
begin: 時(shí)間底(天底,周末,月底,年底)
end: 時(shí)間初(天初,周初,月初,年初)
point(?): 指定時(shí)間點(diǎn),指定每月5號(hào),每周3,每2天
以上是基礎(chǔ)模式,其他模式需要自定義(節(jié)假日,特殊日期等)
注意: 在模式的基礎(chǔ)上還可以配合時(shí)間比如: (每天2點(diǎn)1分10秒執(zhí)行)
語(yǔ)法演示
基本操作
都是以當(dāng)前時(shí)間為基準(zhǔn)進(jìn)行添加時(shí)間
當(dāng)前時(shí)間+1分鐘后執(zhí)行(執(zhí)行2次)
0,1,0,0,0,0,0,2
(2022-09-24 16:22:59,2022-09-24 16:23:59)
當(dāng)前時(shí)間+5小時(shí)后執(zhí)行(循環(huán)執(zhí)行)
0,0,5,0,0,0,0,n
(2022-09-24 21:23:09,2022-09-25 02:23:09)
當(dāng)前時(shí)間+1天后執(zhí)行
0,0,0,1,0,0,0,n
(2022-09-25 16:24:07,2022-09-26 16:24:07)
當(dāng)前時(shí)間+1星期(7天)后執(zhí)行
0,0,0,0,1,0,0,n
(2022-10-01 16:25:19,2022-10-08 16:25:19)
當(dāng)前時(shí)間加1天1小時(shí)1分1秒后執(zhí)行
1,1,1,1,0,0,0,2
(2022-09-25 17:38:57,2022-09-26 18:39:58)
當(dāng)前時(shí)間分鐘遞增執(zhí)行(循環(huán))
0,1,0,0,0,0,0,^n
當(dāng)前時(shí)間分鐘遞增執(zhí)行(次數(shù))
0,1,0,0,0,0,0,^2
符號(hào)操作
符號(hào)操作有~和[]以及/ 可以配合有限和循環(huán)n,不能使用遞增
區(qū)間執(zhí)行(循環(huán))
0,2~5,0,0,0,0,0,n(每2分鐘3分鐘…5分鐘各執(zhí)行一次,然后反復(fù))
間隔執(zhí)行
0,0,3/0,1,0,0,0,n (3小時(shí)后,每天執(zhí)行一次)
分段執(zhí)行
0,0,[2,5,8],0,0,0,0,n (當(dāng)前時(shí)間每2,5,8小時(shí)執(zhí)行一次,然后反復(fù))
符號(hào)操作還可以和基本操作組合,原理就是相加
0,10,[2,5,8],0,0,0,0,n(當(dāng)前時(shí)間每2,5,8小時(shí)加10分鐘執(zhí)行一次,然后反復(fù))
模式操作
在[年,月,星期,天,小時(shí),分支,秒]底執(zhí)行
年底執(zhí)行5次
0,0,0,0,0,0,end,mode5
(2023-12-31 23:59:59 ,2024-12-31 23:59:59)
月底執(zhí)行,一共執(zhí)行兩次
0,0,0,0,0,end,0,mode2
(2022-10-31 23:59:59,2022-11-31 23:59:59)
每個(gè)星期日底執(zhí)行(循環(huán))
0,0,0,0,end,0,0,mode
(2022-10-02 23:59:59,2022-10-09 23:59:59)
每天底執(zhí)行
0,0,0,end,0,0,0,mode
(2022-09-24 23:59:59 , 2022-09-25 23:59:59)
每小時(shí)底執(zhí)行
0,0,end,0,0,0,0,mode
(2022-09-23 15:59:59,2022-09-23 16:59:59)
每分鐘底執(zhí)行
0,end,0,0,0,0,0,mode
(2022-09-23 14:20:59,2022-09-23 14:21:59)
每秒底執(zhí)行
end,0,0,0,0,0,0,mode (可能看不出來(lái),所以當(dāng)做每秒執(zhí)行就行)
(2022-09-23 14:21:26,2022-09-23 14:22:25)
在[年,月,星期,天,小時(shí),分支,秒]初執(zhí)行
每年初執(zhí)行(2次)
0,0,0,0,0,0,begin,mode2
(2023-01-01 00:00:00, 2024-01-01 00:00:00)
沒(méi)月初執(zhí)行
0,0,0,0,0,begin,0,mode2
(2022-10-01 00:00:00, 2022-11-01 00:00:00)
每星期初執(zhí)行
0,0,0,0,begin,0,0,mode
(2022-09-26 00:00:00,2022-10-03 00:00:00)
每天初執(zhí)行
0,0,0,begin,0,0,0,mode
(2022-09-25 00:00:00,2022-09-26 00:00:00)
每小時(shí)初執(zhí)行
0,0,begin,0,0,0,0,mode
(2022-09-24 16:00:00,2022-09-24 17:00:00)
每分鐘初執(zhí)行
0,begin,0,0,0,0,0,mode
(2022-09-24 15:35:00,2022-09-24 15:36:00)
每秒鐘初執(zhí)行
begin,0,0,0,0,0,0,mode (可能看不出來(lái),所以當(dāng)做每秒執(zhí)行就行)
(2022-09-24 15:35:17,2022-09-24 15:35:18)
指定時(shí)間執(zhí)行
我們可以使用模式中的point(?) 來(lái)完成,而point除了在星期占位特殊可以指定下個(gè)星期幾執(zhí)行,在其他占位也是可以指定時(shí)間
每個(gè)星期2晚上11點(diǎn)執(zhí)行
0,0,point(23),0,point(2),0,0,mode
(2022-09-27 22:00:00,2022-10-04 22:00:00)
每天凌晨2點(diǎn)執(zhí)行
0,0,point(2),point(1),0,0,0,mode
(2022-09-25 02:00:00,2022-09-26 02:00:00)
模式組合
注意: end ,begin 和point 不能同時(shí)出現(xiàn),但是我們可以和基本模式作進(jìn)行混合
-59,1,-2,end,0,0,0,mode (每天晚上10點(diǎn)執(zhí)行)
0,0,8,begin,0,0,0,mode (每天早上8點(diǎn)執(zhí)行)
0,0,8,point(2),0,0,0,mode (每2天8點(diǎn)執(zhí)行)
頭文件
#ifndef STUDY_TIMER_RESOLVER_H #define STUDY_TIMER_RESOLVER_H #include "time_util.h" #include "../util/str_util.h" #include "assertmy.h" #include <stdio.h> #include <stdlib.h> //秒,分鐘,小時(shí),天,星期,月,年,執(zhí)行計(jì)劃 -,-,-,-,-,-,-,- 代表0秒,0分,0小時(shí),0天,星期,0月,0年,不執(zhí)行 typedef struct timer_resolver { char *second;//秒 0-59 char *minute;//分鐘 0-59 char *hour; //小時(shí)0-23 char *day; //天 1-31 char *week;//星期 0-6 char *month;//月份 1-12 char *year;//年 char *plan;//執(zhí)行計(jì)劃 -代表不執(zhí)行,n 循環(huán)執(zhí)行,數(shù)字代表執(zhí)行次數(shù) , ^n 階級(jí)執(zhí)行(^1 表示一階執(zhí)行,^2 表示二階執(zhí)行,^3 表示三階執(zhí)行...^n表示n階執(zhí)行) mode 代表執(zhí)行模式 mode2 代表模式執(zhí)行2次.... long timestamp;//時(shí)間戳 用于計(jì)算下次執(zhí)行時(shí)間 char *help;//協(xié)助計(jì)算的字段 CharHashMap *mode;//模式 } TimerResolver; typedef int (*ModeMethod)(char *item,int seat,TimerResolver *timerResolver); //自定義模式方法 TimerResolver *create_timer_resolver(char *time); void print_timer_resolver(TimerResolver *timerResolver); long resolver(TimerResolver *timerResolver); void switchStructure(TimerResolver *timerResolver); void add_timer_mode(TimerResolver *timerResolver, char *key, ModeMethod method); void print_format_resolver(TimerResolver *timerResolver, int n); #endif //STUDY_TIMER_RESOLVER_H
實(shí)現(xiàn)文件
#include "timer_resolver.h" char *get_return_data(char **data1); //獲取以當(dāng)前時(shí)間后指定年月日時(shí)分秒 long time_point_mode(char *item, int seat, TimerResolver *timerResolver) { //解析point(?)模式,取出?的值 int i = str_find(item, "("); item = str_substring(item, i + 1, str_length(item) - 2); if (seat == 0) { //加秒數(shù) return get_next_time_by_timestamp(timerResolver->timestamp, 0, 0, 0, 0, 0, str_to_int(item)); } else if (seat == 1) { //分鐘數(shù) return get_next_time_by_timestamp(timerResolver->timestamp, 0, 0, 0, 0, str_to_int(item), 0); } else if (seat == 2) { //小時(shí)數(shù) return get_next_time_by_timestamp(timerResolver->timestamp, 0, 0, 0, str_to_int(item), 0, 0); } else if (seat == 3) { //天數(shù) return get_next_time_by_timestamp(timerResolver->timestamp, 0, 0, str_to_int(item), 0, 0, 0); } else if (seat == 4) { //周n的日期 return get_next_week_of_day(timerResolver->timestamp, str_to_int(item)); } else if (seat == 5) { //月數(shù) return get_next_time_by_timestamp(timerResolver->timestamp, 0, str_to_int(item), 0, 0, 0, 0); } else if (seat == 6) { //年數(shù) return get_next_time_by_timestamp(timerResolver->timestamp, str_to_int(item), 0, 0, 0, 0, 0); } } // 判斷指定時(shí)間,初的時(shí)間 long time_begin_mode(char *item, int seat, TimerResolver *timerResolver) { if (seat == 0) { //秒數(shù) return get_start_time_of_next_second(timerResolver->timestamp); } else if (seat == 1) { //分鐘數(shù) return get_start_time_of_next_minute(timerResolver->timestamp); } else if (seat == 2) { //小時(shí)數(shù) return get_start_time_of_next_hour(timerResolver->timestamp); } else if (seat == 3) {// 天數(shù) return get_start_time_of_next_day(timerResolver->timestamp); } else if (seat == 4) {// 星期數(shù) return get_time_next_week_start(timerResolver->timestamp); } else if (seat == 5) {// 月數(shù) return get_start_time_of_next_month(timerResolver->timestamp); } else if (seat == 6) {// 年數(shù) return get_start_time_of_next_year(timerResolver->timestamp); } } // 判斷指定時(shí)間,末的時(shí)間 long time_end_mode(char *item, int seat, TimerResolver *timerResolver) { if (seat == 0) { //秒數(shù) return timerResolver->timestamp+59; } else if (seat == 1) { //分鐘數(shù)(如果當(dāng)前時(shí)間是59秒,則返回下一分鐘的59秒) return get_end_time_of_next_minute(timerResolver->timestamp) ; } else if (seat == 2) { //小時(shí)數(shù) return get_end_time_of_next_hour(timerResolver->timestamp) ; } else if (seat == 3) { //天數(shù) return get_end_time_of_next_day(timerResolver->timestamp) ; } else if (seat == 4) { //星期數(shù)(周末開(kāi)始時(shí)間) return get_end_time_of_next_week(timerResolver->timestamp); } else if (seat == 5) { //月數(shù) return get_end_time_of_next_month(timerResolver->timestamp) ; } else if (seat == 6) { //年數(shù) return get_end_time_of_next_year(timerResolver->timestamp) ; } } // 判斷是否有此模式 BOOL mode_exist(char *item, TimerResolver *timerResolver) { if(!str_contains(timerResolver->plan,"mode")){ return FALSE; } CharHashMapIterator *pIterator = createCharHashMapIterator(timerResolver->mode); while (hasNextCharHashMapIterator(pIterator)) { CharKvLinkedNode *pNode = nextCharHashMapIterator(pIterator); if (str_start_with(item,pNode->key )) {//如果匹配到模式,那么就轉(zhuǎn)換為統(tǒng)一結(jié)構(gòu)化格式 return TRUE; } } return FALSE; } //模式解析 long mode_timer(char *item, int seat, TimerResolver *timerResolver) { if (str_contains(timerResolver->plan, "mode")) { CharHashMapIterator *pIterator = createCharHashMapIterator(timerResolver->mode); while (hasNextCharHashMapIterator(pIterator)) { CharKvLinkedNode *pNode = nextCharHashMapIterator(pIterator); if (str_start_with(item,pNode->key)) {//如果匹配到模式 ModeMethod pVoid = (ModeMethod) pNode->value; return pVoid(item, seat, timerResolver);//執(zhí)行模式方法 } } } return 0;// 沒(méi)有匹配到模式 } //添加模式方法(如果執(zhí)行計(jì)劃為mode,則支持) void add_timer_mode(TimerResolver *timerResolver, char *key, ModeMethod method) { if (str_contains(timerResolver->plan, "mode")) { putCharHashMap(timerResolver->mode, key, method);//添加模式方法 } } void inside_add_timer_mode(TimerResolver *timerResolver) { if (str_contains(timerResolver->plan, "mode")) { add_timer_mode(timerResolver, "begin", time_begin_mode); add_timer_mode(timerResolver, "end", time_end_mode); add_timer_mode(timerResolver, "point", time_point_mode); } } //獲取下一次執(zhí)行時(shí)間,返回時(shí)間戳 long get_next_time(TimerResolver *timerResolver) { if (!timerResolver->plan) { return 0; } if (str_contains(timerResolver->plan, "mode")) { long mode_timer1 = mode_timer(get_return_data(&timerResolver->second), 0, timerResolver); timerResolver->timestamp+=get_time_difference_second(timerResolver->timestamp, mode_timer1); long mode_timer2 = mode_timer(get_return_data(&timerResolver->minute), 1, timerResolver); timerResolver->timestamp+=get_time_difference_second(timerResolver->timestamp,mode_timer2 ); long mode_timer3= mode_timer(get_return_data(&timerResolver->hour), 2, timerResolver); timerResolver->timestamp+=get_time_difference_second(timerResolver->timestamp,mode_timer3 ); long mode_timer4 = mode_timer(get_return_data(&timerResolver->day), 3, timerResolver); timerResolver->timestamp+=get_time_difference_second(timerResolver->timestamp, mode_timer4); long mode_timer5 = mode_timer(get_return_data(&timerResolver->week), 4, timerResolver); timerResolver->timestamp+=get_time_difference_second(timerResolver->timestamp, mode_timer5); long mode_timer6 = mode_timer(get_return_data(&timerResolver->month), 5, timerResolver); timerResolver->timestamp+=get_time_difference_second(timerResolver->timestamp, mode_timer6); long mode_timer7 = mode_timer(get_return_data(&timerResolver->year), 6, timerResolver); timerResolver->timestamp+=get_time_difference_second(timerResolver->timestamp, mode_timer7); } long current = timerResolver->timestamp; //獲取當(dāng)前時(shí)間 int second = str_to_int(get_return_data(&timerResolver->second)); int minute = str_to_int(get_return_data(&timerResolver->minute)); int hour = str_to_int(get_return_data(&timerResolver->hour)); int day = str_to_int(get_return_data(&timerResolver->day)); int week = str_to_int(get_return_data(&timerResolver->week)); int month = str_to_int(get_return_data(&timerResolver->month)); int year = str_to_int(get_return_data(&timerResolver->year)); long newTime = add_time_one(current, second, minute, hour, day, month, year, week ); timerResolver->timestamp = newTime; if(str_contains(timerResolver->plan,"mode")){ return newTime; }else{ return current; } } //解析字符串-,-,-,-,-,-,-,-并創(chuàng)建TimerResolver TimerResolver *create_timer_resolver(char *time) { if (time == NULL && strlen(time) == 0) { return NULL; } //去空 time = str_trim(time); //排除[]內(nèi)的,號(hào) int start = 0; while ((start = str_find_n(time, "[", start, str_length(time))) != -1) { int end = str_find_n(time, "]", start, str_length(time)); time = str_replace_all_n(time, ",", "@", start, end); start++; } TimerResolver *timerResolver = (TimerResolver *) malloc(sizeof(TimerResolver)); if (timerResolver == NULL) { return NULL; } CharList *pCharlist = str_split(time, ","); int str_len = pCharlist->len; if (str_len != 8) { char message[100]; sprintf(message, "create_timer_resolver語(yǔ)法錯(cuò)誤: %s ", time); assertError(message); } timerResolver->second = pCharlist->str[0]; timerResolver->minute = pCharlist->str[1]; timerResolver->hour = pCharlist->str[2]; timerResolver->day = pCharlist->str[3]; timerResolver->week = pCharlist->str[4]; timerResolver->month = pCharlist->str[5]; timerResolver->year = pCharlist->str[6]; timerResolver->timestamp = get_current_timestamp();//獲取當(dāng)前時(shí)間戳 //執(zhí)行計(jì)劃 -代表不執(zhí)行,n 循環(huán)執(zhí)行,數(shù)字代表執(zhí)行次數(shù) , ^n 階級(jí)執(zhí)行(^1 表示一階執(zhí)行,^2 表示二階執(zhí)行,^3 表示三階執(zhí)行...^n表示n階執(zhí)行) timerResolver->plan = str_compare(pCharlist->str[7], "-") ? "0" : pCharlist->str[7]; timerResolver->help = "{}"; timerResolver->mode = createCharHashMap(10); //添加模式方法 inside_add_timer_mode(timerResolver); //轉(zhuǎn)換為結(jié)構(gòu)化格式 switchStructure(timerResolver); //計(jì)算本次執(zhí)行時(shí)間 if(!str_contains(timerResolver->plan,"mode")){ get_next_time(timerResolver); } return timerResolver; } //打印TimerResolver,格式為-,-,-,-,-,-,-,- void print_timer_resolver(TimerResolver *timerResolver) { printf("%s,%s,%s,%s,%s,%s,%s,%s\n", timerResolver->second, timerResolver->minute, timerResolver->hour, timerResolver->day, timerResolver->week, timerResolver->month, timerResolver->year, timerResolver->plan); } //執(zhí)行n次定時(shí)器并且打印效果 void print_format_resolver(TimerResolver *timerResolver, int n) { for (int i = 0; i < n; ++i){ long i1 = resolver(timerResolver); char *string = format_time(i1, "%Y-%m-%d %H:%M:%S"); printf("%ld---%s\n",i1,string); } } //解析定時(shí)器語(yǔ)法,并且生成下次執(zhí)行時(shí)間,如果返回0,則此語(yǔ)法已經(jīng)執(zhí)行結(jié)束了,可以刪除對(duì)應(yīng)的定時(shí)器了 long resolver(TimerResolver *timerResolver) { //判斷是否可執(zhí)行 if (str_equals(timerResolver->plan,"0") ) {//不執(zhí)行 return 0; } if (str_compare(timerResolver->plan, "n")) {//循環(huán)執(zhí)行 return get_next_time(timerResolver); } //階級(jí)執(zhí)行 if (str_start_with(timerResolver->plan, "^")) { CharHashMap *pMapSecond = str_to_json_map(timerResolver->second); putCharHashMap(pMapSecond, "return", int_to_str(str_to_int(get_return_data(&timerResolver->second)) * 2)); timerResolver->second = map_to_json_str(pMapSecond); CharHashMap *pMapMinute = str_to_json_map(timerResolver->minute); putCharHashMap(pMapMinute, "return", int_to_str(str_to_int(get_return_data(&timerResolver->minute)) * 2)); timerResolver->minute = map_to_json_str(pMapMinute); CharHashMap *pMapHour = str_to_json_map(timerResolver->hour); putCharHashMap(pMapHour, "return", int_to_str(str_to_int(get_return_data(&timerResolver->hour)) * 2)); timerResolver->hour = map_to_json_str(pMapHour); CharHashMap *pMapDay = str_to_json_map(timerResolver->day); putCharHashMap(pMapDay, "return", int_to_str(str_to_int(get_return_data(&timerResolver->day)) * 2)); timerResolver->hour = map_to_json_str(pMapDay); CharHashMap *pMapWeek = str_to_json_map(timerResolver->week); putCharHashMap(pMapWeek, "return", int_to_str(str_to_int(get_return_data(&timerResolver->week)) * 2)); timerResolver->week = map_to_json_str(pMapWeek); CharHashMap *pMapMonth = str_to_json_map(timerResolver->month); putCharHashMap(pMapMonth, "return", int_to_str(str_to_int(get_return_data(&timerResolver->month)) * 2)); timerResolver->month = map_to_json_str(pMapMonth); CharHashMap *pMapYear = str_to_json_map(timerResolver->year); putCharHashMap(pMapYear, "return", int_to_str(str_to_int(get_return_data(&timerResolver->year)) * 2)); timerResolver->year = map_to_json_str(pMapYear); char *string = str_substring(timerResolver->plan, 1, str_length(timerResolver->plan)); if (str_compare(string, "n")) { //如果是n那么就是循環(huán)執(zhí)行 return get_next_time(timerResolver); } if (str_is_number(string)) {//如果是數(shù)字,那么就是有限階級(jí)執(zhí)行 if (str_compare(string, "0")) { return 0; } char *one = str_calculate_one(string, "--"); timerResolver->plan = str_concat(2, "^", one); return get_next_time(timerResolver); } } //模式執(zhí)行 if (str_start_with(timerResolver->plan, "mode")) { timerResolver->timestamp= get_start_time_of_day(timerResolver->timestamp );// 初始化為當(dāng)天的開(kāi)始時(shí)間 ,然后在后面的計(jì)算中,加上指定的時(shí)間 if (str_length(timerResolver->plan) == 4) { //循環(huán)執(zhí)行 return get_next_time(timerResolver); } else { char *string = str_substring(timerResolver->plan, 4, str_length(timerResolver->plan)); if (str_is_number(string)) {//如果是數(shù)字,那么就是有限階級(jí)執(zhí)行 if (str_compare(string, "0")) { return 0; } char *one = str_calculate_one(string, "--"); timerResolver->plan = str_concat(2, "mode", one); return get_next_time(timerResolver); } else { assertError(formatStr("mode解析錯(cuò)誤非法字符(必須是mode+數(shù)字):%s\n", timerResolver->plan)); } } } //有限執(zhí)行 if (str_is_number(timerResolver->plan)) { int plan = str_to_int(timerResolver->plan); if (plan > 0) { timerResolver->plan = int_to_str(plan - 1); return get_next_time(timerResolver); } } } //分段[]解析 char *section_analysis(char *item, TimerResolver *timerResolver) { //在幫助里存儲(chǔ)當(dāng)前的次數(shù) CharHashMap *pMap = str_to_json_map(timerResolver->help); if (!containsKeyCharHashMap(pMap, "basicsPlan")) { putCharHashMap(pMap, "basicsPlan", timerResolver->plan); timerResolver->help = map_to_json_str(pMap); } //將[]里面的@轉(zhuǎn)換為,號(hào) item = str_replace_all_n(item, "@", ",", 0, str_length(item)); CharList *pCharlist = str_to_json_array(item); //驗(yàn)證是否都是數(shù)字 for (int i = 0; i < pCharlist->len; ++i) { if (!str_is_number(pCharlist->str[i])) { assertError(formatStr("[]解析錯(cuò)誤非法字符(必須是數(shù)字):%s\n", pCharlist->str[i])); } } char *string = str_concat(11, "{", "type:[]", ",", "data:", item, ",", "index:0", ",", "return:", pCharlist->str[0], "}"); //添加執(zhí)行的次數(shù) CharHashMap *pMap1 = str_to_json_map(timerResolver->help); char *basicsPlan = getCharHashMap(pMap1, "basicsPlan"); if(str_equals(basicsPlan,"n")||str_start_with(basicsPlan,"^")){ timerResolver->plan = timerResolver->plan; }else{ if (str_equals(timerResolver->plan, basicsPlan)) { timerResolver->plan = int_to_str(pCharlist->len * str_to_int(basicsPlan)); } else { timerResolver->plan = int_to_str( str_to_int(timerResolver->plan) + (pCharlist->len * str_to_int(basicsPlan))); } } return string; } //區(qū)間解析 符號(hào)為~ ,位置1表示秒,2表示分支,3表示小時(shí),4表示天,5表示星期,6表示月,7表示年 char *range_analysis(char *item, TimerResolver *timerResolver) { //在幫助里存儲(chǔ)當(dāng)前的次數(shù) CharHashMap *pMap = str_to_json_map(timerResolver->help); if (!containsKeyCharHashMap(pMap, "basicsPlan")) { putCharHashMap(pMap, "basicsPlan", timerResolver->plan); timerResolver->help = map_to_json_str(pMap); } CharList *pCharlist = str_split(item, "~"); //驗(yàn)證是否都是數(shù)字 for (int i = 0; i < pCharlist->len; ++i) { if (!str_is_number(pCharlist->str[i])) { assertError(formatStr("~解析錯(cuò)誤非法字符(必須是數(shù)字):%s\n", pCharlist->str[i])); } } CharList *range = get_range(pCharlist->str[0], pCharlist->str[1]); char *data = array_to_json_str(range); char *string = str_concat(11, "{", "type:~", ",", "data:", data, ",", "index:0", ",", "return:", range->str[0], "}"); //添加執(zhí)行的次數(shù) CharHashMap *pMap1 = str_to_json_map(timerResolver->help); char *basicsPlan = getCharHashMap(pMap1, "basicsPlan"); if(str_equals(basicsPlan,"n")||str_start_with(basicsPlan,"^")){ timerResolver->plan = timerResolver->plan; }else{ if (str_equals(timerResolver->plan, basicsPlan)) { timerResolver->plan = int_to_str(range->len * str_to_int(basicsPlan)); } else { timerResolver->plan = int_to_str(str_to_int(timerResolver->plan) + (range->len * str_to_int(basicsPlan))); } } return string; } //間隔/ 解析 (5/2)表示從5開(kāi)始,每隔2個(gè)數(shù) 執(zhí)行一次 char *interval_analysis(char *item, TimerResolver *timerResolver) { //在幫助里存儲(chǔ)當(dāng)前的次數(shù) CharHashMap *pMap = str_to_json_map(timerResolver->help); if (!containsKeyCharHashMap(pMap, "basicsPlan")) { putCharHashMap(pMap, "basicsPlan", timerResolver->plan); timerResolver->help = map_to_json_str(pMap); } CharList *pCharlist = str_split(item, "/"); //驗(yàn)證是否都是數(shù)字 for (int i = 0; i < pCharlist->len; ++i) { if (!str_is_number(pCharlist->str[i])) { assertError(formatStr("/解析錯(cuò)誤非法字符(必須是數(shù)字):%s\n", pCharlist->str[i])); } } char *data = str_concat(5, "[", pCharlist->str[0], ",", pCharlist->str[1], "]"); char *string = str_concat(11, "{", "type:/", ",", "data:", data, ",", "index:0", ",", "return:", pCharlist->str[0], "}"); //添加執(zhí)行的次數(shù) CharHashMap *pMap1 = str_to_json_map(timerResolver->help); char *basicsPlan = getCharHashMap(pMap1, "basicsPlan"); if(str_equals(basicsPlan,"n")||str_start_with(basicsPlan,"^")){ timerResolver->plan = timerResolver->plan; }else{ if (str_equals(timerResolver->plan, basicsPlan)) { timerResolver->plan = int_to_str(str_to_int(basicsPlan) + 1); } } return string; } char *mode_analysis(char *item, TimerResolver *timerResolver) { CharHashMapIterator *pIterator = createCharHashMapIterator(timerResolver->mode); while (hasNextCharHashMapIterator(pIterator)) { CharKvLinkedNode *pNode = nextCharHashMapIterator(pIterator); if (str_start_with(item,pNode->key)) {//如果匹配到模式,那么就轉(zhuǎn)換為統(tǒng)一結(jié)構(gòu)化格式 char *string = str_concat(6, "{", "type:mode", ",", "return:", item, "}"); return string; } } assertError(formatStr("mode模式解析錯(cuò)誤沒(méi)有找到對(duì)應(yīng)的模式-請(qǐng)檢查模式是否自定義-并且添加到模式集中:%s\n", item)); } //普通解析 char *normal_analysis(char *item) { if (str_is_number(item)) { char *string = str_concat(6, "{", "type:number", ",", "return:", item, "}"); return string; } assertError(formatStr("解析錯(cuò)誤,無(wú)法解析的表達(dá)式:%s\n", item)); } //獲取結(jié)構(gòu)化數(shù)據(jù)的返回?cái)?shù)據(jù) char *get_return_data(char **data1) { char *data = *data1; //判斷是否是字典格式 if (str_is_map(data)) { //解析字典 CharHashMap *pMap = str_to_json_map(data); //獲取類型 char *type = getCharHashMap(pMap, "type"); //如果類型是[] if (str_compare(type, "[]")) { //如果是[]類型 那么就是分段 例如 [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24] //獲取data char *data = getCharHashMap(pMap, "data"); //獲取index char *index = getCharHashMap(pMap, "index"); //獲取返回?cái)?shù)據(jù) char *returnData = getCharHashMap(pMap, "return"); //獲取數(shù)組 //將[]里面的@轉(zhuǎn)換為,號(hào) CharList *pCharlist = str_to_json_array(data); //獲取下一個(gè)值 int nextIndex = str_to_int(index) + 1; //判斷是否超出數(shù)組長(zhǎng)度,如果超出長(zhǎng)度,從頭開(kāi)始 if (nextIndex >= pCharlist->len) { //超出長(zhǎng)度,返回空 nextIndex = 0; } //獲取下一個(gè)值 char *nextValue = pCharlist->str[nextIndex]; //設(shè)置返回?cái)?shù)據(jù) putCharHashMap(pMap, "return", nextValue); //設(shè)置index putCharHashMap(pMap, "index", int_to_str(nextIndex)); //修改原數(shù)據(jù) *data1 = map_to_json_str(pMap); //返回?cái)?shù)據(jù) return returnData; } else if (str_compare(type, "~")) { //如果類型是~ 那么就是區(qū)間 1~5 表示1,2,3,4,5 //如果類型是~ //獲取data char *data = getCharHashMap(pMap, "data"); //獲取index char *index = getCharHashMap(pMap, "index"); //獲取返回?cái)?shù)據(jù) char *returnData = getCharHashMap(pMap, "return"); //獲取數(shù)組 CharList *pCharlist = str_to_json_array(data); //獲取下一個(gè)值 int nextIndex = str_to_int(index) + 1; //判斷是否超出數(shù)組長(zhǎng)度,如果超出長(zhǎng)度,從頭開(kāi)始 if (nextIndex >= pCharlist->len) { nextIndex = 0; } //獲取下一個(gè)值 char *nextValue = pCharlist->str[nextIndex]; //設(shè)置返回?cái)?shù)據(jù) putCharHashMap(pMap, "return", nextValue); //設(shè)置index putCharHashMap(pMap, "index", int_to_str(nextIndex)); //修改原數(shù)據(jù) *data1 = map_to_json_str(pMap); //返回?cái)?shù)據(jù) return returnData; } else if (str_compare(type, "/")) { // 如果類型是/ (5/2)表示從5開(kāi)始,每隔2個(gè)數(shù) 執(zhí)行一次 //如果類型是/ //獲取data char *data = getCharHashMap(pMap, "data"); //獲取index char *index = getCharHashMap(pMap, "index"); //獲取返回?cái)?shù)據(jù) char *returnData = getCharHashMap(pMap, "return"); int nextIndex = str_to_int(index) + 1; if (nextIndex == 1) { //獲取數(shù)組 CharList *pCharlist = str_to_json_array(data); //判斷index是否是1,如果是1,取第二個(gè)值,并且轉(zhuǎn)換為普通結(jié)構(gòu) char *string = str_concat(6, "{", "type:number", ",", "return:", pCharlist->str[nextIndex], "}"); *data1 = string; } return returnData; } else if (str_compare(type, "number")) { //如果類型是number,那么獲取return char *returnData = getCharHashMap(pMap, "return"); return returnData; }else if (str_compare(type, "mode")) { //如果類型是mode,那么獲取return char *returnData = getCharHashMap(pMap, "return"); return returnData; } } assertError(formatStr("解析錯(cuò)誤不是結(jié)構(gòu)化數(shù)據(jù): %s\n", data)); } //定時(shí)器語(yǔ)法轉(zhuǎn)換為結(jié)構(gòu)化格式 void switchStructure(TimerResolver *timerResolver) { //秒 if (str_contains(timerResolver->second, "[")) { timerResolver->second = section_analysis(timerResolver->second, timerResolver); } else if (str_contains(timerResolver->second, "~")) { timerResolver->second = range_analysis(timerResolver->second, timerResolver); } else if (str_contains(timerResolver->second, "/")) { timerResolver->second = interval_analysis(timerResolver->second, timerResolver); } else if (mode_exist(timerResolver->second, timerResolver)) { timerResolver->second = mode_analysis(timerResolver->second, timerResolver); } else { timerResolver->second = normal_analysis(timerResolver->second); } //分 if (str_contains(timerResolver->minute, "[")) { timerResolver->minute = section_analysis(timerResolver->minute, timerResolver); } else if (str_contains(timerResolver->minute, "~")) { timerResolver->minute = range_analysis(timerResolver->minute, timerResolver); } else if (str_contains(timerResolver->minute, "/")) { timerResolver->minute = interval_analysis(timerResolver->minute, timerResolver); } else if (mode_exist(timerResolver->minute, timerResolver)) { timerResolver->minute = mode_analysis(timerResolver->minute, timerResolver); } else { timerResolver->minute = normal_analysis(timerResolver->minute); } //時(shí) if (str_contains(timerResolver->hour, "[")) { timerResolver->hour = section_analysis(timerResolver->hour, timerResolver); } else if (str_contains(timerResolver->hour, "~")) { timerResolver->hour = range_analysis(timerResolver->hour, timerResolver); } else if (str_contains(timerResolver->hour, "/")) { timerResolver->hour = interval_analysis(timerResolver->hour, timerResolver); } else if (mode_exist(timerResolver->hour, timerResolver)) { timerResolver->hour = mode_analysis(timerResolver->hour, timerResolver); } else { timerResolver->hour = normal_analysis(timerResolver->hour); } //日 if (str_contains(timerResolver->day, "[")) { timerResolver->day = section_analysis(timerResolver->day, timerResolver); } else if (str_contains(timerResolver->day, "~")) { timerResolver->day = range_analysis(timerResolver->day, timerResolver); } else if (str_contains(timerResolver->day, "/")) { timerResolver->day = interval_analysis(timerResolver->day, timerResolver); } else if (mode_exist(timerResolver->day, timerResolver)) { timerResolver->day = mode_analysis(timerResolver->day, timerResolver); } else { timerResolver->day = normal_analysis(timerResolver->day); } //周 if (str_contains(timerResolver->week, "[")) { timerResolver->week = section_analysis(timerResolver->week, timerResolver); } else if (str_contains(timerResolver->week, "~")) { timerResolver->week = range_analysis(timerResolver->week, timerResolver); } else if (str_contains(timerResolver->week, "/")) { timerResolver->week = interval_analysis(timerResolver->week, timerResolver); } else if (mode_exist(timerResolver->week, timerResolver)) { timerResolver->week = mode_analysis(timerResolver->week, timerResolver); } else { timerResolver->week = normal_analysis(timerResolver->week); } //月 if (str_contains(timerResolver->month, "[")) { timerResolver->month = section_analysis(timerResolver->month, timerResolver); } else if (str_contains(timerResolver->month, "~")) { timerResolver->month = range_analysis(timerResolver->month, timerResolver); } else if (str_contains(timerResolver->month, "/")) { timerResolver->month = interval_analysis(timerResolver->month, timerResolver); } else if (mode_exist(timerResolver->month, timerResolver)) { timerResolver->month = mode_analysis(timerResolver->month, timerResolver); } else { timerResolver->month = normal_analysis(timerResolver->month); } //年 if (str_contains(timerResolver->year, "[")) { timerResolver->year = section_analysis(timerResolver->year, timerResolver); } else if (str_contains(timerResolver->year, "~")) { timerResolver->year = range_analysis(timerResolver->year, timerResolver); } else if (str_contains(timerResolver->year, "/")) { timerResolver->year = interval_analysis(timerResolver->year, timerResolver); } else if (mode_exist(timerResolver->year, timerResolver)) { timerResolver->year = mode_analysis(timerResolver->year, timerResolver); } else { timerResolver->year = normal_analysis(timerResolver->year); } } //釋放TimerResolver void free_timer_resolver(TimerResolver *timerResolver) { free(timerResolver); }
以上就是C語(yǔ)言自研定時(shí)器計(jì)劃任務(wù)語(yǔ)法詳解的詳細(xì)內(nèi)容,更多關(guān)于C語(yǔ)言定時(shí)器的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Qt QChart 創(chuàng)建圖表的實(shí)現(xiàn)方法
這篇文章主要介紹了Qt QChart 創(chuàng)建圖表的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12C++使用郵件槽實(shí)現(xiàn)ShellCode跨進(jìn)程傳輸
在計(jì)算機(jī)安全領(lǐng)域,進(jìn)程間通信(IPC)一直是一個(gè)備受關(guān)注的話題,在本文中,我們將探討如何使用Windows郵件槽(Mailslot)實(shí)現(xiàn)ShellCode的跨進(jìn)程傳輸,需要的可以參考下2023-12-12C++實(shí)現(xiàn)LeetCode(85.最大矩形)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(85.最大矩形),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07C語(yǔ)言行優(yōu)先和列優(yōu)先的問(wèn)題深入分析
這篇文章主要介紹了C語(yǔ)言行優(yōu)先和列優(yōu)先的問(wèn)題深入分析的相關(guān)資料,需要的朋友可以參考下2017-01-01