⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 http_file.c

📁 网页的客户端开发
💻 C
📖 第 1 页 / 共 2 页
字号:
						int		iSize;
						LPSTR	pszHtml;

						iSize = http_read (hf, &pszHtml);
						http_close (hf);
						if (iSize != -1)
						{
							pEnvir->ulSizeOut = (ULONG) iSize;
							pEnvir->pszOutData = pszHtml;
						}
						else
							iRet = CGI_Unavailable;
					}
				}
				else
					iRet = CGI_InternalError;
		}
	}
	else
		if (iRet == CGI_GenericError)
		{
			if (pEnvir->pszOutData != NULL)
			{
				LPSTR	psz;

				pEnvir->ulSizeOut = strlen (szGenericError_head) + 
				                    strlen (szGenericError_tail) +
				                    strlen (pEnvir->pszOutData);
				psz = (LPSTR)httpd_malloc (pEnvir->ulSizeOut + 100);
				if (psz == NULL)
				{
					iRet = CGI_Unavailable;
					httpd_free (pEnvir->pszOutData);
					iRet = CGI_InternalError;
				}
				else
				{
					// sprintf (psz, szGenericError, pEnvir->pszOutData);
					// httpd_free (pEnvir->pszOutData);
					strcpy(psz, szGenericError_head);
					strcat(psz,pEnvir->pszOutData);
					strcat(psz, szGenericError_tail);
					
					pEnvir->pszOutData = psz;
					pEnvir->ulSizeOut = strlen (psz);
					iRet = 0;
				}
			}
			else
				iRet = CGI_InternalError;
		}
	return iRet;
}

int BinarySearch (LPSTR pszTarget, PFNCOMPARE pfnCompare, int iTotal)
{
	if (iTotal)
	{
		int	iMin = 0, iMax = iTotal - 1, iMid, iResult;
		while (iMax >= iMin)
		{
			iMid = (iMin + iMax) / 2;
			iResult = (*pfnCompare)(pszTarget, iMid);
			if (iResult == 0)
				return iMid;
			else
				if (iResult < 0)
					iMin = iMid + 1;
				else
					iMax = iMid - 1;
		}
	}
	return -1;
}

LPSTR http_envir_get_string (LPSTR pszEnvir, LPSTR pszStr)
{
	int		i = strlen (pszStr);

	while (*pszEnvir != 0)
	{
		if (strncmp (pszEnvir, pszStr, i) == 0)
			return (pszEnvir + i + 1);
		pszEnvir += strlen (pszEnvir) + 1;
	}
	return NULL;
}

RESULT http_envir_get_ulong (LPSTR pszEnvir, LPSTR pszStr, ULONG* pulValue)
{
	if (pszEnvir = http_envir_get_string (pszEnvir, pszStr))
	{
		for (*pulValue = 0; *pszEnvir != 0; pszEnvir++)
		{
			if (*pszEnvir >= '0' && *pszEnvir <= '9')
				*pulValue = *pulValue * 10 + (*pszEnvir - '0');
			else
				return 0;
		}
		return 1;
	}
	return 0;
}

RESULT http_envir_get_hex (LPSTR pszEnvir, LPSTR pszStr, ULONG* pulValue)
{
	if (pszEnvir = http_envir_get_string (pszEnvir, pszStr))
	{
		char	c;

		for (*pulValue = 0; *pszEnvir != 0; pszEnvir++)
		{
			if (*pszEnvir >= '0' && *pszEnvir <= '9')
				*pulValue = (*pulValue << 4) + (*pszEnvir - '0');
			else
			{
				c = *pszEnvir | 0x20;
				if (c >= 'a' && c < 'z')
					*pulValue = (*pulValue << 4) + (c - 'a' + 10);
				else
					return 0;
			}
		}
		return 1;
	}
	return 0;
}

void http_update_modified_time (LPSTR pszHtml)
{
	int	i;

	if (pszHtml [0] == '/')
		i = 1;
	else
		i = 0;
	i = BinarySearch (&pszHtml [i], http_page_compare, web_page_table_total);
	if (i != -1)
		web_page_tables [i].pStat->st_mtime = time((time_t*) 0);
}

int http_parsing_content (LPSTR *ppszSource, LPSTR pszDest, INT *piTotal, ULONG ulLoop)
{
	LPSTR	pszSrce;
	int		total = 0;
	INT		mode;
	ULONG	ul;
	char	szKeyword [128];
	PHTML_VAR_TBL	pTbl;

	pszSrce = *ppszSource;

	if (*pszSrce == '#')
	{
		pszSrce = http_get_token (pszSrce, szKeyword);
		mode = BinarySearch (szKeyword, http_get_compare, web_get_table_total);
		if (mode != -1)
		{
			pTbl = &web_get_tables [mode];
			switch (pTbl->ulType)
			{
				case VarType_Decimal:
					if (ulLoop && pTbl->ulParam >= LOOP_BaseCount)
						mode = (int) pTbl->pfnVarGet (pTbl->ulParam - ulLoop);
					else
						mode = (int) pTbl->pfnVarGet (pTbl->ulParam);
					total += sprintf (pszDest, "%d", mode);
					break;

				case VarType_Hex:
					if (ulLoop && pTbl->ulParam >= LOOP_BaseCount)
						ul = pTbl->pfnVarGet (pTbl->ulParam - ulLoop);
					else
						ul = pTbl->pfnVarGet (pTbl->ulParam);
					total += sprintf (pszDest, "%x", ul);
					break;

				case VarType_String:
					if (ulLoop && pTbl->ulParam >= LOOP_BaseCount)
						total += (int) pTbl->pfnVarGet (pTbl->ulParam - ulLoop, pszDest);
					else
						total += (int) pTbl->pfnVarGet (pTbl->ulParam, pszDest);
					break;

				case VarType_Radio:
				case VarType_CheckBox:
					if (ulLoop && pTbl->ulParam >= LOOP_BaseCount)
						mode = (int) pTbl->pfnVarGet (pTbl->ulParam - ulLoop);
					else
						mode = (int) pTbl->pfnVarGet (pTbl->ulParam);
					if (mode != 0)
					{
						strcpy (pszDest, "checked");
						total += strlen ("checked");
					}
					break;

				case VarType_Option:
					// should implment later
					total += pTbl->pfnVarGet (pszDest);
					break;

				case VarType_IP:
					// should implment later
					ul = pTbl->pfnVarGet ();
					if (ul != 0)
					{
						switch (pTbl->ulParam)
						{
							case IP_Param1:
								ul = GetIP1 (ul);
								break;

							case IP_Param2:
								ul = GetIP2 (ul);
								break;

							case IP_Param3:
								ul = GetIP3 (ul);
								break;

							case IP_Param4:
								ul = GetIP4 (ul);
						}
						total += sprintf (pszDest, "%u", ul);
					}
					break;

				case VarType_IPString:
					ul = pTbl->pfnVarGet ();
					total += sprintf (pszDest, IPStringFormat, GetIP1 (ul), GetIP2 (ul),
									  GetIP3 (ul), GetIP4 (ul));
					break;

				case VarType_MacAddress:
					/*
					if (ulLoop && pTbl->ulParam >= LOOP_BaseCount)
						total += sprintf (pszDest, "%02x", pTbl->pfnVarGet (pTbl->ulParam - ulLoop));
					else
						total += sprintf (pszDest, "%02x", pTbl->pfnVarGet (pTbl->ulParam));
					*/
					if (ulLoop && pTbl->ulParam >= LOOP_BaseCount)
					{
						if ((pTbl->ulParam - LOOP_BaseCount) < MAC_Addr7)
							total += sprintf (pszDest, "%02x", pTbl->pfnVarGet (pTbl->ulParam - ulLoop));
						else
						{
							LPSTR	psz = (LPSTR) pTbl->pfnVarGet (pTbl->ulParam - LOOP_BaseCount);
							total += sprintf (pszDest, "%02x-%02x-%02x-%02x-%02x-%02x", psz [0],
											  psz [1], psz [2], psz [3], psz [4], psz [5]);
						}
					}
					else
						if (pTbl->ulParam < MAC_Addr7)
							total += sprintf (pszDest, "%02x", pTbl->pfnVarGet (pTbl->ulParam));
						else
						{
							LPSTR	psz = (LPSTR) pTbl->pfnVarGet (pTbl->ulParam);
							total += sprintf (pszDest, "%02x-%02x-%02x-%02x-%02x-%02x", psz [0],
											  psz [1], psz [2], psz [3], psz [4], psz [5]);
						}
					break;

				case VarType_Loop:
					total += pTbl->pfnVarGet (pTbl->ulItems, pszDest, &pszSrce, pTbl->ulParam);
					break;

				case VarType_CustomLoop:
					// not implemented now
					break;
			}
			*ppszSource = pszSrce;
			*piTotal += total;

			return TRUE;
		}
	}
	return FALSE;
}

ULONG http_loop_continue (LPSTR *ppszHtml, ULONG ulLoop)
{
	ULONG	ulRet = 0;
	char	szKeyword [128];
	int		mode;
	PHTML_VAR_TBL	pTbl;
	LPSTR	pszHtml = *ppszHtml;

	for (; *pszHtml != '#' && *pszHtml != '\n'; pszHtml++);
	if (*pszHtml == '#')
	{
		pszHtml = http_get_token (pszHtml, szKeyword);
		mode = BinarySearch (szKeyword, http_get_compare, web_get_table_total);
		if (mode != -1)
		{
			pTbl = &web_get_tables [mode];
			if (pTbl->ulType == VarType_LoopDone)
			{
				ulRet = pTbl->pfnVarGet (pTbl->ulParam - ulLoop);
				for (; *pszHtml != '\n'; pszHtml++);
				*ppszHtml = pszHtml + 1;
			}
		}
	}
	return ulRet;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -