Это мой первый пост на этом форуме. Я прочитал правила и постараюсь их придерживаться, но прошу прощения, если что-то упущу. Код, который я публикую, предназначен для дублирования вывода «date -u» в ОС XV6. Он делает это, за исключением дат до 1700-х годов (это не имело отношения к задаче, и математика немного отличается от того, что я читал). Моя цель в этом посте — получить совет по улучшению кода с точки зрения безопасности и производительности, с акцентом на лучшие практики, которые я могу обобщить для будущего кода C (я понимаю, что это может быть не так выполнимо для чего-то, предназначенного для запуска в XV6. ). Приветствуются советы как по моему коду, так и по лучшим методам публикации здесь!
#include "types.h"
#include "stat.h"
#include "user.h"
#include "date.h"
int check_leap(int year);
void print_day(int year, int month, int day);
void print_month(int month);
int month_key(int month);
int
main(void)
{
struct rtcdate current_date;
if(date(¤t_date) != 0)
exit();
print_day(current_date.year, current_date.month, current_date.day);
print_month(current_date.month);
printf(1, " %d",current_date.day);
printf(1," %d:%d:%d", current_date.hour, current_date.minute, current_date.second);
printf(1," %d", current_date.year);
printf(1," UTCn");
exit();
}
int
check_leap(int year)
{
if(year % 4 == 0)
{
if(year % 100 == 0)
{
if(year % 400 == 0)
return 1; //Leap year
}
}
return 0;
}
int
month_key(int month)
{
int key;
switch (month)
{
case 1: key = 1;
break;
case 2: key = 4;
break;
case 3: key = 4;
break;
case 4: key = 0;
break;
case 5: key = 2;
break;
case 6: key = 5;
break;
case 7: key = 0;
break;
case 8: key = 3;
break;
case 9: key = 6;
break;
case 10: key = 1;
break;
case 11: key = 4;
break;
case 12: key = 6;
break;
default: key = -1;
break;
}
return key;
}
void
print_day(int year, int month, int day)
{
int week_day;
int decade = year % 100;
int century = year / 100;
int leap = check_leap(year);
int key = month_key(month);
if(key < 0)
{
printf(1, "%s", "Invalid value for month!n");
exit();
}
week_day = decade / 4;
week_day += day;
week_day += key;
if((leap) && ((month == 1) || (month == 2)))
{
week_day -= 1;
}
switch (century)
{
case 17: week_day += 4;
break;
case 18: week_day += 2;
break;
case 19: break;
case 20: week_day += 6;
break;
default: printf(1, "%s", "Centuries before 1700 or after 2000 not yet supported. n");
break;
}
week_day += decade;
week_day = (week_day % 7) - 1;
if(week_day < 0 || week_day > 6)
{
printf(1, "Invalid Day error!"); //TS code- to be removed
}
switch(week_day)
{
case 0: printf(1, "Sun ");
break;
case 1: printf(1, "Mon ");
break;
case 2: printf(1, "Tue ");
break;
case 3: printf(1, "Wed ");
break;
case 4: printf(1, "Thu ");
break;
case 5: printf(1, "Fri ");
break;
case 6: printf(1, "Sat ");
break;
default: printf(1, "Unknown day!");
break;
}
return;
}
void
print_month(int month)
{
switch (month)
{
case 1: printf(1, "Jan");
break;
case 2: printf(1, "Feb");
break;
case 3: printf(1, "Mar");
break;
case 4: printf(1, "Apr");
break;
case 5: printf(1, "May");
break;
case 6: printf(1, "Jun");
break;
case 7: printf(1, "Jul");
break;
case 8: printf(1, "Aug");
break;
case 9: printf(1, "Sep");
break;
case 10: printf(1, "Oct");
break;
case 11: printf(1, "Nov");
break;
case 12: printf(1, "Dec");
break;
default: printf(1, "Month Error");
break;
}
return;
}
```
